Author: shawkins
Date: 2012-08-16 10:53:55 -0400 (Thu, 16 Aug 2012)
New Revision: 4329
Added:
trunk/engine/src/main/java/org/teiid/query/util/Options.java
Modified:
trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLStagaingQueryPlanner.java
trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/ExistsCriteria.java
trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
Log:
TEIID-2149 changing the applicability of subqueryUnnestDefault
Modified: trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html 2012-08-16 13:32:05 UTC
(rev 4328)
+++ trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html 2012-08-16 14:53:55 UTC
(rev 4329)
@@ -10,7 +10,7 @@
<P><A
HREF="http://www.teiid.org/"><IMG
SRC="https://www.jboss.org/dms/teiid/images/teiid-banner.png"
NAME="graphics1" ALT="Teiid" ALIGN=BOTTOM WIDTH=800></A>
<H1>Teiid ${project.version} Release Notes</H1>
-<P>Teiid ${project.version} adds metadata and integration features.
+<P>Teiid ${project.version} adds performance and integration features.
<H2>Overview</H2>
<UL>
@@ -25,8 +25,6 @@
<LI><A HREF="#About">About JBoss</A>
</UL>
<H2><A NAME="Highlights"></A>Highlights</H2>
-<UL>
-</UL>
<h2><a name="Compatibility">Compatibility
Issues</a></h2>
<ul>
@@ -35,6 +33,12 @@
<li>decodeinteger/decodestring have been deprecated. A CASE expression should be
used instead.
</ul>
+<h4>from 8.1</h4>
+<ul>
+ <li>TEIID-2149 <B>Subquery Unnesting</B> - the optimizer will not
consult the subqueryUnnestDefault property if it can make a cost based decision to replace
a subquery with a merge join.
+Use the subquery hints, DJ, MJ, and NO_UNNEST to override this behavior if needed.
+<ul>
+
<h4>from 8.0</h4>
<ul>
<li>org.teiid.metadata.Schema holds FunctionMethods by uuid rather than name to
accommodate overridden method signatures.
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java 2012-08-16
13:32:05 UTC (rev 4328)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java 2012-08-16
14:53:55 UTC (rev 4329)
@@ -43,6 +43,7 @@
import org.teiid.core.id.IDGenerator;
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.util.Assertion;
+import org.teiid.core.util.PropertiesUtils;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository;
import org.teiid.dqp.internal.process.AuthorizationValidator.CommandType;
import org.teiid.dqp.internal.process.multisource.MultiSourceCapabilitiesFinder;
@@ -85,6 +86,7 @@
import org.teiid.query.tempdata.GlobalTableStore;
import org.teiid.query.tempdata.TempTableStore;
import org.teiid.query.util.CommandContext;
+import org.teiid.query.util.Options;
import org.teiid.query.validator.AbstractValidationVisitor;
import org.teiid.query.validator.ValidationVisitor;
import org.teiid.query.validator.Validator;
@@ -245,6 +247,9 @@
context.setResultSetCacheEnabled(this.resultSetCacheEnabled);
context.setUserRequestSourceConcurrency(this.userRequestConcurrency);
context.setSubject(workContext.getSubject());
+ Options options = new Options();
+ options.setProperties(System.getProperties());
+ PropertiesUtils.setBeanProperties(options, options.getProperties(),
"org.teiid"); //$NON-NLS-1$
this.context.setSession(workContext.getSession());
this.context.setRequestId(this.requestId);
this.context.setDQPWorkContext(this.workContext);
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 2012-08-16
13:32:05 UTC (rev 4328)
+++
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java 2012-08-16
14:53:55 UTC (rev 4329)
@@ -74,9 +74,6 @@
public final class RuleMergeCriteria implements OptimizerRule {
- public static final String UNNEST_DEFAULT = "org.teiid.subqueryUnnestDefault";
//$NON-NLS-1$
- private final boolean UNNEST = Boolean.getBoolean(UNNEST_DEFAULT);
-
/**
* Used to replace correlated references
*/
@@ -246,7 +243,7 @@
float sourceCost = NewCalculateCostUtil.computeCostForTree(current.getFirstChild(),
metadata);
Criteria crit = (Criteria)current.getProperty(NodeConstants.Info.SELECT_CRITERIA);
- PlannedResult plannedResult = findSubquery(crit);
+ PlannedResult plannedResult = findSubquery(crit, true);
if (plannedResult.query == null) {
return current;
}
@@ -338,7 +335,7 @@
}
}
- public PlannedResult findSubquery(Criteria crit) throws TeiidComponentException,
QueryMetadataException {
+ public PlannedResult findSubquery(Criteria crit, boolean unnest) throws
TeiidComponentException, QueryMetadataException {
PlannedResult result = new PlannedResult();
if (crit instanceof SubquerySetCriteria) {
//convert to the quantified form
@@ -350,12 +347,12 @@
result.type = crit.getClass();
result.mergeJoin = ssc.getSubqueryHint().isMergeJoin();
result.makeInd = ssc.getSubqueryHint().isDepJoin();
- if (!UNNEST && !result.mergeJoin) {
+ if (!unnest && !result.mergeJoin) {
return result;
}
crit = new SubqueryCompareCriteria(ssc.getExpression(), ssc.getCommand(),
SubqueryCompareCriteria.EQ, SubqueryCompareCriteria.SOME);
} else if (crit instanceof CompareCriteria) {
- if (!UNNEST) {
+ if (!unnest) {
return result;
}
//convert to the quantified form
@@ -406,7 +403,7 @@
//the correlations can only be in where (if no group by or aggregates) or having
result.mergeJoin = exists.getSubqueryHint().isMergeJoin();
result.makeInd = exists.getSubqueryHint().isDepJoin();
- if (!UNNEST && !result.mergeJoin) {
+ if (!unnest && !result.mergeJoin) {
return result;
}
result.query = (Query)exists.getCommand();
Modified:
trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLStagaingQueryPlanner.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLStagaingQueryPlanner.java 2012-08-16
13:32:05 UTC (rev 4328)
+++
trunk/engine/src/main/java/org/teiid/query/optimizer/xml/XMLStagaingQueryPlanner.java 2012-08-16
14:53:55 UTC (rev 4329)
@@ -256,7 +256,7 @@
}
ExistsCriteria ec = new ExistsCriteria();
ec.setSubqueryHint(new ExistsCriteria.SubqueryHint());
- ec.getSubqueryHint().setDepJoin(true);
+ ec.getSubqueryHint().setDepJoin();
ec.setCommand(query);
Criteria existing = stagableQuery.getCriteria();
stagableQuery.setCriteria(Criteria.combineCriteria(existing, ec));
Modified: trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java 2012-08-16
13:32:05 UTC (rev 4328)
+++ trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java 2012-08-16
14:53:55 UTC (rev 4329)
@@ -219,7 +219,7 @@
} else if (parts[i].equalsIgnoreCase(SubqueryHint.NOUNNEST)) {
hint.setNoUnnest(true);
} else if (parts[i].equalsIgnoreCase(SubqueryHint.DJ)) {
- hint.setDepJoin(true);
+ hint.setDepJoin();
}
}
return hint;
Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2012-08-16
13:32:05 UTC (rev 4328)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2012-08-16
14:53:55 UTC (rev 4329)
@@ -113,6 +113,17 @@
DataTypeManager.DefaultDataTypes.BIG_INTEGER,
DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.LONG,
DataTypeManager.DefaultDataTypes.FLOAT, DataTypeManager.DefaultDataTypes.DOUBLE));
+ // Constants used in simplifying mathematical criteria
+ private final static Integer INTEGER_ZERO = new Integer(0);
+ private final static Double DOUBLE_ZERO = new Double(0);
+ private final static Float FLOAT_ZERO = new Float(0);
+ private final static Long LONG_ZERO = new Long(0);
+ private final static BigInteger BIG_INTEGER_ZERO = new BigInteger("0");
//$NON-NLS-1$
+ private final static BigDecimal BIG_DECIMAL_ZERO = new BigDecimal("0");
//$NON-NLS-1$
+ private final static Short SHORT_ZERO = new Short((short)0);
+ private final static Byte BYTE_ZERO = new Byte((byte)0);
+ private boolean rewriteAggs = true;
+
private QueryMetadataInterface metadata;
private CommandContext context;
@@ -425,7 +436,7 @@
names.add(gs.getName());
}
for (Iterator<Criteria> crits = current.iterator(); crits.hasNext();) {
- PlannedResult plannedResult = rmc.findSubquery(crits.next());
+ PlannedResult plannedResult = rmc.findSubquery(crits.next(),
context!=null?context.getOptions().isSubqueryUnnestDefault():false);
if (plannedResult.not || plannedResult.query == null ||
plannedResult.query.getProcessorPlan() != null
|| plannedResult.query.getWith() != null) {
continue;
@@ -1289,17 +1300,6 @@
return false;
}
- // Constants used in simplifying mathematical criteria
- private Integer INTEGER_ZERO = new Integer(0);
- private Double DOUBLE_ZERO = new Double(0);
- private Float FLOAT_ZERO = new Float(0);
- private Long LONG_ZERO = new Long(0);
- private BigInteger BIG_INTEGER_ZERO = new BigInteger("0"); //$NON-NLS-1$
- private BigDecimal BIG_DECIMAL_ZERO = new BigDecimal("0"); //$NON-NLS-1$
- private Short SHORT_ZERO = new Short((short)0);
- private Byte BYTE_ZERO = new Byte((byte)0);
- private boolean rewriteAggs = true;
-
/**
* @param criteria
* @return CompareCriteria
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/ExistsCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/ExistsCriteria.java 2012-08-16
13:32:05 UTC (rev 4328)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/ExistsCriteria.java 2012-08-16
14:53:55 UTC (rev 4329)
@@ -64,8 +64,8 @@
return noUnnest;
}
- public void setDepJoin(boolean depJoin) {
- this.depJoin = depJoin;
+ public void setDepJoin() {
+ this.depJoin = true;
this.mergeJoin = true;
}
Modified: trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java 2012-08-16
13:32:05 UTC (rev 4328)
+++ trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java 2012-08-16
14:53:55 UTC (rev 4329)
@@ -146,6 +146,8 @@
private ClassLoader classLoader;
private List<Exception> warnings = null;
+
+ private Options options = null;
}
private GlobalState globalState = new GlobalState();
@@ -814,5 +816,16 @@
public void setTupleSourceCache(TupleSourceCache tupleSourceCache) {
this.tupleSourceCache = tupleSourceCache;
}
+
+ public Options getOptions() {
+ if (this.globalState.options == null) {
+ this.globalState.options = new Options();
+ }
+ return this.globalState.options;
+ }
+
+ public void setOptions(Options options) {
+ this.globalState.options = options;
+ }
}
Added: trunk/engine/src/main/java/org/teiid/query/util/Options.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/util/Options.java
(rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/util/Options.java 2012-08-16 14:53:55 UTC
(rev 4329)
@@ -0,0 +1,58 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.util;
+
+import java.util.Properties;
+
+/**
+ * A holder for options
+ */
+public class Options {
+
+ public static final String UNNEST_DEFAULT = "org.teiid.subqueryUnnestDefault";
//$NON-NLS-1$
+
+ private Properties properties;
+ private boolean subqueryUnnestDefault;
+
+ public Properties getProperties() {
+ return properties;
+ }
+
+ public void setProperties(Properties properties) {
+ this.properties = properties;
+ }
+
+ public boolean isSubqueryUnnestDefault() {
+ return subqueryUnnestDefault;
+ }
+
+ public void setSubqueryUnnestDefault(boolean subqueryUnnestDefault) {
+ this.subqueryUnnestDefault = subqueryUnnestDefault;
+ }
+
+ public Options subqueryUnnestDefault(boolean s) {
+ this.subqueryUnnestDefault = s;
+ return this;
+ }
+
+}
Property changes on: trunk/engine/src/main/java/org/teiid/query/util/Options.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java 2012-08-16
13:32:05 UTC (rev 4328)
+++
trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java 2012-08-16
14:53:55 UTC (rev 4329)
@@ -25,7 +25,6 @@
import static org.junit.Assert.*;
import static org.teiid.query.optimizer.TestOptimizer.*;
-import org.junit.After;
import org.junit.Test;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
@@ -37,10 +36,11 @@
import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder;
import org.teiid.query.optimizer.capabilities.FakeCapabilitiesFinder;
import org.teiid.query.optimizer.capabilities.SourceCapabilities.Capability;
-import org.teiid.query.optimizer.relational.rules.RuleMergeCriteria;
import org.teiid.query.processor.ProcessorPlan;
import org.teiid.query.rewriter.TestQueryRewriter;
import org.teiid.query.unittest.RealMetadataFactory;
+import org.teiid.query.util.CommandContext;
+import org.teiid.query.util.Options;
import org.teiid.translator.ExecutionFactory;
import org.teiid.translator.SourceSystemFunctions;
@@ -392,9 +392,9 @@
}
/**
- * Check that subquery is not pushed if the subquery cannot all be pushed to the
source.
+ * Check that subquery is not pushed if the subquery cannot all be pushed to the
source. Automatically converted to a merge join
*/
- @Test public void testNoPushSubqueryInWhereClause1() {
+ @Test public void testNoPushSubqueryInWhereClause1() throws Exception {
FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
BasicSourceCapabilities caps = getTypicalCapabilities();
caps.setCapabilitySupport(Capability.CRITERIA_IN_SUBQUERY, true);
@@ -403,25 +403,25 @@
ProcessorPlan plan = helpPlan("Select e1 from pm1.g1 where e1 in (select
max(e1) FROM pm1.g2)", RealMetadataFactory.example1Cached(), //$NON-NLS-1$
null, capFinder,
- new String[] { "SELECT e1 FROM pm1.g1" }, SHOULD_SUCCEED);
//$NON-NLS-1$
+ new String[] { "SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 ORDER BY
c_0" }, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
checkNodeTypes(plan, new int[] {
1, // Access
0, // DependentAccess
- 1, // DependentSelect
+ 0, // DependentSelect
0, // DependentProject
0, // DupRemove
0, // Grouping
0, // NestedLoopJoinStrategy
- 0, // MergeJoinStrategy
+ 1, // MergeJoinStrategy
0, // Null
- 0, // PlanExecution
+ 1, // PlanExecution
1, // Project
0, // Select
0, // Sort
0 // UnionAll
});
}
-
+
/**
* Check that subquery is not pushed if the subquery is from a different model
* than the outer query.
@@ -768,16 +768,18 @@
}
@Test public void testSubqueryRewriteToJoinDistinct() throws Exception {
- System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
- TestQueryRewriter.helpTestRewriteCommand("Select distinct e1 from pm1.g1 as
x where exists (select pm1.g1.e1 FROM pm1.g1 where e1 = x.e1)", "SELECT DISTINCT
e1 FROM pm1.g1 AS x, (SELECT pm1.g1.e1 FROM pm1.g1) AS X__1 WHERE x.e1 = X__1.e1",
RealMetadataFactory.example1Cached());
+ CommandContext cc = new CommandContext();
+ cc.setOptions(new Options().subqueryUnnestDefault(true));
+ TestQueryRewriter.helpTestRewriteCommand("Select distinct e1 from pm1.g1 as
x where exists (select pm1.g1.e1 FROM pm1.g1 where e1 = x.e1)", "SELECT DISTINCT
e1 FROM pm1.g1 AS x, (SELECT pm1.g1.e1 FROM pm1.g1) AS X__1 WHERE x.e1 = X__1.e1",
RealMetadataFactory.example1Cached(), cc);
}
/**
* Agg does not depend on cardinality
*/
@Test public void testSubqueryRewriteToJoinGroupBy() throws Exception {
- System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
- TestQueryRewriter.helpTestRewriteCommand("Select max(e1) from pm1.g1 as x
where exists (select pm1.g1.e1 FROM pm1.g1 where e1 = x.e1) group by e2",
"SELECT MAX(e1) FROM pm1.g1 AS x, (SELECT pm1.g1.e1 FROM pm1.g1) AS X__1 WHERE x.e1 =
X__1.e1 GROUP BY e2", RealMetadataFactory.example1Cached());
+ CommandContext cc = new CommandContext();
+ cc.setOptions(new Options().subqueryUnnestDefault(true));
+ TestQueryRewriter.helpTestRewriteCommand("Select max(e1) from pm1.g1 as x
where exists (select pm1.g1.e1 FROM pm1.g1 where e1 = x.e1) group by e2",
"SELECT MAX(e1) FROM pm1.g1 AS x, (SELECT pm1.g1.e1 FROM pm1.g1) AS X__1 WHERE x.e1 =
X__1.e1 GROUP BY e2", RealMetadataFactory.example1Cached(), cc);
}
/**
@@ -788,8 +790,9 @@
}
@Test public void testSubqueryRewriteToJoin() throws Exception {
- System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
- TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where exists
(select pm1.g1.e1 FROM pm1.g1 where e1 = pm3.g1.e1)", "SELECT e1 FROM pm3.g1,
(SELECT pm1.g1.e1 FROM pm1.g1) AS X__1 WHERE pm3.g1.e1 = X__1.e1",
RealMetadataFactory.example4());
+ CommandContext cc = new CommandContext();
+ cc.setOptions(new Options().subqueryUnnestDefault(true));
+ TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where exists
(select pm1.g1.e1 FROM pm1.g1 where e1 = pm3.g1.e1)", "SELECT e1 FROM pm3.g1,
(SELECT pm1.g1.e1 FROM pm1.g1) AS X__1 WHERE pm3.g1.e1 = X__1.e1",
RealMetadataFactory.example4(), cc);
}
@Test public void testSubqueryRewriteToJoin1() throws Exception {
@@ -816,13 +819,15 @@
}
@Test public void testDontRewriteToJoinWithOtherCriteria() throws Exception {
- System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
- TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where
pm3.g1.e1 in /*+ NO_UNNEST */ (select pm1.g1.e1 FROM pm1.g1 where e2 <
pm3.g1.e2)", "SELECT e1 FROM pm3.g1 WHERE pm3.g1.e1 IN /*+ NO_UNNEST */ (SELECT
pm1.g1.e1 FROM pm1.g1 WHERE e2 < pm3.g1.e2)", RealMetadataFactory.example4());
+ CommandContext cc = new CommandContext();
+ cc.setOptions(new Options().subqueryUnnestDefault(true));
+ TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where
pm3.g1.e1 in /*+ NO_UNNEST */ (select pm1.g1.e1 FROM pm1.g1 where e2 <
pm3.g1.e2)", "SELECT e1 FROM pm3.g1 WHERE pm3.g1.e1 IN /*+ NO_UNNEST */ (SELECT
pm1.g1.e1 FROM pm1.g1 WHERE e2 < pm3.g1.e2)", RealMetadataFactory.example4(),
cc);
}
@Test public void testSubqueryRewriteToJoinWithAggregate() throws Exception {
- System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
- TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where
pm3.g1.e2 < (select max(e2) FROM pm1.g1 where pm3.g1.e1 = e1)", "SELECT e1
FROM pm3.g1, (SELECT MAX(e2) AS expr1, e1 FROM pm1.g1 GROUP BY e1) AS X__1 WHERE
(pm3.g1.e2 < X__1.expr1) AND (pm3.g1.e1 = X__1.e1)",
RealMetadataFactory.example4());
+ CommandContext cc = new CommandContext();
+ cc.setOptions(new Options().subqueryUnnestDefault(true));
+ TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where
pm3.g1.e2 < (select max(e2) FROM pm1.g1 where pm3.g1.e1 = e1)", "SELECT e1
FROM pm3.g1, (SELECT MAX(e2) AS expr1, e1 FROM pm1.g1 GROUP BY e1) AS X__1 WHERE
(pm3.g1.e2 < X__1.expr1) AND (pm3.g1.e1 = X__1.e1)",
RealMetadataFactory.example4(), cc);
}
/**
@@ -834,13 +839,15 @@
}
@Test public void testSubqueryRewriteToJoinWithAggregate2() throws Exception {
- System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
- TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where
pm3.g1.e2 < (select max(e2) FROM pm1.g1 WHERE pm3.g1.e1 = e1 HAVING min(e3) <
pm3.g1.e3)", "SELECT e1 FROM pm3.g1, (SELECT MAX(e2) AS expr1, e1, MIN(e3) AS
expr3 FROM pm1.g1 GROUP BY e1) AS X__1 WHERE (X__1.expr3 < pm3.g1.e3) AND (pm3.g1.e2
< X__1.expr1) AND (pm3.g1.e1 = X__1.e1)", RealMetadataFactory.example4());
+ CommandContext cc = new CommandContext();
+ cc.setOptions(new Options().subqueryUnnestDefault(true));
+ TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where
pm3.g1.e2 < (select max(e2) FROM pm1.g1 WHERE pm3.g1.e1 = e1 HAVING min(e3) <
pm3.g1.e3)", "SELECT e1 FROM pm3.g1, (SELECT MAX(e2) AS expr1, e1, MIN(e3) AS
expr3 FROM pm1.g1 GROUP BY e1) AS X__1 WHERE (X__1.expr3 < pm3.g1.e3) AND (pm3.g1.e2
< X__1.expr1) AND (pm3.g1.e1 = X__1.e1)", RealMetadataFactory.example4(), cc);
}
@Test public void testSubqueryRewriteToJoinWithGroupingExpression() throws Exception
{
- System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
- TestQueryRewriter.helpTestRewriteCommand("Select distinct e1 from pm3.g1
where exists (select 1 FROM pm1.g1 group by e4 || 'x' HAVING min(e3) || (e4 ||
'x') = pm3.g1.e3)", "SELECT DISTINCT e1 FROM pm3.g1, (SELECT 1 AS expr1,
MIN(e3) AS expr2, concat(convert(e4, string), 'x') AS expr3,
concat(convert(MIN(e3), string), concat(convert(e4, string), 'x')) AS expr FROM
pm1.g1 GROUP BY concat(convert(e4, string), 'x')) AS X__1 WHERE convert(pm3.g1.e3,
string) = X__1.expr", RealMetadataFactory.example4());
+ CommandContext cc = new CommandContext();
+ cc.setOptions(new Options().subqueryUnnestDefault(true));
+ TestQueryRewriter.helpTestRewriteCommand("Select distinct e1 from pm3.g1
where exists (select 1 FROM pm1.g1 group by e4 || 'x' HAVING min(e3) || (e4 ||
'x') = pm3.g1.e3)", "SELECT DISTINCT e1 FROM pm3.g1, (SELECT 1 AS expr1,
MIN(e3) AS expr2, concat(convert(e4, string), 'x') AS expr3,
concat(convert(MIN(e3), string), concat(convert(e4, string), 'x')) AS expr FROM
pm1.g1 GROUP BY concat(convert(e4, string), 'x')) AS X__1 WHERE convert(pm3.g1.e3,
string) = X__1.expr", RealMetadataFactory.example4(), cc);
}
/**
@@ -876,8 +883,9 @@
}
@Test public void testSubqueryExpressionJoin() throws Exception {
- System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
- TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where
pm3.g1.e2 < (Select max(e2) from pm2.g2 where e1 = pm3.g1.e1 having convert(min(e2),
string) > pm3.g1.e1)", "SELECT e1 FROM pm3.g1, (SELECT MAX(e2) AS expr1, e1,
MIN(e2) AS expr3 FROM pm2.g2 GROUP BY e1) AS X__1 WHERE (convert(X__1.expr3, string) >
pm3.g1.e1) AND (pm3.g1.e2 < X__1.expr1) AND (pm3.g1.e1 = X__1.e1)",
RealMetadataFactory.example4());
+ CommandContext cc = new CommandContext();
+ cc.setOptions(new Options().subqueryUnnestDefault(true));
+ TestQueryRewriter.helpTestRewriteCommand("Select e1 from pm3.g1 where
pm3.g1.e2 < (Select max(e2) from pm2.g2 where e1 = pm3.g1.e1 having convert(min(e2),
string) > pm3.g1.e1)", "SELECT e1 FROM pm3.g1, (SELECT MAX(e2) AS expr1, e1,
MIN(e2) AS expr3 FROM pm2.g2 GROUP BY e1) AS X__1 WHERE (convert(X__1.expr3, string) >
pm3.g1.e1) AND (pm3.g1.e2 < X__1.expr1) AND (pm3.g1.e1 = X__1.e1)",
RealMetadataFactory.example4(), cc);
}
/**
@@ -933,7 +941,6 @@
* Same as above, but the source is much larger, so a semi-join is favorable
*/
@Test public void testSemiJoinExistsCosting() {
- System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.TRUE.toString());
ProcessorPlan plan = helpPlan("Select e1 from pm2.g2 as o where not exists
(select 1 from pm3.g1 where e1 = o.e1 having o.e2 = count(e2))",
RealMetadataFactory.example4(), //$NON-NLS-1$
new String[] { "SELECT g_0.e1 AS c_0, g_0.e2 AS c_1 FROM pm2.g2 AS g_0
ORDER BY c_0, c_1" }); //$NON-NLS-1$
checkNodeTypes(plan, new int[] {
@@ -977,10 +984,6 @@
checkJoinCounts(plan, 0, 1);
}
- @After public void tearDown() {
- System.setProperty(RuleMergeCriteria.UNNEST_DEFAULT, Boolean.FALSE.toString());
- }
-
@Test public void testAntiSemiJoinInHint() {
ProcessorPlan plan = helpPlan("Select e1 from pm1.g2 as o where e2 NOT IN
/*+ MJ */ (select count(e2) from pm3.g1 where e1 = o.e1)",
RealMetadataFactory.example4(), //$NON-NLS-1$
new String[] { "SELECT g_0.e2 AS c_0, g_0.e1 AS c_1 FROM pm1.g2 AS g_0
ORDER BY c_1, c_0" }); //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2012-08-16
13:32:05 UTC (rev 4328)
+++ trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2012-08-16
14:53:55 UTC (rev 4329)
@@ -173,11 +173,15 @@
}
public static Command helpTestRewriteCommand(String original, String expected,
QueryMetadataInterface metadata) throws TeiidException {
- Command command = QueryParser.getQueryParser().parseCommand(original);
- QueryResolver.resolveCommand(command, metadata);
- Command rewriteCommand = QueryRewriter.rewrite(command, metadata, null);
- assertEquals("Rewritten command was not expected", expected,
rewriteCommand.toString()); //$NON-NLS-1$
- return rewriteCommand;
+ return helpTestRewriteCommand(original, expected, metadata, null);
+ }
+
+ public static Command helpTestRewriteCommand(String original, String expected,
QueryMetadataInterface metadata, CommandContext cc) throws TeiidException {
+ Command command = QueryParser.getQueryParser().parseCommand(original);
+ QueryResolver.resolveCommand(command, metadata);
+ Command rewriteCommand = QueryRewriter.rewrite(command, metadata, cc);
+ assertEquals("Rewritten command was not expected", expected,
rewriteCommand.toString()); //$NON-NLS-1$
+ return rewriteCommand;
}
@Test public void testRewriteUnknown() {