[teiid-commits] teiid SVN: r1889 - in trunk/engine/src: test/java/com/metamatrix/query/processor and 1 other directory.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue Mar 2 23:42:57 EST 2010


Author: shawkins
Date: 2010-03-02 23:42:56 -0500 (Tue, 02 Mar 2010)
New Revision: 1889

Modified:
   trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleAssignOutputElements.java
   trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleMergeVirtual.java
   trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
Log:
TEIID-989 expanding on the last fix to ensure that only source supporting unrelated seach will get the pushdown.

Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleAssignOutputElements.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleAssignOutputElements.java	2010-03-03 03:29:06 UTC (rev 1888)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleAssignOutputElements.java	2010-03-03 04:42:56 UTC (rev 1889)
@@ -38,6 +38,7 @@
 import com.metamatrix.query.metadata.QueryMetadataInterface;
 import com.metamatrix.query.metadata.SupportConstants;
 import com.metamatrix.query.optimizer.capabilities.CapabilitiesFinder;
+import com.metamatrix.query.optimizer.capabilities.SourceCapabilities.Capability;
 import com.metamatrix.query.optimizer.relational.OptimizerRule;
 import com.metamatrix.query.optimizer.relational.RuleStack;
 import com.metamatrix.query.optimizer.relational.plantree.NodeConstants;
@@ -160,7 +161,7 @@
 		        assignOutputElements(root.getLastChild(), outputElements, metadata, capFinder, rules, analysisRecord, context);
 		        break;
 		    case NodeConstants.Types.SOURCE: {
-		        outputElements = (List<SingleElementSymbol>)determineSourceOutput(root, outputElements);
+		        outputElements = (List<SingleElementSymbol>)determineSourceOutput(root, outputElements, metadata, capFinder);
 	            root.setProperty(NodeConstants.Info.OUTPUT_COLS, outputElements);
 	            List<SingleElementSymbol> childElements = filterVirtualElements(root, outputElements, metadata);
 	            SymbolMap symbolMap = (SymbolMap)root.getProperty(NodeConstants.Info.SYMBOL_MAP);
@@ -237,9 +238,13 @@
      * So, in this case filtering should not occur.  In fact the output columns
      * that were set on root above are filtered, but we actually want all the
      * virtual elements - so just reset it and proceed as before
+     * @throws MetaMatrixComponentException 
+     * @throws QueryMetadataException 
      */
     static List<? extends SingleElementSymbol> determineSourceOutput(PlanNode root,
-                                           List<SingleElementSymbol> outputElements) {
+                                           List<SingleElementSymbol> outputElements,
+                                           QueryMetadataInterface metadata,
+                                           CapabilitiesFinder capFinder) throws QueryMetadataException, MetaMatrixComponentException {
         PlanNode virtualRoot = root.getLastChild();
         
         if(hasDupRemoval(virtualRoot)) {
@@ -247,7 +252,39 @@
             SymbolMap symbolMap = (SymbolMap) root.getProperty(NodeConstants.Info.SYMBOL_MAP);
             return symbolMap.getKeys();
         } 
-    	return outputElements;
+        PlanNode limit = NodeEditor.findNodePreOrder(root, NodeConstants.Types.TUPLE_LIMIT, NodeConstants.Types.PROJECT);
+		if (limit == null) {
+			return outputElements;
+		}
+        //reset the output elements to be the output columns + what's required by the sort
+		PlanNode sort = NodeEditor.findNodePreOrder(limit, NodeConstants.Types.SORT, NodeConstants.Types.PROJECT);
+        if (sort == null) {
+        	return outputElements;
+        }
+        PlanNode access = NodeEditor.findParent(sort, NodeConstants.Types.ACCESS);
+        if (sort.hasBooleanProperty(NodeConstants.Info.UNRELATED_SORT) ||
+        		(access != null && capFinder != null && CapabilitiesUtil.supports(Capability.QUERY_ORDERBY_UNRELATED, RuleRaiseAccess.getModelIDFromAccess(access, metadata), metadata, capFinder))) {
+    		return outputElements;
+        }
+        OrderBy sortOrder = (OrderBy)sort.getProperty(NodeConstants.Info.SORT_ORDER);
+        List<SingleElementSymbol> topCols = FrameUtil.findTopCols(sort);
+        
+        SymbolMap symbolMap = (SymbolMap)root.getProperty(NodeConstants.Info.SYMBOL_MAP);
+        
+        List<ElementSymbol> symbolOrder = symbolMap.getKeys();
+        
+        for (OrderByItem item : sortOrder.getOrderByItems()) {
+            final Expression expr = item.getSymbol();
+            int index = topCols.indexOf(expr);
+            if (index < 0) {
+            	continue;
+            }
+            ElementSymbol symbol = symbolOrder.get(index);
+            if (!outputElements.contains(symbol)) {
+                outputElements.add(symbol);
+            }
+        }
+        return outputElements;
     }
     
     /**

Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleMergeVirtual.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleMergeVirtual.java	2010-03-03 03:29:06 UTC (rev 1888)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleMergeVirtual.java	2010-03-03 04:42:56 UTC (rev 1889)
@@ -78,7 +78,7 @@
 
     static PlanNode doMerge(PlanNode frame,
                             PlanNode root,
-                            QueryMetadataInterface metadata) throws QueryPlannerException {
+                            QueryMetadataInterface metadata) throws QueryPlannerException, QueryMetadataException, MetaMatrixComponentException {
 
         GroupSymbol virtualGroup = frame.getGroups().iterator().next();
 
@@ -178,11 +178,13 @@
 
     /**
      * Removes source layers that only do a simple projection of the elements below.
+     * @throws MetaMatrixComponentException 
+     * @throws QueryMetadataException 
      */
     private static PlanNode checkForSimpleProjection(PlanNode frame,
                                                      PlanNode root,
                                                      PlanNode parentProject,
-                                                     QueryMetadataInterface metadata) {
+                                                     QueryMetadataInterface metadata) throws QueryMetadataException, MetaMatrixComponentException {
         // check that the parent only performs projection
         PlanNode nodeToCheck = parentProject.getFirstChild();
         while (nodeToCheck != frame) {
@@ -200,7 +202,7 @@
             return root;
         }
         
-        List<? extends SingleElementSymbol> requiredElements = getNecessaryOutput(frame);
+        List<? extends SingleElementSymbol> requiredElements = RuleAssignOutputElements.determineSourceOutput(frame, new ArrayList<SingleElementSymbol>(), metadata, null);
         List<SingleElementSymbol> selectSymbols = (List<SingleElementSymbol>)parentProject.getProperty(NodeConstants.Info.PROJECT_COLS);
 
         // check that it only performs simple projection and that all required symbols are projected
@@ -273,42 +275,6 @@
         return root;
     }
     
-	private static List<? extends SingleElementSymbol> getNecessaryOutput(PlanNode root) {
-		List<SingleElementSymbol> outputElements = new ArrayList<SingleElementSymbol>();
-		List<? extends SingleElementSymbol> result = RuleAssignOutputElements.determineSourceOutput(root, outputElements);
-		if (!result.isEmpty()) {
-			return result;
-		}
-		PlanNode limit = NodeEditor.findNodePreOrder(root, NodeConstants.Types.TUPLE_LIMIT, NodeConstants.Types.PROJECT);
-		if (limit == null) {
-			return outputElements;
-		}
-        //reset the output elements to be the output columns + what's required by the sort
-		PlanNode sort = NodeEditor.findNodePreOrder(limit, NodeConstants.Types.SORT, NodeConstants.Types.PROJECT);
-        if (sort == null) {
-        	return outputElements;
-        }
-        OrderBy sortOrder = (OrderBy)sort.getProperty(NodeConstants.Info.SORT_ORDER);
-        List<SingleElementSymbol> topCols = FrameUtil.findTopCols(sort);
-        
-        SymbolMap symbolMap = (SymbolMap)root.getProperty(NodeConstants.Info.SYMBOL_MAP);
-        
-        List<ElementSymbol> symbolOrder = symbolMap.getKeys();
-        
-        for (OrderByItem item : sortOrder.getOrderByItems()) {
-            final Expression expr = item.getSymbol();
-            int index = topCols.indexOf(expr);
-            if (index < 0) {
-            	continue;
-            }
-            ElementSymbol symbol = symbolOrder.get(index);
-            if (!outputElements.contains(symbol)) {
-                outputElements.add(symbol);
-            }
-        }
-        return outputElements;
-	}
-
     /**
      * Check to ensure that we are not projecting a subquery or null dependent expressions
      */

Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java	2010-03-03 03:29:06 UTC (rev 1888)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java	2010-03-03 04:42:56 UTC (rev 1889)
@@ -6990,7 +6990,27 @@
         sampleData1(manager);
         helpProcess(plan, manager, expected);
     }
