@Override public Boolean visit(FromClause fromClause, ILangExpression arg) throws CompilationException { for (FromTerm fromTerm : fromClause.getFromTerms()) { if (fromTerm.accept(this, arg)) { return false; } } return true; }
@Override public Void visit(FromClause fromClause, Void arg) throws CompilationException { for (FromTerm fromTerm : fromClause.getFromTerms()) { fromTerm.accept(this, arg); } return null; }
@Override public Boolean visit(FromClause fromClause, List<FunctionDecl> func) throws CompilationException { boolean changed = false; for (FromTerm fromTerm : fromClause.getFromTerms()) { changed |= fromTerm.accept(this, func); } return changed; }
@Override public Void visit(FromClause fromClause, Collection<VariableExpr> freeVars) throws CompilationException { Collection<VariableExpr> bindingVars = new HashSet<>(); for (FromTerm fromTerm : fromClause.getFromTerms()) { Collection<VariableExpr> fromTermFreeVars = new HashSet<>(); fromTerm.accept(this, fromTermFreeVars); // Since a right from term can refer to variables defined in a left from term, // we remove binding variables from the free variables. fromTermFreeVars.removeAll(bindingVars); // Adds binding variables. bindingVars.addAll(SqlppVariableUtil.getBindingVariables(fromTerm)); // Adds into freeVars. freeVars.addAll(fromTermFreeVars); } return null; }
@Override public Void visit(FromClause fromClause, Integer step) throws CompilationException { out.print(skip(step) + "FROM ["); int index = 0; for (FromTerm fromTerm : fromClause.getFromTerms()) { if (index > 0) { out.println(","); } fromTerm.accept(this, step + 1); ++index; } out.println(skip(step) + "]"); return null; }
@Override public Void visit(FromClause fromClause, Integer step) throws CompilationException { out.print(skip(step) + "from "); int index = 0; for (FromTerm fromTerm : fromClause.getFromTerms()) { if (index > 0) { out.print(COMMA + "\n" + skip(step + 2)); } fromTerm.accept(this, step + 2); ++index; } out.println(); return null; }
@Override public Pair<ILogicalOperator, LogicalVariable> visit(FromClause fromClause, Mutable<ILogicalOperator> arg) throws CompilationException { Mutable<ILogicalOperator> inputSrc = arg; Pair<ILogicalOperator, LogicalVariable> topUnnest = null; for (FromTerm fromTerm : fromClause.getFromTerms()) { topUnnest = fromTerm.accept(this, inputSrc); inputSrc = new MutableObject<>(topUnnest.first); } return topUnnest; }
@Override public FromClause visit(FromClause fromClause, Void arg) throws CompilationException { List<FromTerm> fromTerms = new ArrayList<>(); for (FromTerm fromTerm : fromClause.getFromTerms()) { fromTerms.add((FromTerm) fromTerm.accept(this, arg)); } FromClause copy = new FromClause(fromTerms); copy.setSourceLocation(fromClause.getSourceLocation()); return copy; }
@Override public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(FromClause fromClause, VariableSubstitutionEnvironment env) throws CompilationException { VariableSubstitutionEnvironment currentEnv = new VariableSubstitutionEnvironment(env); List<FromTerm> newFromTerms = new ArrayList<>(); for (FromTerm fromTerm : fromClause.getFromTerms()) { Pair<ILangExpression, VariableSubstitutionEnvironment> p = fromTerm.accept(this, currentEnv); newFromTerms.add((FromTerm) p.first); // A right from term could be correlated from a left from term, // therefore we propagate the substitution environment. currentEnv = p.second; } FromClause newFromClause = new FromClause(newFromTerms); newFromClause.setSourceLocation(fromClause.getSourceLocation()); return new Pair<>(newFromClause, currentEnv); }
@Override public Expression visit(FromClause fromClause, ILangExpression arg) throws CompilationException { Scope scopeForFromClause = scopeChecker.extendCurrentScope(); for (FromTerm fromTerm : fromClause.getFromTerms()) { fromTerm.accept(this, fromClause); // Merges the variables defined in the current from term into the scope of the current from clause. Scope scopeForFromTerm = scopeChecker.removeCurrentScope(); mergeScopes(scopeForFromClause, scopeForFromTerm, fromTerm.getSourceLocation()); } return null; }