[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