Author: shawkins
Date: 2012-04-18 11:13:12 -0400 (Wed, 18 Apr 2012)
New Revision: 4016
Modified:
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanSorts.java
branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestSortOptimization.java
Log:
TEIID-2003 fix for sort optimization error
Modified:
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanSorts.java
===================================================================
---
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanSorts.java 2012-04-18
15:12:02 UTC (rev 4015)
+++
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanSorts.java 2012-04-18
15:13:12 UTC (rev 4016)
@@ -81,6 +81,7 @@
switch (node.getType()) {
case NodeConstants.Types.SORT:
parentBlocking = true;
+ boolean raisedAccess = false;
if (node.hasBooleanProperty(NodeConstants.Info.IS_DUP_REMOVAL)) {
break;
}
@@ -88,6 +89,7 @@
node.setProperty(NodeConstants.Info.IS_DUP_REMOVAL, true);
} else {
root = checkForProjectOptimization(node, root, metadata, capFinder, record);
+ raisedAccess = NodeEditor.findParent(node, NodeConstants.Types.ACCESS) != null;
}
OrderBy orderBy = (OrderBy)node.getProperty(NodeConstants.Info.SORT_ORDER);
List<SingleElementSymbol> orderColumns = orderBy.getSortKeys();
@@ -121,8 +123,10 @@
}
possibleSort.setProperty(Info.SORT_ORDER, orderBy);
}
- break;
}
+ if (raisedAccess) {
+ return root;
+ }
break;
case NodeConstants.Types.DUP_REMOVE:
if (parentBlocking) {
Modified:
branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestSortOptimization.java
===================================================================
---
branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestSortOptimization.java 2012-04-18
15:12:02 UTC (rev 4015)
+++
branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestSortOptimization.java 2012-04-18
15:13:12 UTC (rev 4016)
@@ -286,6 +286,40 @@
helpPlan(sql, RealMetadataFactory.example1Cached(), null, capFinder,
new String[] {"SELECT g_0.e1 AS c_0, g_0.e2 AS
c_1 FROM pm1.g1 AS g_0 ORDER BY c_0 LIMIT 1"}, ComparisonMode.EXACT_COMMAND_STRING);
//$NON-NLS-1$
}
+
+ //TODO this should trigger another view removal and thus the combination of the
grouping/dup operation
+ @Test public void testGroupDupCombination1Pushdown() {
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ BasicSourceCapabilities caps = getTypicalCapabilities();
+ caps.setCapabilitySupport(Capability.QUERY_SELECT_DISTINCT, true);
+ caps.setCapabilitySupport(Capability.QUERY_FROM_INLINE_VIEWS, true);
+ caps.setCapabilitySupport(Capability.QUERY_GROUP_BY, true);
+ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+ capFinder.addCapabilities("pm2", caps); //$NON-NLS-1$
+ // Create query
+ String sql = "select e1, (select e1 from pm2.g1 where e2 = x.e2) as z from
(select distinct e1, e2 from pm1.g1) as x group by e1, e2 order by e1";
//$NON-NLS-1$
+ ProcessorPlan plan = helpPlan(sql, RealMetadataFactory.example1Cached(), null,
capFinder,
+ new String[] {"SELECT v_0.c_0, v_0.c_1 FROM
(SELECT DISTINCT g_0.e1 AS c_0, g_0.e2 AS c_1 FROM pm1.g1 AS g_0) AS v_0 GROUP BY v_0.c_0,
v_0.c_1"}, TestOptimizer.SHOULD_SUCCEED); //$NON-NLS-1$
+
+ checkNodeTypes(plan, new int[] {
+ 1, // Access
+ 0, // DependentAccess
+ 0, // DependentSelect
+ 1, // DependentProject
+ 0, // DupRemove
+ 0, // Grouping
+ 0, // NestedLoopJoinStrategy
+ 0, // MergeJoinStrategy
+ 0, // Null
+ 0, // PlanExecution
+ 0, // Project
+ 0, // Select
+ 0, // Sort
+ 0 // UnionAll
+ });
+ checkNodeTypes(plan, new int[] {0}, new Class[] {DupRemoveSortNode.class});
+ }
+
}