in asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PostCanonicalExpansionVisitor.java [83:147]
public Expression visit(SelectExpression selectExpression, ILangExpression arg) throws CompilationException {
VariableExpr iterationVariable = graphixRewritingContext.getGraphixVariableCopy("_Containing");
// Modify the involved SELECT-CLAUSEs to output our user-live variables and remove any GROUP-BY clauses.
selectExpression.getSelectSetOperation().accept(this, arg);
FromTerm fromTerm = new FromTerm(selectExpression, iterationVariable, null, null);
FromClause fromClause = new FromClause(List.of(fromTerm));
fromTerm.setSourceLocation(selectExpression.getSourceLocation());
fromClause.setSourceLocation(selectExpression.getSourceLocation());
// Qualify the SELECT-CLAUSE given to us by our caller.
qualifyingVisitor.qualifyingVar = deepCopyVisitor.visit(iterationVariable, null);
SelectClause selectClause = selectBlockExpansionSource.getSelectClause();
selectClause.accept(qualifyingVisitor, null);
// Modify our output modifiers (if any) to qualify them with our output variable.
OrderbyClause orderByClause = selectExpression.getOrderbyClause();
LimitClause limitClause = selectExpression.getLimitClause();
if (selectExpression.hasOrderby()) {
orderByClause.accept(qualifyingVisitor, null);
}
if (selectExpression.hasLimit()) {
limitClause.accept(qualifyingVisitor, null);
}
// Remove the output modifiers from our current SELECT-EXPR.
boolean isSubquery = selectExpression.isSubquery();
selectExpression.setLimitClause(null);
selectExpression.setOrderbyClause(null);
selectExpression.setSubquery(true);
// Modify our GROUP-BY (if any) to qualify them with our output variable.
GroupbyClause groupbyClause = selectBlockExpansionSource.getGroupbyClause();
List<AbstractClause> letHavingClausesAfterGby = selectBlockExpansionSource.getLetHavingListAfterGroupby();
if (selectBlockExpansionSource.hasGroupbyClause()) {
groupbyClause.accept(qualifyingVisitor, null);
// Ensure that any variables that may be used after the GROUP-BY don't see this qualifying variable.
List<Pair<Expression, Identifier>> newGroupFieldList = new ArrayList<>();
for (Pair<Expression, Identifier> expressionIdentifierPair : groupbyClause.getGroupFieldList()) {
Expression newExpression = expressionIdentifierPair.first.accept(qualifyingVisitor, null);
newGroupFieldList.add(new Pair<>(newExpression, expressionIdentifierPair.second));
}
VariableExpr iterationVariableCopy = deepCopyVisitor.visit(iterationVariable, null);
newGroupFieldList.add(new Pair<>(iterationVariableCopy, iterationVariable.getVar()));
groupbyClause.setGroupFieldList(newGroupFieldList);
}
if (selectBlockExpansionSource.hasLetHavingClausesAfterGroupby()) {
for (AbstractClause abstractClause : letHavingClausesAfterGby) {
abstractClause.accept(qualifyingVisitor, null);
}
}
// Finalize our post-canonicalization: attach our SELECT-CLAUSE, GROUP-BY, output modifiers...
SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, null, groupbyClause, null);
selectBlock.getLetHavingListAfterGroupby().addAll(letHavingClausesAfterGby);
selectBlock.setSourceLocation(selectBlockExpansionSource.getSourceLocation());
SetOperationInput setOperationInput = new SetOperationInput(selectBlock, null);
SelectSetOperation selectSetOperation = new SelectSetOperation(setOperationInput, null);
selectSetOperation.setSourceLocation(selectBlockExpansionSource.getSourceLocation());
SelectExpression newSelectExpression =
new SelectExpression(null, selectSetOperation, orderByClause, limitClause, isSubquery);
newSelectExpression.setSourceLocation(selectExpression.getSourceLocation());
return newSelectExpression;
}