[teiid-commits] teiid SVN: r925 - in trunk/engine/src: test/java/com/metamatrix/query/optimizer/relational/rules and 1 other directory.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue May 12 22:17:35 EDT 2009


Author: shawkins
Date: 2009-05-12 22:17:35 -0400 (Tue, 12 May 2009)
New Revision: 925

Modified:
   trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushSelectCriteria.java
   trunk/engine/src/test/java/com/metamatrix/query/optimizer/relational/rules/TestRulePushSelectCriteria.java
Log:
TEIID-584 preventing access nodes from being accidently pushed across an access node.

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	2009-05-13 01:45:00 UTC (rev 924)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RulePushSelectCriteria.java	2009-05-13 02:17:35 UTC (rev 925)
@@ -564,8 +564,13 @@
             copyNode.setProperty(NodeConstants.Info.IS_HAVING, Boolean.TRUE);
         }
 
-        FrameUtil.convertNode(copyNode, sourceGroup, null, symbolMap.asMap());        
-		projectNode.getFirstChild().addAsParent(copyNode);
+        FrameUtil.convertNode(copyNode, sourceGroup, null, symbolMap.asMap());  
+        PlanNode intermediateParent = NodeEditor.findParent(projectNode, NodeConstants.Types.ACCESS, NodeConstants.Types.SOURCE | NodeConstants.Types.SET_OP);
+        if (intermediateParent != null) {
+            intermediateParent.addAsParent(copyNode);
+        } else {
+        	projectNode.getFirstChild().addAsParent(copyNode);
+        }
 		return true;
     }
 

Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/relational/rules/TestRulePushSelectCriteria.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/optimizer/relational/rules/TestRulePushSelectCriteria.java	2009-05-13 01:45:00 UTC (rev 924)
+++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/relational/rules/TestRulePushSelectCriteria.java	2009-05-13 02:17:35 UTC (rev 925)
@@ -22,27 +22,69 @@
 
 package com.metamatrix.query.optimizer.relational.rules;
 
+import static org.junit.Assert.*;
+
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
-import junit.framework.TestCase;
+import org.junit.Test;
 
+import com.metamatrix.query.analysis.AnalysisRecord;
+import com.metamatrix.query.optimizer.TestOptimizer;
+import com.metamatrix.query.optimizer.capabilities.DefaultCapabilitiesFinder;
+import com.metamatrix.query.optimizer.relational.GenerateCanonical;
+import com.metamatrix.query.optimizer.relational.PlanHints;
+import com.metamatrix.query.optimizer.relational.RuleStack;
+import com.metamatrix.query.optimizer.relational.plantree.NodeConstants;
+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.parser.QueryParser;
+import com.metamatrix.query.sql.lang.Command;
 import com.metamatrix.query.sql.symbol.ElementSymbol;
+import com.metamatrix.query.sql.symbol.GroupSymbol;
+import com.metamatrix.query.sql.symbol.SingleElementSymbol;
+import com.metamatrix.query.sql.util.SymbolMap;
+import com.metamatrix.query.unittest.FakeMetadataFacade;
+import com.metamatrix.query.unittest.FakeMetadataFactory;
+import com.metamatrix.query.util.CommandContext;
 
-public class TestRulePushSelectCriteria extends TestCase {
+public class TestRulePushSelectCriteria {
     
-    public void testElementsInCritieria() throws Exception {
+    @Test public void testElementsInCritieria() throws Exception {
         String criteria = "e1 = '1' OR ((e1 = '2' OR e1 = '4') AND e2 = 3)"; //$NON-NLS-1$
         Set<ElementSymbol> expected = new HashSet<ElementSymbol>(Arrays.asList(new ElementSymbol("e1"))); //$NON-NLS-1$
         assertEquals(expected, RulePushSelectCriteria.getElementsIncriteria(QueryParser.getQueryParser().parseCriteria(criteria)));
     }
     
-    public void testElementsInCritieria1() throws Exception {
+    @Test public void testElementsInCritieria1() throws Exception {
         String criteria = "e1 = '1' and ((e1 = '2' OR e1 = '4') AND e2 = 3) or e2 is null"; //$NON-NLS-1$
         Set<ElementSymbol> expected = new HashSet<ElementSymbol>(Arrays.asList(new ElementSymbol("e2"))); //$NON-NLS-1$
         assertEquals(expected, RulePushSelectCriteria.getElementsIncriteria(QueryParser.getQueryParser().parseCriteria(criteria)));
     }
+    
+    @Test public void testPushAcrossFrameWithAccessNode() throws Exception {
+    	FakeMetadataFacade metadata = FakeMetadataFactory.example1Cached();
+    	Command command = TestOptimizer.helpGetCommand("select * from (select * from pm1.g1 union select * from pm1.g2) x where e1 = 1", metadata, null); //$NON-NLS-1$
+    	Command subCommand = TestOptimizer.helpGetCommand("select * from pm1.g1 union select * from pm1.g2", metadata, null); //$NON-NLS-1$
+    	PlanNode root = GenerateCanonical.generatePlan(command, new PlanHints(), metadata);
+    	PlanNode child = GenerateCanonical.generatePlan(subCommand, new PlanHints(), metadata);
+    	PlanNode sourceNode = NodeEditor.findNodePreOrder(root, NodeConstants.Types.SOURCE);
+    	sourceNode.addFirstChild(child);
+        sourceNode.setProperty(NodeConstants.Info.SYMBOL_MAP, SymbolMap.createSymbolMap(sourceNode.getGroups().iterator().next(), (List<SingleElementSymbol>)child.getFirstChild().getProperty(Info.PROJECT_COLS)));
+    	//add a dummy access node
+        PlanNode accessNode = NodeFactory.getNewNode(NodeConstants.Types.ACCESS);
+        accessNode.addGroups(child.getFirstChild().getGroups());
+    	child.getFirstChild().addAsParent(accessNode);
+    	
+    	new RulePushSelectCriteria().execute(root, metadata, new DefaultCapabilitiesFinder(), new RuleStack(), AnalysisRecord.createNonRecordingRecord(), new CommandContext());
+    	// the select node should still be above the access node
+    	accessNode = NodeEditor.findNodePreOrder(root, NodeConstants.Types.ACCESS);
+    	assertEquals(NodeConstants.Types.SELECT, accessNode.getParent().getType());
+    	assertNull(NodeEditor.findNodePreOrder(accessNode, NodeConstants.Types.SELECT));
+    }
 
 }




More information about the teiid-commits mailing list