@Override public void visit( Subquery subquery ) { subqueries.add(subquery); if (includeNestedSubqueries) { // Now look for any subqueries in the subquery ... subquery.getQuery().accept(this); } } });
@Override public void visit( Subquery subquery ) { subqueries.add(subquery); if (includeNestedSubqueries) { // Now look for any subqueries in the subquery ... subquery.getQuery().accept(this); } } });
@Override public void visit( Subquery subquery ) { append('('); subquery.getQuery().accept(this); append(')'); }
@Override public void visit( Subquery subquery ) { strategy.visit(subquery); enqueue(subquery.getQuery()); visitNext(); }
@Override public void visit( Subquery subquery ) { strategy.visit(subquery); enqueue(subquery.getQuery()); visitNext(); }
@Override public void visit( Subquery subquery ) { append('('); subquery.getQuery().accept(this); append(')'); }
/** * Attach plan nodes for each subquery, resulting with the first subquery at the top of the plan tree. * * @param context the context in which the query is being planned * @param plan the existing plan * @param subqueriesByVariableName the queries by the variable name used in substitution * @return the updated plan, or the existing plan if there were no limits */ protected PlanNode attachSubqueries( QueryContext context, PlanNode plan, Map<String, Subquery> subqueriesByVariableName ) { // Order the variable names in reverse order ... List<String> varNames = new ArrayList<String>(subqueriesByVariableName.keySet()); Collections.sort(varNames); Collections.reverse(varNames); for (String varName : varNames) { Subquery subquery = subqueriesByVariableName.get(varName); // Plan out the subquery ... PlanNode subqueryNode = createPlan(context, subquery.getQuery()); setSubqueryVariableName(subqueryNode, varName); // Create a DEPENDENT_QUERY node, with the subquery on the LHS (so it is executed first) ... PlanNode depQuery = new PlanNode(Type.DEPENDENT_QUERY); depQuery.addChildren(subqueryNode, plan); depQuery.addSelectors(subqueryNode.getSelectors()); depQuery.addSelectors(plan.getSelectors()); plan = depQuery; } return plan; }
/** * Attach plan nodes for each subquery, resulting with the first subquery at the top of the plan tree. * * @param context the context in which the query is being planned * @param plan the existing plan * @param subqueriesByVariableName the queries by the variable name used in substitution * @return the updated plan, or the existing plan if there were no limits */ protected PlanNode attachSubqueries( QueryContext context, PlanNode plan, Map<String, Subquery> subqueriesByVariableName ) { // Order the variable names in reverse order ... List<String> varNames = new ArrayList<String>(subqueriesByVariableName.keySet()); Collections.sort(varNames); Collections.reverse(varNames); for (String varName : varNames) { Subquery subquery = subqueriesByVariableName.get(varName); // Plan out the subquery ... PlanNode subqueryNode = createPlan(context, subquery.getQuery()); setSubqueryVariableName(subqueryNode, varName); // Create a DEPENDENT_QUERY node, with the subquery on the LHS (so it is executed first) ... PlanNode depQuery = new PlanNode(Type.DEPENDENT_QUERY); depQuery.addChildren(subqueryNode, plan); depQuery.addSelectors(subqueryNode.getSelectors()); depQuery.addSelectors(plan.getSelectors()); plan = depQuery; } return plan; }
@FixFor( "MODE-869" ) @Test public void shouldParseStaticOperandWithSubqueryWithoutConsumingExtraTokens() { QueryCommand expected = parser.parseQuery(tokens("SELECT * FROM tableA"), typeSystem); TokenStream tokens = tokens("SELECT * FROM tableA)"); StaticOperand operand = parser.parseStaticOperand(tokens, typeSystem); assertThat(operand, is(instanceOf(Subquery.class))); Subquery subquery = (Subquery)operand; assertThat(subquery.getQuery(), is(expected)); assertThat(tokens.canConsume(')'), is(true)); }
@FixFor( "MODE-869" ) @Test public void shouldParseStaticOperandWithSubquery() { QueryCommand expected = parser.parseQuery(tokens("SELECT * FROM tableA"), typeSystem); StaticOperand operand = parser.parseStaticOperand(tokens("SELECT * FROM tableA"), typeSystem); assertThat(operand, is(instanceOf(Subquery.class))); Subquery subquery = (Subquery)operand; assertThat(subquery.getQuery(), is(expected)); }
createPlan(context, subquery.getQuery());
createPlan(context, subquery.getQuery());