public Expression visit()

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;
    }