public Void freeVariableDispatch()

in asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/extension/LowerListClauseExtension.java [82:148]


    public Void freeVariableDispatch(ILangVisitor<Void, Collection<VariableExpr>> freeVariableVisitor,
            Collection<VariableExpr> freeVariables) throws CompilationException {
        Collection<VariableExpr> bindingVariables = new HashSet<>();
        Collection<VariableExpr> clauseFreeVariables = new HashSet<>();
        for (AbstractClause workingClause : clauseCollection) {
            clauseFreeVariables.clear();
            switch (workingClause.getClauseType()) {
                case LET_CLAUSE:
                    LetClause letClause = (LetClause) workingClause;
                    letClause.getBindingExpr().accept(freeVariableVisitor, clauseFreeVariables);
                    clauseFreeVariables.removeAll(bindingVariables);
                    freeVariables.addAll(clauseFreeVariables);
                    bindingVariables.add(letClause.getVarExpr());
                    break;

                case UNNEST_CLAUSE:
                    UnnestClause unnestClause = (UnnestClause) workingClause;
                    unnestClause.getRightExpression().accept(freeVariableVisitor, clauseFreeVariables);
                    clauseFreeVariables.removeAll(bindingVariables);
                    freeVariables.addAll(clauseFreeVariables);
                    bindingVariables.add(unnestClause.getRightVariable());
                    if (unnestClause.hasPositionalVariable()) {
                        bindingVariables.add(unnestClause.getPositionalVariable());
                    }
                    break;

                case JOIN_CLAUSE:
                    JoinClause joinClause = (JoinClause) workingClause;
                    joinClause.getRightExpression().accept(freeVariableVisitor, clauseFreeVariables);
                    clauseFreeVariables.removeAll(bindingVariables);
                    freeVariables.addAll(clauseFreeVariables);

                    // Handle our condition expression, which can reference its right variable.
                    Collection<VariableExpr> conditionFreeVariables = new HashSet<>();
                    joinClause.getConditionExpression().accept(freeVariableVisitor, conditionFreeVariables);
                    conditionFreeVariables.removeAll(bindingVariables);
                    conditionFreeVariables.remove(joinClause.getRightVariable());
                    bindingVariables.add(joinClause.getRightVariable());
                    if (joinClause.hasPositionalVariable()) {
                        conditionFreeVariables.remove(joinClause.getPositionalVariable());
                        bindingVariables.add(joinClause.getPositionalVariable());
                    }
                    freeVariables.addAll(conditionFreeVariables);
                    break;

                case WHERE_CLAUSE:
                    WhereClause whereClause = (WhereClause) workingClause;
                    whereClause.getWhereExpr().accept(freeVariableVisitor, clauseFreeVariables);
                    clauseFreeVariables.removeAll(bindingVariables);
                    freeVariables.addAll(clauseFreeVariables);
                    break;

                case EXTENSION:
                    if (workingClause instanceof LowerSwitchClause) {
                        LowerSwitchClause lowerSwitchClause = (LowerSwitchClause) workingClause;
                        IVisitorExtension visitorExtension = lowerSwitchClause.getVisitorExtension();
                        visitorExtension.freeVariableDispatch(freeVariableVisitor, freeVariables);
                        break;
                    }

                default:
                    throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
                            "Illegal clause found in the lower clause list!");
            }
        }
        return null;
    }