[teiid-commits] teiid SVN: r3119 - in trunk/engine/src: test/java/org/teiid/query/optimizer and 1 other directory.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Mon Apr 25 16:18:21 EDT 2011
Author: shawkins
Date: 2011-04-25 16:18:21 -0400 (Mon, 25 Apr 2011)
New Revision: 3119
Modified:
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanSorts.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestSortOptimization.java
Log:
TEIID-1566 fix for projection raising ordering on an alias
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanSorts.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanSorts.java 2011-04-25 19:51:53 UTC (rev 3118)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanSorts.java 2011-04-25 20:18:21 UTC (rev 3119)
@@ -41,6 +41,9 @@
import org.teiid.query.sql.lang.OrderBy;
import org.teiid.query.sql.lang.OrderByItem;
import org.teiid.query.sql.lang.SetQuery;
+import org.teiid.query.sql.symbol.AggregateSymbol;
+import org.teiid.query.sql.symbol.AliasSymbol;
+import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.SingleElementSymbol;
import org.teiid.query.util.CommandContext;
@@ -236,8 +239,21 @@
List<SingleElementSymbol> childOutputCols = (List<SingleElementSymbol>) projectNode.getFirstChild().getProperty(Info.OUTPUT_COLS);
OrderBy orderBy = (OrderBy) node.getProperty(Info.SORT_ORDER);
List<SingleElementSymbol> orderByKeys = orderBy.getSortKeys();
- if (!childOutputCols.containsAll(orderByKeys)) {
- return root;
+ for (SingleElementSymbol ss : orderByKeys) {
+ if(ss instanceof AliasSymbol) {
+ ss = ((AliasSymbol)ss).getSymbol();
+ }
+
+ if (ss instanceof ExpressionSymbol && !(ss instanceof AggregateSymbol)) {
+ ExpressionSymbol exprSymbol = (ExpressionSymbol)ss;
+
+ if (!exprSymbol.isDerivedExpression()) {
+ return root; //TODO: insert a new project node to handle this case
+ }
+ }
+ if (!childOutputCols.contains(ss)) {
+ return root;
+ }
}
NodeEditor.removeChildNode(projectNode.getParent(), projectNode);
if (parent != null && parent.getType() == NodeConstants.Types.TUPLE_LIMIT && parent.getParent() != null) {
@@ -256,13 +272,21 @@
}
}
List<SingleElementSymbol> orderByOutputSymbols = (List<SingleElementSymbol>) node.getProperty(Info.OUTPUT_COLS);
+ boolean unrelated = false;
if (node.hasBooleanProperty(Info.UNRELATED_SORT)) {
node.setProperty(Info.UNRELATED_SORT, false);
- //update sort order
- for (OrderByItem item : orderBy.getOrderByItems()) {
+ unrelated = true;
+ }
+ for (OrderByItem item : orderBy.getOrderByItems()) {
+ if (unrelated) {
+ //update sort order
int index = childOutputCols.indexOf(item.getSymbol());
item.setExpressionPosition(index);
}
+ //strip alias as project was raised
+ if (item.getSymbol() instanceof AliasSymbol) {
+ item.setSymbol(((AliasSymbol)item.getSymbol()).getSymbol());
+ }
}
projectNode.setProperty(Info.OUTPUT_COLS, orderByOutputSymbols);
projectNode.setProperty(Info.PROJECT_COLS, orderByOutputSymbols);
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestSortOptimization.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestSortOptimization.java 2011-04-25 19:51:53 UTC (rev 3118)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestSortOptimization.java 2011-04-25 20:18:21 UTC (rev 3119)
@@ -239,6 +239,20 @@
helpPlan(sql, FakeMetadataFactory.example1Cached(), null, capFinder,
new String[] {"SELECT pm1.g1.e2, pm1.g1.e1 FROM pm1.g1 ORDER BY pm1.g1.e1"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
}
+
+ @Test public void testProjectionRaisingWithAlias() throws Exception {
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+ caps.setCapabilitySupport(Capability.ROW_LIMIT, true);
+ caps.setCapabilitySupport(Capability.QUERY_ORDERBY, true);
+ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+ capFinder.addCapabilities("pm2", caps); //$NON-NLS-1$
+
+ String sql = "select (select e1 from pm2.g1 where e2 = x.e2) as z, x.e1 as foo from pm1.g1 as x order by foo limit 1"; //$NON-NLS-1$
+ helpPlan(sql, FakeMetadataFactory.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$
+ }
+
}
More information about the teiid-commits
mailing list