[teiid-commits] teiid SVN: r2811 - 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 Jan 3 10:37:23 EST 2011


Author: shawkins
Date: 2011-01-03 10:37:22 -0500 (Mon, 03 Jan 2011)
New Revision: 2811

Modified:
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
Log:
TEIID-211 additional handling for subquery optimization

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java	2011-01-01 01:41:28 UTC (rev 2810)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java	2011-01-03 15:37:22 UTC (rev 2811)
@@ -67,6 +67,7 @@
 import org.teiid.query.sql.lang.SubquerySetCriteria;
 import org.teiid.query.sql.navigator.DeepPostOrderNavigator;
 import org.teiid.query.sql.symbol.AggregateSymbol;
+import org.teiid.query.sql.symbol.AliasSymbol;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
@@ -472,13 +473,22 @@
 		plannedResult.rightExpressions = RuleChooseJoinStrategy.createExpressionSymbols(plannedResult.rightExpressions);
 		
 		if (requireDistinct && !addGroupBy && !isDistinct(plannedResult.query, plannedResult.rightExpressions, metadata)) {
-			return false;
+			if (!requiredExpressions.isEmpty()) {
+				return false;
+			}
+			plannedResult.query.getSelect().setDistinct(true);
 		}
 
 		if (addGroupBy) {
 			plannedResult.query.setGroupBy(new GroupBy(plannedResult.rightExpressions));
 		}
-		HashSet<SingleElementSymbol> projectedSymbols = new HashSet<SingleElementSymbol>(plannedResult.query.getProjectedSymbols());
+		HashSet<SingleElementSymbol> projectedSymbols = new HashSet<SingleElementSymbol>();
+		for (SingleElementSymbol ses : plannedResult.query.getProjectedSymbols()) {
+			if (ses instanceof AliasSymbol) {
+				ses = ((AliasSymbol)ses).getSymbol();
+			}
+			projectedSymbols.add(ses);
+		}
 		for (SingleElementSymbol ses : requiredExpressions) {
 			if (projectedSymbols.add(ses)) {
 				plannedResult.query.getSelect().addSymbol(ses);

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java	2011-01-01 01:41:28 UTC (rev 2810)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java	2011-01-03 15:37:22 UTC (rev 2811)
@@ -755,9 +755,20 @@
     }
     
     @Test public void testSubqueryRewriteToJoin1() throws Exception {
-        TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where pm3.g1.e1 in (select pm1.g1.e1 FROM pm1.g1)", "SELECT e1 FROM pm3.g1, (SELECT pm1.g1.e1 FROM pm1.g1) AS X__1 WHERE pm3.g1.e1 = X__1.e1", FakeMetadataFactory.example4());
+        TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where pm3.g1.e1 in (select pm1.g1.e1 as x FROM pm1.g1)", "SELECT e1 FROM pm3.g1, (SELECT pm1.g1.e1 AS x FROM pm1.g1) AS X__1 WHERE pm3.g1.e1 = X__1.x", FakeMetadataFactory.example4());
     }
     
+    @Test public void testSubqueryRewriteToJoin2() throws Exception {
+        TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where pm3.g1.e1 in (select pm1.g1.e1 || 1 FROM pm1.g1)", "SELECT e1 FROM pm3.g1, (SELECT DISTINCT concat(pm1.g1.e1, '1') AS EXPR FROM pm1.g1) AS X__1 WHERE pm3.g1.e1 = X__1.EXPR", FakeMetadataFactory.example4());
+    }
+    
+    /**
+     * Even though this situation is essentially the same as above, we don't yet handle it
+     */
+    @Test public void testSubqueryRewriteToJoin3() throws Exception {
+        TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where exists (select pm1.g1.e2 FROM pm1.g1 WHERE pm3.g1.e1 = pm1.g1.e1 || 1)", "SELECT e1 FROM pm3.g1 WHERE EXISTS (SELECT pm1.g1.e2 FROM pm1.g1 WHERE concat(pm1.g1.e1, '1') = pm3.g1.e1)", FakeMetadataFactory.example4());
+    }
+    
     @Test public void testSubqueryRewriteToJoinWithOtherCriteria() throws Exception {
         TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where pm3.g1.e1 in (select pm1.g1.e1 FROM pm1.g1 where e2 < pm3.g1.e2)", "SELECT e1 FROM pm3.g1, (SELECT pm1.g1.e1, e2 FROM pm1.g1) AS X__1 WHERE (X__1.e2 < pm3.g1.e2) AND (pm3.g1.e1 = X__1.e1)", FakeMetadataFactory.example4());
     }



More information about the teiid-commits mailing list