[teiid-commits] teiid SVN: r3325 - 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 06:33:31 EDT 2011


Author: shawkins
Date: 2011-07-22 06:33:31 -0400 (Fri, 22 Jul 2011)
New Revision: 3325

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 10:29:03 UTC (rev 3324)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java	2011-07-22 10:33:31 UTC (rev 3325)
@@ -42,7 +42,9 @@
 import org.teiid.query.optimizer.relational.RuleStack;
 import org.teiid.query.optimizer.relational.plantree.NodeConstants;
 import org.teiid.query.optimizer.relational.plantree.NodeEditor;
+import org.teiid.query.optimizer.relational.plantree.NodeFactory;
 import org.teiid.query.optimizer.relational.plantree.PlanNode;
+import org.teiid.query.optimizer.relational.plantree.NodeConstants.Info;
 import org.teiid.query.processor.relational.RelationalNode;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.Criteria;
@@ -51,6 +53,7 @@
 import org.teiid.query.sql.lang.StoredProcedure;
 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;
 import org.teiid.query.sql.symbol.ExpressionSymbol;
@@ -218,6 +221,30 @@
 		    	}
 	            
 	            List<SingleElementSymbol> requiredInput = collectRequiredInputSymbols(root);
+	            //targeted optimization for unnecessary aggregation
+	            if (root.getType() == NodeConstants.Types.GROUP && root.hasBooleanProperty(Info.IS_OPTIONAL) && NodeEditor.findParent(root, NodeConstants.Types.ACCESS) == null) {
+	            	PlanNode old = root;
+	            	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();
+	    				}
+	    				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;
+	            }
 	            
 	            // Call children recursively
 	            if(root.getChildCount() == 1) {
@@ -482,7 +509,7 @@
 				    	ElementCollectorVisitor.getElements(expression, requiredSymbols);
                     }
 				}
-				
+				boolean hasAggregate = false;
 				SymbolMap symbolMap = (SymbolMap) node.getProperty(NodeConstants.Info.SYMBOL_MAP);
 				
 				// Take credit for creating any aggregates that are needed above
@@ -491,7 +518,7 @@
 					Expression ex = symbolMap.getMappedExpression((ElementSymbol) outputSymbol);
 					if(ex instanceof AggregateSymbol) {
 					    AggregateSymbol agg = (AggregateSymbol)ex;
-					    
+					    hasAggregate = true;					    
 	                    Expression aggExpr = agg.getExpression();
 	                    if(aggExpr != null) {
 	                    	ElementCollectorVisitor.getElements(aggExpr, requiredSymbols);
@@ -506,7 +533,9 @@
 	                    }
 					}
 				}
-
+				if (requiredSymbols.isEmpty() && !hasAggregate) {
+					node.setProperty(Info.IS_OPTIONAL, true);
+				}
 				break;
 		}
 

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 10:29:03 UTC (rev 3324)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java	2011-07-22 10:33:31 UTC (rev 3325)
@@ -6607,6 +6607,34 @@
         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);
     }
     
+    
+    @Test public void testMergeGroupBy1() throws Exception {
+    	BasicSourceCapabilities caps = new BasicSourceCapabilities();
+    	caps.setCapabilitySupport(Capability.ROW_LIMIT, true);
+    	caps.setFunctionSupport("+", true); //$NON-NLS-1$
+        ProcessorPlan plan = TestOptimizer.helpPlan("SELECT a, b FROM (select 1 as a, 2 as b from pm1.g1) as x group by a, b", //$NON-NLS-1$
+                                      RealMetadataFactory.example1Cached(), null, new DefaultCapabilitiesFinder(caps),
+                                      new String[] {
+                                          "SELECT pm1.g1.e1 FROM pm1.g1 LIMIT 1"}, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+    
+        checkNodeTypes(plan, new int[] {
+                1,      // Access
+                0,      // DependentAccess
+                0,      // DependentSelect
+                0,      // DependentProject
+                0,      // DupRemove
+                0,      // Grouping
+                0,      // NestedLoopJoinStrategy
+                0,      // MergeJoinStrategy
+                0,      // Null
+                0,      // PlanExecution
+                1,      // Project
+                0,      // Select
+                0,      // Sort
+                0       // UnionAll
+            });                                    
+    }
+    
 	public static final boolean DEBUG = false;
 
 }



More information about the teiid-commits mailing list