[teiid-commits] teiid SVN: r3328 - 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
Fri Jul 22 14:50:02 EDT 2011


Author: shawkins
Date: 2011-07-22 14:50:01 -0400 (Fri, 22 Jul 2011)
New Revision: 3328

Modified:
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
Log:
TEIID-1665 optimizing grouping of all constants

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java	2011-07-22 16:26:08 UTC (rev 3327)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java	2011-07-22 18:50:01 UTC (rev 3328)
@@ -165,14 +165,6 @@
 		        assignOutputElements(root.getLastChild(), outputElements, metadata, capFinder, rules, analysisRecord, context);
 		        break;
 		    case NodeConstants.Types.SOURCE: {
-		    	if (outputElements.isEmpty()) {
-		    		//we cannot completely filter an implicit grouping (this is a corner case)
-		            PlanNode grouping = NodeEditor.findNodePreOrder(root.getFirstChild(), NodeConstants.Types.GROUP, NodeConstants.Types.SOURCE | NodeConstants.Types.JOIN);
-		    		if (grouping != null && !grouping.hasCollectionProperty(NodeConstants.Info.GROUP_COLS)) {
-		    			SymbolMap symbolMap = (SymbolMap) root.getProperty(NodeConstants.Info.SYMBOL_MAP);
-		                outputElements.add(symbolMap.getKeys().get(0).clone());
-		    		}
-	            }
 		        outputElements = (List<SingleElementSymbol>)determineSourceOutput(root, outputElements, metadata, capFinder);
 	            root.setProperty(NodeConstants.Info.OUTPUT_COLS, outputElements);
 	            List<SingleElementSymbol> childElements = filterVirtualElements(root, outputElements, metadata);
@@ -227,24 +219,27 @@
 	            	PlanNode next = root.getFirstChild();
 	            	NodeEditor.removeChildNode(root.getParent(), root);
 	            	
-	            	if (old.hasCollectionProperty(Info.GROUP_COLS)) {
-	    				SymbolMap symbolMap = (SymbolMap) old.getProperty(NodeConstants.Info.SYMBOL_MAP);
-	    				FrameUtil.convertFrame(next.getParent(), symbolMap.asMap().keySet().iterator().next().getGroupSymbol(), null, symbolMap.asMap(), metadata);
-	    				PlanNode limit = NodeFactory.getNewNode(NodeConstants.Types.TUPLE_LIMIT);
-	    				limit.setProperty(Info.MAX_TUPLE_LIMIT, new Constant(1));
-	    				PlanNode parent = next.getParent();
-	    				while (parent.getParent() != null && parent.getParent().getType() != NodeConstants.Types.SOURCE) {
-	    					parent = parent.getParent();
-	    				}
+            		SymbolMap symbolMap = (SymbolMap) old.getProperty(NodeConstants.Info.SYMBOL_MAP);
+    				FrameUtil.convertFrame(next.getParent(), symbolMap.asMap().keySet().iterator().next().getGroupSymbol(), null, symbolMap.asMap(), metadata);
+    				PlanNode parent = next.getParent();
+    				while (parent.getParent() != null && parent.getParent().getType() != NodeConstants.Types.SOURCE) {
+    					parent = parent.getParent();
+    				}
+    				if (!old.hasCollectionProperty(Info.GROUP_COLS)) {
+    					//just lob off everything under the projection
+    					PlanNode project = NodeEditor.findNodePreOrder(parent, NodeConstants.Types.PROJECT);
+    					project.removeAllChildren();
+    				} else {
+    					PlanNode limit = NodeFactory.getNewNode(NodeConstants.Types.TUPLE_LIMIT);
+        				limit.setProperty(Info.MAX_TUPLE_LIMIT, new Constant(1));
 	    				if (!rules.contains(RuleConstants.PUSH_LIMIT)) {
 	    					rules.push(RuleConstants.PUSH_LIMIT);
 	    				}
-    					parent.getFirstChild().addAsParent(limit);
-		            	execute(parent, metadata, capFinder, rules, analysisRecord, context);
-		            	return;
-	            	} 
-	            	root = next;
-	            }
+						parent.getFirstChild().addAsParent(limit);
+    				}
+	            	execute(parent, metadata, capFinder, rules, analysisRecord, context);
+	            	return;
+            	}
 	            
 	            // Call children recursively
 	            if(root.getChildCount() == 1) {

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java	2011-07-22 16:26:08 UTC (rev 3327)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java	2011-07-22 18:50:01 UTC (rev 3328)
@@ -984,7 +984,7 @@
 
     @Test public void testDefect5282_2() {
         helpPlan("select count(*) FROM vm1.a4", example1(), //$NON-NLS-1$
-            new String[] { "SELECT 1 FROM pm1.g1" } );     //$NON-NLS-1$
+            new String[] { } );     //$NON-NLS-1$
     }
 
     @Test public void testDefect5282_3() {
@@ -6604,10 +6604,9 @@
         bac.setCapabilitySupport(Capability.QUERY_FROM_INLINE_VIEWS, true);
         bac.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, true);
         bac.setCapabilitySupport(Capability.QUERY_GROUP_BY, true);
-        helpPlan("select count(*) from agg3", metadata, new String[] {"SELECT COUNT(*) FROM (SELECT COUNT(*) AS c_0 FROM BQT1.SmallA AS g_0) AS v_0"}, new DefaultCapabilitiesFinder(bac), ComparisonMode.EXACT_COMMAND_STRING);
+        helpPlan("select count(*) from agg3", metadata, new String[] {}, new DefaultCapabilitiesFinder(bac), ComparisonMode.EXACT_COMMAND_STRING);
     }
     
-    
     @Test public void testMergeGroupBy1() throws Exception {
     	BasicSourceCapabilities caps = new BasicSourceCapabilities();
     	caps.setCapabilitySupport(Capability.ROW_LIMIT, true);



More information about the teiid-commits mailing list