@Override public Expression getBody() { return query.getBody(); }
@Override public List<Expression> getDirectlyEnclosedExpressions() { List<Expression> topLevelExpressions = new ArrayList<>(); topLevelExpressions.add(query.getBody()); if (returnExpression != null) { topLevelExpressions.add(returnExpression); } return topLevelExpressions; }
@Override public Pair<ILogicalOperator, LogicalVariable> visit(Query q, Mutable<ILogicalOperator> tupSource) throws CompilationException { return q.getBody().accept(this, tupSource); }
@Override public Pair<ILogicalOperator, LogicalVariable> visit(Query q, Mutable<ILogicalOperator> tupSource) throws CompilationException { return q.getBody().accept(this, tupSource); }
@Override public Void visit(Query q, Collection<VariableExpr> freeVars) throws CompilationException { q.getBody().accept(this, freeVars); return null; }
@Override public Void visit(Query q, Void arg) throws CompilationException { q.getBody().accept(this, arg); return null; }
@Override public Boolean visit(Query q, ILangExpression arg) throws CompilationException { return visit(q.getBody(), arg); }
@Override public Expression visit(Query q, ILangExpression arg) throws CompilationException { q.setBody(visit(q.getBody(), q)); return null; }
@Override public Expression visit(Query q, ILangExpression arg) throws CompilationException { q.setBody(visit(q.getBody(), q)); return null; }
@Override public Boolean visit(Query q, List<FunctionDecl> arg) throws CompilationException { Pair<Boolean, Expression> p = inlineUdfsInExpr(q.getBody(), arg); q.setBody(p.second); return p.first; }
@Override public Void visit(Query q, Integer step) throws CompilationException { Expression expr = q.getBody(); if (expr != null) { if (expr.getKind() != Kind.FLWOGR_EXPRESSION) { out.print("select element "); expr.accept(this, step + 2); } else { expr.accept(this, step); } } if (q.isTopLevel()) { out.println(SEMICOLON); } return null; }
@Override public Expression visit(Query q, ILangExpression arg) throws CompilationException { q.setBody(visit(q.getBody(), q)); q.setVarCounter(scopeChecker.getVarCounter()); return null; }
protected ResultUtil.ParseOnlyResult parseStatement(String statementsText) throws CompilationException { IParserFactory factory = compilationProvider.getParserFactory(); IParser parser = factory.createParser(statementsText); List<Statement> stmts = parser.parse(); QueryTranslator.validateStatements(stmts); Query query = (Query) stmts.get(stmts.size() - 1); Set<VariableExpr> extVars = compilationProvider.getRewriterFactory().createQueryRewriter().getExternalVariables(query.getBody()); ResultUtil.ParseOnlyResult parseOnlyResult = new ResultUtil.ParseOnlyResult(extVars); return parseOnlyResult; }
/** * Substitutes expression with replacement expressions according to the exprMap. * * @param expression * , * an input expression. * @param exprMap * a map that maps expressions to their corresponding replacement expressions. * @return an expression, where sub-expressions of the input expression (including the input expression itself) * are replaced with deep copies with their mapped replacements in the exprMap if there exists such a * replacement expression. * @throws CompilationException */ public static Expression substituteExpression(Expression expression, Map<Expression, Expression> exprMap, LangRewritingContext context) throws CompilationException { if (exprMap.isEmpty()) { return expression; } // Creates a wrapper query for the expression so that if the expression itself // is the key, it can also be replaced. Query wrapper = new Query(false); wrapper.setSourceLocation(expression.getSourceLocation()); wrapper.setBody(expression); // Creates a substitution visitor. SqlppSubstituteExpressionVisitor visitor = new SqlppSubstituteExpressionVisitor(context, exprMap); wrapper.accept(visitor, wrapper); return wrapper.getBody(); } }
@Override public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(Query q, VariableSubstitutionEnvironment env) throws CompilationException { Query newQ = new Query(q.isExplain()); Pair<ILangExpression, VariableSubstitutionEnvironment> p1 = q.getBody().accept(this, env); newQ.setBody((Expression) p1.first); newQ.setSourceLocation(q.getSourceLocation()); return new Pair<>(newQ, p1.second); }
@Override public Query visit(Query q, Void arg) throws CompilationException { Query copy = new Query(q.isExplain(), q.isTopLevel(), (Expression) q.getBody().accept(this, arg), q.getVarCounter()); copy.setSourceLocation(q.getSourceLocation()); return copy; }
@Override public Pair<ILogicalOperator, LogicalVariable> visit(Query q, Mutable<ILogicalOperator> tupSource) throws CompilationException { Expression queryBody = q.getBody(); SourceLocation sourceLoc = queryBody.getSourceLocation(); if (queryBody.getKind() == Kind.SELECT_EXPRESSION) { SelectExpression selectExpr = (SelectExpression) queryBody; if (q.isTopLevel()) { selectExpr.setSubquery(false); } return queryBody.accept(this, tupSource); } else { LogicalVariable var = context.newVar(); Pair<ILogicalExpression, Mutable<ILogicalOperator>> eo = langExprToAlgExpression(queryBody, tupSource); AssignOperator assignOp = new AssignOperator(var, new MutableObject<>(eo.first)); assignOp.getInputs().add(eo.second); assignOp.setSourceLocation(sourceLoc); ProjectOperator projectOp = new ProjectOperator(var); projectOp.getInputs().add(new MutableObject<>(assignOp)); projectOp.setSourceLocation(sourceLoc); return new Pair<>(projectOp, var); } }
private Expression rewriteFunctionBody(FunctionDecl fnDecl) throws CompilationException { SourceLocation sourceLoc = fnDecl.getSourceLocation(); Query wrappedQuery = new Query(false); wrappedQuery.setSourceLocation(sourceLoc); wrappedQuery.setBody(fnDecl.getFuncBody()); wrappedQuery.setTopLevel(false); String fnNamespace = fnDecl.getSignature().getNamespace(); Dataverse defaultDataverse = metadataProvider.getDefaultDataverse(); Dataverse fnDataverse; if (fnNamespace == null || fnNamespace.equals(defaultDataverse.getDataverseName())) { fnDataverse = defaultDataverse; } else { try { fnDataverse = metadataProvider.findDataverse(fnNamespace); } catch (AlgebricksException e) { throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, e, sourceLoc, fnNamespace); } } metadataProvider.setDefaultDataverse(fnDataverse); try { IQueryRewriter queryRewriter = rewriterFactory.createQueryRewriter(); queryRewriter.rewrite(declaredFunctions, wrappedQuery, metadataProvider, context, true, fnDecl.getParamList()); return wrappedQuery.getBody(); } finally { metadataProvider.setDefaultDataverse(defaultDataverse); } }