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());
}
Show replies by date