[teiid-commits] teiid SVN: r1717 - in trunk/engine/src: test/java/com/metamatrix/query/optimizer and 2 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Wed Jan 6 00:35:59 EST 2010
Author: shawkins
Date: 2010-01-06 00:35:57 -0500 (Wed, 06 Jan 2010)
New Revision: 1717
Modified:
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/FrameUtil.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushAggregates.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushSelectCriteria.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java
trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRemoveOptionalJoins.java
trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestAggregatePushdown.java
trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptionalJoins.java
trunk/engine/src/test/java/com/metamatrix/query/processor/TestAggregateProcessing.java
trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
trunk/engine/src/test/java/com/metamatrix/query/processor/TestQueryProcessor.java
trunk/engine/src/test/java/com/metamatrix/query/processor/relational/TestRelationalPlan.java
Log:
TEIID-919 added logic to correct the projected names of additional union branches when pushing an aggregate. also consolidated the logic to check for an ordered limit, which fixed a secondary issue.
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/FrameUtil.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/FrameUtil.java 2010-01-05 23:13:18 UTC (rev 1716)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/FrameUtil.java 2010-01-06 05:35:57 UTC (rev 1717)
@@ -486,12 +486,9 @@
* Finds the closest project columns in the current frame
*/
static List<SingleElementSymbol> findTopCols(PlanNode node) {
- List projects = NodeEditor.findAllNodes(node, NodeConstants.Types.PROJECT, NodeConstants.Types.SOURCE|NodeConstants.Types.PROJECT);
- PlanNode project = null;
- if (projects.isEmpty()) {
+ PlanNode project = NodeEditor.findNodePreOrder(node, NodeConstants.Types.PROJECT, NodeConstants.Types.SOURCE);
+ if (project == null) {
project = NodeEditor.findParent(node, NodeConstants.Types.PROJECT, NodeConstants.Types.SOURCE);
- } else {
- project = (PlanNode)projects.get(0);
}
if (project != null) {
return (List<SingleElementSymbol>)project.getProperty(NodeConstants.Info.PROJECT_COLS);
@@ -499,5 +496,9 @@
Assertion.failed("no top cols in frame"); //$NON-NLS-1$
return null;
}
+
+ public static boolean isOrderedLimit(PlanNode node) {
+ return node.getType() == NodeConstants.Types.TUPLE_LIMIT && NodeEditor.findNodePreOrder(node, NodeConstants.Types.SORT, NodeConstants.Types.PROJECT | NodeConstants.Types.SET_OP) != null;
+ }
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushAggregates.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushAggregates.java 2010-01-05 23:13:18 UTC (rev 1716)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushAggregates.java 2010-01-06 05:35:57 UTC (rev 1717)
@@ -53,6 +53,7 @@
import com.metamatrix.query.optimizer.relational.plantree.NodeEditor;
import com.metamatrix.query.optimizer.relational.plantree.NodeFactory;
import com.metamatrix.query.optimizer.relational.plantree.PlanNode;
+import com.metamatrix.query.optimizer.relational.plantree.NodeConstants.Info;
import com.metamatrix.query.resolver.util.ResolverUtil;
import com.metamatrix.query.resolver.util.ResolverVisitor;
import com.metamatrix.query.rewriter.QueryRewriter;
@@ -64,6 +65,7 @@
import com.metamatrix.query.sql.lang.Select;
import com.metamatrix.query.sql.lang.SetQuery.Operation;
import com.metamatrix.query.sql.symbol.AggregateSymbol;
+import com.metamatrix.query.sql.symbol.AliasSymbol;
import com.metamatrix.query.sql.symbol.Constant;
import com.metamatrix.query.sql.symbol.ElementSymbol;
import com.metamatrix.query.sql.symbol.Expression;
@@ -289,6 +291,26 @@
QueryMetadataInterface metadata, CapabilitiesFinder capFinder)
throws MetaMatrixComponentException, QueryPlannerException, QueryResolverException {
PlanNode originalNode = unionSource;
+ //branches other than the first need to have their projected column names updated
+ PlanNode sortNode = NodeEditor.findNodePreOrder(unionSource, NodeConstants.Types.SORT, NodeConstants.Types.SOURCE);
+ List<SingleElementSymbol> sortOrder = null;
+ if (sortNode != null) {
+ sortOrder = (List<SingleElementSymbol>)sortNode.getProperty(Info.SORT_ORDER);
+ }
+ List<SingleElementSymbol> projectCols = FrameUtil.findTopCols(unionSource);
+ for (int i = 0; i < virtualElements.size(); i++) {
+ ElementSymbol virtualElem = virtualElements.get(i);
+ SingleElementSymbol projectedSymbol = projectCols.get(i);
+ if (!projectedSymbol.getShortCanonicalName().equals(virtualElem.getShortCanonicalName())) {
+ if (sortOrder != null) {
+ int sortIndex = sortOrder.indexOf(projectedSymbol);
+ if (sortIndex > -1) {
+ updateSymbolName(sortOrder, sortIndex, virtualElem, sortOrder.get(sortIndex));
+ }
+ }
+ updateSymbolName(projectCols, i, virtualElem, projectedSymbol);
+ }
+ }
PlanNode intermediateView = NodeFactory.getNewNode(NodeConstants.Types.SOURCE);
unionSource.addAsParent(intermediateView);
unionSource = intermediateView;
@@ -357,6 +379,15 @@
}
}
+ private void updateSymbolName(List<SingleElementSymbol> projectCols, int i,
+ ElementSymbol virtualElem, SingleElementSymbol projectedSymbol) {
+ if (projectedSymbol instanceof AliasSymbol) {
+ ((AliasSymbol)projectedSymbol).setName(virtualElem.getShortCanonicalName());
+ } else {
+ projectCols.set(i, new AliasSymbol(virtualElem.getShortCanonicalName(), projectedSymbol));
+ }
+ }
+
/**
* Walk up the plan from the GROUP node. Should encounter only (optionally) a SELECT and can stop at the PROJECT node. Need to
* collect any AggregateSymbols used in the select criteria or projected columns.
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushSelectCriteria.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushSelectCriteria.java 2010-01-05 23:13:18 UTC (rev 1716)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushSelectCriteria.java 2010-01-06 05:35:57 UTC (rev 1717)
@@ -315,7 +315,7 @@
}
satisfyAccessPatterns(critNode, currentNode);
- } else if (currentNode.getType() == NodeConstants.Types.TUPLE_LIMIT && currentNode.getChildCount() == 1 && currentNode.getFirstChild().getType() == NodeConstants.Types.SORT) {
+ } else if (FrameUtil.isOrderedLimit(currentNode)) {
return currentNode;
} else if (currentNode.getType() == NodeConstants.Types.GROUP && critNode.hasBooleanProperty(NodeConstants.Info.IS_HAVING)) {
return currentNode;
@@ -329,8 +329,7 @@
throws QueryPlannerException {
//ensure that the criteria can be pushed further
- if (sourceNode.getChildCount() == 1 && sourceNode.getFirstChild().getType() == NodeConstants.Types.TUPLE_LIMIT &&
- sourceNode.getFirstChild().getChildCount() == 1 && sourceNode.getFirstChild().getFirstChild().getType() == NodeConstants.Types.SORT) {
+ if (sourceNode.getChildCount() == 1 && FrameUtil.isOrderedLimit(sourceNode.getFirstChild())) {
return false;
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java 2010-01-05 23:13:18 UTC (rev 1716)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java 2010-01-06 05:35:57 UTC (rev 1717)
@@ -327,7 +327,7 @@
//don't push criteria into an invalid location above an ordered limit - shouldn't happen
PlanNode limitNode = NodeEditor.findNodePreOrder(accessNode, NodeConstants.Types.TUPLE_LIMIT, NodeConstants.Types.SOURCE);
- if (limitNode != null && NodeEditor.findNodePreOrder(limitNode, NodeConstants.Types.SORT, NodeConstants.Types.SOURCE) != null) {
+ if (limitNode != null && FrameUtil.isOrderedLimit(limitNode)) {
return false;
}
Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRemoveOptionalJoins.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRemoveOptionalJoins.java 2010-01-05 23:13:18 UTC (rev 1716)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRemoveOptionalJoins.java 2010-01-06 05:35:57 UTC (rev 1717)
@@ -262,7 +262,7 @@
return areAggregatesCardinalityDependent(aggs);
}
case NodeConstants.Types.TUPLE_LIMIT: {
- if (parent.getFirstChild().getType() == NodeConstants.Types.SORT) {
+ if (FrameUtil.isOrderedLimit(parent)) {
return true;
}
}
Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestAggregatePushdown.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestAggregatePushdown.java 2010-01-05 23:13:18 UTC (rev 1716)
+++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestAggregatePushdown.java 2010-01-06 05:35:57 UTC (rev 1717)
@@ -49,6 +49,7 @@
caps.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, true);
caps.setCapabilitySupport(Capability.QUERY_GROUP_BY, true);
caps.setCapabilitySupport(Capability.QUERY_HAVING, true);
+ caps.setCapabilitySupport(Capability.ROW_LIMIT, true);
return caps;
}
Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptionalJoins.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptionalJoins.java 2010-01-05 23:13:18 UTC (rev 1716)
+++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptionalJoins.java 2010-01-06 05:35:57 UTC (rev 1717)
@@ -518,7 +518,7 @@
ProcessorPlan plan = TestOptimizer
.helpPlan(
"select distinct * from (SELECT pm1.g1.e3 from pm1.g1 left outer join pm1.g2 on (pm1.g1.e1 = pm1.g2.e1) order by e3 limit 10) x", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
- new String[] { "SELECT DISTINCT g_0.e3 AS c_0 FROM pm1.g1 AS g_0 LEFT OUTER JOIN pm1.g2 AS g_1 ON g_0.e1 = g_1.e1 ORDER BY c_0" }); //$NON-NLS-1$
+ new String[] { "SELECT g_0.e3 AS c_0 FROM pm1.g1 AS g_0 LEFT OUTER JOIN pm1.g2 AS g_1 ON g_0.e1 = g_1.e1 ORDER BY c_0" }); //$NON-NLS-1$
TestOptimizer.checkNodeTypes(plan, new int[] {
1, // Access
Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestAggregateProcessing.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/TestAggregateProcessing.java 2010-01-05 23:13:18 UTC (rev 1716)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestAggregateProcessing.java 2010-01-06 05:35:57 UTC (rev 1717)
@@ -33,6 +33,7 @@
import com.metamatrix.query.optimizer.TestAggregatePushdown;
import com.metamatrix.query.optimizer.TestOptimizer;
+import com.metamatrix.query.optimizer.capabilities.BasicSourceCapabilities;
import com.metamatrix.query.optimizer.capabilities.FakeCapabilitiesFinder;
import com.metamatrix.query.sql.lang.Command;
import com.metamatrix.query.unittest.FakeMetadataFacade;
@@ -269,5 +270,35 @@
helpProcess(plan, dataManager, expected);
}
+
+ @Test public void testUnionAggregatePushdown() {
+ Command command = helpParse("select count(*), max(e3) from (select e1, e2, e3 from pm1.g1 union all (select convert(e2, string) as a, e2, e3 from pm2.g2 order by a limit 10)) x group by e1, e2"); //$NON-NLS-1$
+
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ capFinder.addCapabilities("pm1", TestAggregatePushdown.getAggregateCapabilities()); //$NON-NLS-1$
+ BasicSourceCapabilities bac = TestAggregatePushdown.getAggregateCapabilities();
+ bac.setFunctionSupport("convert", true); //$NON-NLS-1$
+ capFinder.addCapabilities("pm2", bac); //$NON-NLS-1$
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+
+ dataManager.addData("SELECT v_0.c_1, v_0.c_0, COUNT(*), MAX(v_0.c_2) FROM (SELECT g_0.e2 AS c_0, g_0.e1 AS c_1, g_0.e3 AS c_2 FROM pm1.g1 AS g_0) AS v_0 GROUP BY v_0.c_0, v_0.c_1", //$NON-NLS-1$
+ new List[] {
+ Arrays.asList(Integer.valueOf(2), "2", Integer.valueOf(2), Boolean.FALSE), //$NON-NLS-1$
+ Arrays.asList(Integer.valueOf(1), "1", Integer.valueOf(3), Boolean.TRUE), //$NON-NLS-1$
+ });
+ dataManager.addData("SELECT v_0.c_1, v_0.c_0, COUNT(*), MAX(v_0.c_2) FROM (SELECT g_0.e2 AS c_0, convert(g_0.e2, string) AS c_1, g_0.e3 AS c_2 FROM pm2.g2 AS g_0 ORDER BY c_1 LIMIT 10) AS v_0 GROUP BY v_0.c_0, v_0.c_1", //$NON-NLS-1$
+ new List[] {
+ Arrays.asList(Integer.valueOf(1), "1", Integer.valueOf(4), Boolean.FALSE), //$NON-NLS-1$
+ });
+
+ ProcessorPlan plan = helpGetPlan(command, FakeMetadataFactory.example1Cached(), capFinder);
+
+ List[] expected = new List[] {
+ Arrays.asList(Integer.valueOf(7), Boolean.TRUE),
+ Arrays.asList(Integer.valueOf(2), Boolean.FALSE),
+ };
+
+ helpProcess(plan, dataManager, expected);
+ }
}
Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java 2010-01-05 23:13:18 UTC (rev 1716)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java 2010-01-06 05:35:57 UTC (rev 1717)
@@ -156,8 +156,7 @@
if(DEBUG) System.out.println("\n" + process); //$NON-NLS-1$
//per defect 10022, clone this plan before processing, just to make sure
//a cloned plan with correlated subquery references (or any cloned plan) can be processed
- ProcessorPlan cloned = (ProcessorPlan)process.clone();
- process = cloned;
+ process = process.clone();
assertNotNull("Output elements of process plan are null", process.getOutputElements()); //$NON-NLS-1$
@@ -183,7 +182,7 @@
public static void helpProcess(ProcessorPlan plan, CommandContext context, ProcessorDataManager dataManager, List[] expectedResults) {
try {
- ProcessorPlan clonePlan = (ProcessorPlan) plan.clone();
+ ProcessorPlan clonePlan = plan.clone();
// Process twice to test reset and clone
doProcess(plan, dataManager, expectedResults, context);
Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestQueryProcessor.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/TestQueryProcessor.java 2010-01-05 23:13:18 UTC (rev 1716)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestQueryProcessor.java 2010-01-06 05:35:57 UTC (rev 1717)
@@ -29,17 +29,13 @@
import junit.framework.TestCase;
-import com.metamatrix.api.exception.MetaMatrixComponentException;
-import com.metamatrix.api.exception.MetaMatrixProcessingException;
import com.metamatrix.common.buffer.BlockedException;
import com.metamatrix.common.buffer.BufferManager;
import com.metamatrix.common.buffer.BufferManagerFactory;
import com.metamatrix.common.buffer.TupleBatch;
import com.metamatrix.common.buffer.TupleBuffer;
import com.metamatrix.common.buffer.TupleSource;
-import com.metamatrix.common.buffer.TupleSourceNotFoundException;
import com.metamatrix.core.MetaMatrixCoreException;
-import com.metamatrix.query.processor.BatchCollector.BatchHandler;
import com.metamatrix.query.sql.symbol.ElementSymbol;
import com.metamatrix.query.util.CommandContext;
Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/relational/TestRelationalPlan.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/relational/TestRelationalPlan.java 2010-01-05 23:13:18 UTC (rev 1716)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/relational/TestRelationalPlan.java 2010-01-06 05:35:57 UTC (rev 1717)
@@ -22,13 +22,10 @@
package com.metamatrix.query.processor.relational;
-import java.util.ArrayList;
+import java.util.List;
-import junit.framework.*;
+import junit.framework.TestCase;
-import com.metamatrix.api.exception.MetaMatrixComponentException;
-import com.metamatrix.api.exception.MetaMatrixException;
-import com.metamatrix.common.buffer.BlockedException;
import com.metamatrix.common.buffer.TupleBatch;
/**
@@ -43,54 +40,12 @@
super(arg0);
}
- public void testNoRowsFirstBatch() {
- RelationalNode node = new RelationalNode(0) {
- public TupleBatch nextBatchDirect() throws BlockedException, MetaMatrixComponentException {
- TupleBatch batch = new TupleBatch(1, new ArrayList());
- batch.setTerminationFlag(true);
- return batch;
- }
-
- public Object clone(){
- throw new UnsupportedOperationException();
- }
- };
+ public void testNoRowsFirstBatch() throws Exception {
+ RelationalNode node = new FakeRelationalNode(0, new List[0]);
- try {
- RelationalPlan plan = new RelationalPlan(node);
- TupleBatch batch = plan.nextBatch();
- assertTrue("Did not get terminator batch", batch.getTerminationFlag()); //$NON-NLS-1$
-
- } catch(MetaMatrixException e) {
- e.printStackTrace();
- fail("Got unexpected exception: " + e.getFullMessage()); //$NON-NLS-1$
- }
-
-
+ RelationalPlan plan = new RelationalPlan(node);
+ TupleBatch batch = plan.nextBatch();
+ assertTrue("Did not get terminator batch", batch.getTerminationFlag()); //$NON-NLS-1$
}
- public void testNoRowsLaterBatch() {
- RelationalNode node = new RelationalNode(0) {
- public TupleBatch nextBatchDirect() throws BlockedException, MetaMatrixComponentException {
- TupleBatch batch = new TupleBatch(3, new ArrayList());
- batch.setTerminationFlag(true);
- return batch;
- }
-
- public Object clone(){
- throw new UnsupportedOperationException();
- }
- };
-
- try {
- RelationalPlan plan = new RelationalPlan(node);
- TupleBatch batch = plan.nextBatch();
- assertTrue("Did not get terminator batch", batch.getTerminationFlag()); //$NON-NLS-1$
-
- } catch(MetaMatrixException e) {
- e.printStackTrace();
- fail("Got unexpected exception: " + e.getFullMessage()); //$NON-NLS-1$
- }
- }
-
}
More information about the teiid-commits
mailing list