private PlanBuilder appendApplyNode(
PlanBuilder subPlan,
Node subquery,
PlanNode subqueryNode,
Assignments subqueryAssignments,
boolean correlationAllowed)
{
Map<Expression, Expression> correlation = extractCorrelation(subPlan, subqueryNode);
if (!correlationAllowed && !correlation.isEmpty()) {
throw notSupportedException(subquery, "Correlated subquery in given context");
}
subPlan = subPlan.appendProjections(correlation.keySet(), symbolAllocator, idAllocator);
subqueryNode = replaceExpressionsWithSymbols(subqueryNode, correlation);
TranslationMap translations = subPlan.copyTranslations();
PlanNode root = subPlan.getRoot();
return new PlanBuilder(translations,
new ApplyNode(idAllocator.getNextId(),
root,
subqueryNode,
subqueryAssignments,
ImmutableList.copyOf(SymbolsExtractor.extractUnique(correlation.values())),
subquery),
analysis.getParameters());
}