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