[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