+    
+    @Test public void testSortWithLimit4() {
+        String sql = "select c from (select pm1.g1.e1 a, pm1.g1.e2 b, pm1.g1.e3 c from pm1.g1 order by b limit 1) x"; //$NON-NLS-1$
+        
+        FakeMetadataFacade metadata = FakeMetadataFactory.example1Cached();
+        
+        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities();
+        caps.setCapabilitySupport(Capability.QUERY_ORDERBY_UNRELATED, false);
+        
+        ProcessorPlan plan = helpGetPlan(helpParse(sql), metadata, new DefaultCapabilitiesFinder(caps));
+        
+        List[] expected = new List[] {
+                Arrays.asList(new Object[] { Boolean.FALSE }),
+        };
 
+        FakeDataManager manager = new FakeDataManager();
+        sampleData1(manager);
+        helpProcess(plan, manager, expected);
+        assertEquals("SELECT g_0.e3 AS c_0, g_0.e2 AS c_1 FROM pm1.g1 AS g_0 ORDER BY c_1", manager.getQueries().iterator().next()); //$NON-NLS-1$
+    }
+
     @Test public void testCountWithHaving() {
         String sql = "select e1, count(*) from pm1.g1 group by e1 having count(*) > 1"; //$NON-NLS-1$
         



More information about the teiid-commits mailing list