@Override public Void visitApply(ApplyNode node, ImmutableList.Builder<Expression> context) { context.addAll(node.getSubqueryAssignments().getExpressions()); return super.visitApply(node, context); } }
@Override public Void visitApply(ApplyNode node, ImmutableList.Builder<Expression> context) { context.addAll(node.getSubqueryAssignments().getExpressions()); return super.visitApply(node, context); } }
@Override public PlanNode visitApply(ApplyNode node, RewriteContext<PlanNode> context) { if (node.getSubqueryAssignments().size() != 1) { return context.defaultRewrite(node); } Expression expression = getOnlyElement(node.getSubqueryAssignments().getExpressions()); if (!(expression instanceof QuantifiedComparisonExpression)) { return context.defaultRewrite(node); } QuantifiedComparisonExpression quantifiedComparison = (QuantifiedComparisonExpression) expression; return rewriteQuantifiedApplyNode(node, quantifiedComparison, context); }
@Override public PlanNode visitApply(ApplyNode node, RewriteContext<PlanNode> context) { if (node.getSubqueryAssignments().size() != 1) { return context.defaultRewrite(node); } Expression expression = getOnlyElement(node.getSubqueryAssignments().getExpressions()); if (!(expression instanceof QuantifiedComparisonExpression)) { return context.defaultRewrite(node); } QuantifiedComparisonExpression quantifiedComparison = (QuantifiedComparisonExpression) expression; return rewriteQuantifiedApplyNode(node, quantifiedComparison, context); }
@Override public Result apply(ApplyNode parent, Captures captures, Context context) { if (parent.getSubqueryAssignments().size() != 1) { return Result.empty(); } Expression expression = getOnlyElement(parent.getSubqueryAssignments().getExpressions()); if (!(expression instanceof ExistsPredicate)) { return Result.empty(); } Optional<PlanNode> nonDefaultAggregation = rewriteToNonDefaultAggregation(parent, context); return nonDefaultAggregation .map(Result::ofPlanNode) .orElseGet(() -> Result.ofPlanNode(rewriteToDefaultAggregation(parent, context))); }
@Override public Result apply(ApplyNode parent, Captures captures, Context context) { if (parent.getSubqueryAssignments().size() != 1) { return Result.empty(); } Expression expression = getOnlyElement(parent.getSubqueryAssignments().getExpressions()); if (!(expression instanceof ExistsPredicate)) { return Result.empty(); } Optional<PlanNode> nonDefaultAggregation = rewriteToNonDefaultAggregation(parent, context); return nonDefaultAggregation .map(Result::ofPlanNode) .orElseGet(() -> Result.ofPlanNode(rewriteToDefaultAggregation(parent, context))); }
public static Function<PlanNode, Set<Symbol>> actualSubqueryAssignments() { return node -> ((ApplyNode) node).getSubqueryAssignments().getSymbols(); }
public static Function<PlanNode, Set<Symbol>> actualSubqueryAssignments() { return node -> ((ApplyNode) node).getSubqueryAssignments().getSymbols(); }
@Override public Void visitApply(ApplyNode node, Set<Symbol> boundSymbols) { Set<Symbol> subqueryCorrelation = ImmutableSet.<Symbol>builder() .addAll(boundSymbols) .addAll(node.getCorrelation()) .build(); node.getInput().accept(this, boundSymbols); // visit child node.getSubquery().accept(this, subqueryCorrelation); // visit child checkDependencies(node.getInput().getOutputSymbols(), node.getCorrelation(), "APPLY input must provide all the necessary correlation symbols for subquery"); checkDependencies(SymbolsExtractor.extractUnique(node.getSubquery()), node.getCorrelation(), "not all APPLY correlation symbols are used in subquery"); ImmutableSet<Symbol> inputs = ImmutableSet.<Symbol>builder() .addAll(createInputs(node.getSubquery(), boundSymbols)) .addAll(createInputs(node.getInput(), boundSymbols)) .build(); for (Expression expression : node.getSubqueryAssignments().getExpressions()) { Set<Symbol> dependencies = SymbolsExtractor.extractUnique(expression); checkDependencies(inputs, dependencies, "Invalid node. Expression dependencies (%s) not in source plan output (%s)", dependencies, inputs); } return null; }
@Override public Result apply(ApplyNode apply, Captures captures, Context context) { Assignments subqueryAssignments = apply.getSubqueryAssignments(); if (subqueryAssignments.size() != 1) { return Result.empty(); } Expression assignmentExpression = getOnlyElement(subqueryAssignments.getExpressions()); if (!(assignmentExpression instanceof InPredicate)) { return Result.empty(); } InPredicate inPredicate = (InPredicate) assignmentExpression; Symbol inPredicateOutputSymbol = getOnlyElement(subqueryAssignments.getSymbols()); return apply(apply, inPredicate, inPredicateOutputSymbol, context.getLookup(), context.getIdAllocator(), context.getSymbolAllocator()); }
@Override public Result apply(ApplyNode apply, Captures captures, Context context) { Assignments subqueryAssignments = apply.getSubqueryAssignments(); if (subqueryAssignments.size() != 1) { return Result.empty(); } Expression assignmentExpression = getOnlyElement(subqueryAssignments.getExpressions()); if (!(assignmentExpression instanceof InPredicate)) { return Result.empty(); } InPredicate inPredicate = (InPredicate) assignmentExpression; Symbol inPredicateOutputSymbol = getOnlyElement(subqueryAssignments.getSymbols()); return apply(apply, inPredicate, inPredicateOutputSymbol, context.getLookup(), context.getIdAllocator(), context.getSymbolAllocator()); }
@Override public Result apply(ApplyNode applyNode, Captures captures, Context context) { Assignments subqueryAssignments = applyNode.getSubqueryAssignments().rewrite(x -> rewriter.rewrite(x, context)); if (applyNode.getSubqueryAssignments().equals(subqueryAssignments)) { return Result.empty(); } return Result.ofPlanNode(new ApplyNode( applyNode.getId(), applyNode.getInput(), applyNode.getSubquery(), subqueryAssignments, applyNode.getCorrelation(), applyNode.getOriginSubquery())); } }
@Override public PlanNode visitApply(ApplyNode node, RewriteContext<Void> context) { PlanNode source = context.rewrite(node.getInput()); PlanNode subquery = context.rewrite(node.getSubquery()); List<Symbol> canonicalCorrelation = Lists.transform(node.getCorrelation(), this::canonicalize); return new ApplyNode(node.getId(), source, subquery, canonicalize(node.getSubqueryAssignments()), canonicalCorrelation, node.getOriginSubquery()); }
@Override public PlanNode visitApply(ApplyNode node, RewriteContext<Void> context) { PlanNode source = context.rewrite(node.getInput()); PlanNode subquery = context.rewrite(node.getSubquery()); List<Symbol> canonicalCorrelation = Lists.transform(node.getCorrelation(), this::canonicalize); return new ApplyNode(node.getId(), source, subquery, canonicalize(node.getSubqueryAssignments()), canonicalCorrelation, node.getOriginSubquery()); }
@Override public Result apply(ApplyNode applyNode, Captures captures, Context context) { Assignments subqueryAssignments = applyNode.getSubqueryAssignments().rewrite(x -> rewriter.rewrite(x, context)); if (applyNode.getSubqueryAssignments().equals(subqueryAssignments)) { return Result.empty(); } return Result.ofPlanNode(new ApplyNode( applyNode.getId(), applyNode.getInput(), applyNode.getSubquery(), subqueryAssignments, applyNode.getCorrelation(), applyNode.getOriginSubquery())); } }
@Override public Void visitApply(ApplyNode node, Integer indent) { print(indent, "- Apply[%s] => [%s]", node.getCorrelation(), formatOutputs(node.getOutputSymbols())); printPlanNodesStatsAndCost(indent + 2, node); printStats(indent + 2, node.getId()); printAssignments(node.getSubqueryAssignments(), indent + 4); return processChildren(node, indent + 1); }
@Override public Void visitApply(ApplyNode node, Integer indent) { print(indent, "- Apply[%s] => [%s]", node.getCorrelation(), formatOutputs(node.getOutputSymbols())); printPlanNodesStatsAndCost(indent + 2, node); printStats(indent + 2, node.getId()); printAssignments(node.getSubqueryAssignments(), indent + 4); return processChildren(node, indent + 1); }
private static Map<Symbol, Expression> getAssignments(PlanNode node) { if (node instanceof ProjectNode) { ProjectNode projectNode = (ProjectNode) node; return projectNode.getAssignments().getMap(); } else if (node instanceof ApplyNode) { ApplyNode applyNode = (ApplyNode) node; return applyNode.getSubqueryAssignments().getMap(); } else { return null; } }
private static Map<Symbol, Expression> getAssignments(PlanNode node) { if (node instanceof ProjectNode) { ProjectNode projectNode = (ProjectNode) node; return projectNode.getAssignments().getMap(); } else if (node instanceof ApplyNode) { ApplyNode applyNode = (ApplyNode) node; return applyNode.getSubqueryAssignments().getMap(); } else { return null; } }
private PlanNode rewriteToDefaultAggregation(ApplyNode parent, Context context) { Symbol count = context.getSymbolAllocator().newSymbol(COUNT.toString(), BIGINT); Symbol exists = getOnlyElement(parent.getSubqueryAssignments().getSymbols()); return new LateralJoinNode( parent.getId(), parent.getInput(), new ProjectNode( context.getIdAllocator().getNextId(), new AggregationNode( context.getIdAllocator().getNextId(), parent.getSubquery(), ImmutableMap.of(count, new Aggregation(COUNT_CALL, countSignature, Optional.empty())), globalAggregation(), ImmutableList.of(), AggregationNode.Step.SINGLE, Optional.empty(), Optional.empty()), Assignments.of(exists, new ComparisonExpression(GREATER_THAN, count.toSymbolReference(), new Cast(new LongLiteral("0"), BIGINT.toString())))), parent.getCorrelation(), INNER, parent.getOriginSubquery()); } }