final public LetClause LetElement() throws ParseException, ParseException { VariableExpr varExp; Expression beExp; extendCurrentScope(); varExp = Variable(); jj_consume_token(EQ); beExp = Expression(); LetClause lc = new LetClause(varExp, beExp); lc.setSourceLocation(varExp.getSourceLocation()); {if (true) return lc;} throw new Error("Missing return statement in function"); }
final public LetClause WithElement() throws ParseException, ParseException { VariableExpr varExp; Expression beExp; extendCurrentScope(); varExp = Variable(); jj_consume_token(AS); beExp = Expression(); LetClause lc = new LetClause(varExp, beExp); lc.setSourceLocation(varExp.getSourceLocation()); {if (true) return lc;} throw new Error("Missing return statement in function"); }
@Override public LetClause visit(LetClause letClause, Void arg) throws CompilationException { LetClause copy = new LetClause((VariableExpr) letClause.getVarExpr().accept(this, arg), (Expression) letClause.getBindingExpr().accept(this, arg)); copy.setSourceLocation(letClause.getSourceLocation()); return copy; }
private void introduceLetClauses(Map<Expression, VarIdentifier> letVarMap, Map<Expression, ColumnAliasBinding> aliasBindingMap, SelectBlock selectBlock) throws CompilationException { List<AbstractClause> targetLetClauses = selectBlock.hasGroupbyClause() ? selectBlock.getLetHavingListAfterGroupby() : selectBlock.getLetWhereList(); for (Map.Entry<Expression, VarIdentifier> me : letVarMap.entrySet()) { Expression columnAliasVarExpr = me.getKey(); SourceLocation sourceLoc = columnAliasVarExpr.getSourceLocation(); ColumnAliasBinding columnAliasBinding = aliasBindingMap.get(columnAliasVarExpr); if (columnAliasBinding == null) { throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, sourceLoc); } VarIdentifier letVarId = me.getValue(); // add a let clause defining the new variable VariableExpr letVarDefExpr = new VariableExpr(letVarId); letVarDefExpr.setSourceLocation(sourceLoc); LetClause newLetClause = new LetClause(letVarDefExpr, columnAliasBinding.getExpression()); newLetClause.setSourceLocation(sourceLoc); targetLetClauses.add(newLetClause); // replace original column alias expression with variable reference VariableExpr letVarRefExpr = new VariableExpr(letVarId); letVarRefExpr.setSourceLocation(sourceLoc); columnAliasBinding.setExpression(letVarRefExpr); context.addExcludedForFieldAccessVar(letVarId); } }
@Override public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(LetClause lc, VariableSubstitutionEnvironment env) throws CompilationException { Pair<ILangExpression, VariableSubstitutionEnvironment> p1 = lc.getBindingExpr().accept(this, env); VariableExpr varExpr = lc.getVarExpr(); VariableExpr newVe = generateNewVariable(context, varExpr); LetClause newLet = new LetClause(newVe, (Expression) p1.first); newLet.setSourceLocation(lc.getSourceLocation()); return new Pair<>(newLet, VariableCloneAndSubstitutionUtil.eliminateSubstFromList(lc.getVarExpr(), env)); }
newVRef1.setSourceLocation(sourceLoc); LetClause c = new LetClause(newVRef1, (Expression) p1.first); c.setSourceLocation(sourceLoc); clauses.add(c); VariableExpr newVRef2 = new VariableExpr(newV);