Skip to content

Commit

Permalink
TEIID-3993 fixing issue with union planning
Browse files Browse the repository at this point in the history
  • Loading branch information
shawkins committed Feb 25, 2016
1 parent 6f7828f commit d6714bc
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 7 deletions.
Expand Up @@ -1117,7 +1117,7 @@ PlanNode createStoredProcedurePlan(StoredProcedure storedProc) throws QueryMetad
return projectNode;
}

PlanNode createQueryPlan(QueryCommand command, OrderBy parentOrderBy)
PlanNode createQueryPlan(QueryCommand command, List<OrderBy> parentOrderBys)
throws TeiidComponentException, TeiidProcessingException {
//plan with
List<WithQueryCommand> withList = command.getWith();
Expand All @@ -1128,13 +1128,23 @@ PlanNode createQueryPlan(QueryCommand command, OrderBy parentOrderBy)
// Build canonical plan
PlanNode node = null;
if(command instanceof Query) {
node = createQueryPlan((Query) command, parentOrderBy);
node = createQueryPlan((Query) command, parentOrderBys);
} else {
hints.hasSetQuery = true;
SetQuery query = (SetQuery)command;
SourceHint previous = this.sourceHint;
this.sourceHint = SourceHint.combine(previous, query.getProjectedQuery().getSourceHint());
PlanNode leftPlan = createQueryPlan( query.getLeftQuery(), command.getOrderBy());
//allow the affect of attaching grouping to tunnel up through the parent order bys
if (command.getOrderBy() != null) {
if (parentOrderBys == null) {
parentOrderBys = new ArrayList<OrderBy>(2);
}
parentOrderBys.add(command.getOrderBy());
}
PlanNode leftPlan = createQueryPlan( query.getLeftQuery(), parentOrderBys);
if (command.getOrderBy() != null) {
parentOrderBys.remove(parentOrderBys.size()-1);
}
PlanNode rightPlan = createQueryPlan( query.getRightQuery(), null);
node = NodeFactory.getNewNode(NodeConstants.Types.SET_OP);
node.setProperty(NodeConstants.Info.SET_OPERATION, query.getOperation());
Expand All @@ -1155,7 +1165,7 @@ PlanNode createQueryPlan(QueryCommand command, OrderBy parentOrderBy)
return node;
}

private PlanNode createQueryPlan(Query query, OrderBy parentOrderBy)
private PlanNode createQueryPlan(Query query, List<OrderBy> parentOrderBys)
throws QueryMetadataException, TeiidComponentException, TeiidProcessingException {

PlanNode plan = null;
Expand Down Expand Up @@ -1191,7 +1201,7 @@ private PlanNode createQueryPlan(Query query, OrderBy parentOrderBy)
hasGrouping = true;
}
if(hasGrouping) {
plan = attachGrouping(plan, query, aggs, parentOrderBy);
plan = attachGrouping(plan, query, aggs, parentOrderBys);
}

// Attach having criteria node on top
Expand Down Expand Up @@ -1613,7 +1623,7 @@ public static PlanNode createSelectNode(final Criteria crit, boolean isHaving) {
* @throws TeiidComponentException
* @throws QueryMetadataException
*/
private PlanNode attachGrouping(PlanNode plan, Query query, Collection<AggregateSymbol> aggs, OrderBy parentOrderBy) throws QueryMetadataException, TeiidComponentException {
private PlanNode attachGrouping(PlanNode plan, Query query, Collection<AggregateSymbol> aggs, List<OrderBy> parentOrderBys) throws QueryMetadataException, TeiidComponentException {
GroupBy groupBy = query.getGroupBy();
List<Expression> groupingCols = null;
PlanNode groupNode = NodeFactory.getNewNode(NodeConstants.Types.GROUP);
Expand Down Expand Up @@ -1656,7 +1666,11 @@ public Expression replaceExpression(Expression element) {
replaceExpressions(query.getHaving(), mapping, subMapping);
replaceExpressions(query.getSelect(), mapping, subMapping);
replaceExpressions(query.getOrderBy(), mapping, subMapping);
replaceExpressions(parentOrderBy, mapping, subMapping);
if (parentOrderBys != null) {
for (OrderBy parentOrderBy : parentOrderBys) {
replaceExpressions(parentOrderBy, mapping, subMapping);
}
}
// Mark in hints
hints.hasAggregates = true;

Expand Down
Expand Up @@ -447,5 +447,29 @@ public class TestOrderByProcessing {
@Test public void testOrderByUnrelated2() {
TestValidator.helpValidate("SELECT max(e2) FROM pm1.g1 group by e1 ORDER BY e4", new String[] {"e4"}, RealMetadataFactory.example1Cached());
}

@Test public void testOrderedNestedGrouping() throws Exception {
String sql = "select e1, e2, '1|1' as COL, count(DISTINCT x) from pm1.g1 inner join (select e3 as x, e4 as y from pm1.g2) as v on (e4 = y) group by e1, e2"
+ " UNION ALL select e1, null, '1|0' as COL, count(DISTINCT x) from pm1.g1 inner join (select e3 as x, e4 as y from pm1.g2) as v on (e4 = y) group by e1"
+ " UNION ALL select null, e2, '0|1' as COL, count(DISTINCT x) from pm1.g1 inner join (select e3 as x, e4 as y from pm1.g2) as v on (e4 = y) group by e2"
+ " UNION ALL select null, null, '0|0' as COL, count(DISTINCT x) from pm1.g1 inner join (select e3 as x, e4 as y from pm1.g2) as v on (e4 = y) order by e1, e2 limit 1000";

ProcessorPlan plan = TestOptimizer.helpPlan(sql, RealMetadataFactory.example1Cached(),
new String[] {
"SELECT pm1.g1.e4 FROM pm1.g1",
"SELECT pm1.g2.e4, pm1.g2.e3 FROM pm1.g2",
"SELECT pm1.g1.e4, pm1.g1.e1 FROM pm1.g1",
"SELECT pm1.g1.e4, pm1.g1.e1, pm1.g1.e2 FROM pm1.g1",
"SELECT pm1.g1.e4, pm1.g1.e2 FROM pm1.g1"}, new DefaultCapabilitiesFinder(), ComparisonMode.EXACT_COMMAND_STRING);

HardcodedDataManager hdm = new HardcodedDataManager();
hdm.addData("SELECT pm1.g1.e4 FROM pm1.g1", Arrays.asList(1.0));
hdm.addData("SELECT pm1.g2.e4, pm1.g2.e3 FROM pm1.g2", Arrays.asList(1.0, true));
hdm.addData("SELECT pm1.g1.e4, pm1.g1.e1 FROM pm1.g1", Arrays.asList(1.0, "a"));
hdm.addData("SELECT pm1.g1.e4, pm1.g1.e1, pm1.g1.e2 FROM pm1.g1", Arrays.asList(1.0, "a", 1));
hdm.addData("SELECT pm1.g1.e4, pm1.g1.e2 FROM pm1.g1", Arrays.asList(1.0, 1));

TestProcessor.helpProcess(plan, hdm, new List<?>[] {Arrays.asList("a", 1, "1|1", 1), Arrays.asList("a", null, "1|0", 1), Arrays.asList(null, 1, "0|1", 1), Arrays.asList(null, null, "0|0", 1)});
}

}

0 comments on commit d6714bc

Please sign in to comment.