[teiid-commits] teiid SVN: r4117 - in trunk/engine/src: main/java/org/teiid/query/processor/proc and 1 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Wed May 16 17:19:08 EDT 2012


Author: shawkins
Date: 2012-05-16 17:19:08 -0400 (Wed, 16 May 2012)
New Revision: 4117

Modified:
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanProcedures.java
   trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java
   trunk/engine/src/main/java/org/teiid/query/processor/proc/CreateCursorResultSetInstruction.java
   trunk/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java
Log:
TEIID-2048 fix for proc relational dep out parameter

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanProcedures.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanProcedures.java	2012-05-16 21:19:02 UTC (rev 4116)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePlanProcedures.java	2012-05-16 21:19:08 UTC (rev 4117)
@@ -82,29 +82,28 @@
                 continue;
             }
 
-            HashSet inputSymbols = new HashSet();
-            List inputReferences = new LinkedList();
+            HashSet<ElementSymbol> inputSymbols = new HashSet<ElementSymbol>();
+            List<Reference> inputReferences = new LinkedList<Reference>();
             
             PlanNode critNode = node.getParent();
             
-            List conjuncts = new LinkedList();
-            HashSet coveredParams = new HashSet();
+            List<Criteria> conjuncts = new LinkedList<Criteria>();
+            HashSet<ElementSymbol> coveredParams = new HashSet<ElementSymbol>();
             //List preExecNodes = new LinkedList();
                         
-            for (Iterator params = proc.getInputParameters().iterator(); params.hasNext();) {
-                SPParameter param = (SPParameter)params.next();
+            for (Iterator<SPParameter> params = proc.getInputParameters().iterator(); params.hasNext();) {
+                SPParameter param = params.next();
                 ElementSymbol symbol = param.getParameterSymbol();
                 Expression input = param.getExpression();
-                inputReferences.add(input);
+                inputReferences.add((Reference)input);
                 inputSymbols.add(symbol);
             }
             
             findInputNodes(inputSymbols, critNode, conjuncts, coveredParams);
             
-            List defaults = new LinkedList();
+            List<Expression> defaults = new LinkedList<Expression>();
             
-            for (Iterator params = inputReferences.iterator(); params.hasNext();) {
-                Reference ref = (Reference)params.next(); 
+            for (Reference ref : inputReferences) {
                 ElementSymbol symbol = ref.getExpression();
                 
                 Expression defaultValue = null;
@@ -145,9 +144,9 @@
         return plan;
     }
 
-    private void findInputNodes(final HashSet inputs,
+    private void findInputNodes(final HashSet<ElementSymbol> inputs,
                                PlanNode critNode,
-                               final List conjuncts, final Set params) {
+                               final List<Criteria> conjuncts, final Set<ElementSymbol> params) {
         
         while (critNode.getType() == NodeConstants.Types.SELECT) {
             final PlanNode currentNode = critNode;
@@ -209,9 +208,9 @@
                     return false;
                 }
                 
-                boolean checkForAnyInput(Collection expressions) {
-                    for (Iterator exprs = expressions.iterator(); exprs.hasNext();) {
-                        if (checkForAnyInput((Expression)exprs.next())) {
+                boolean checkForAnyInput(Collection<Expression> expressions) {
+                	for (Expression expr : expressions) {
+                        if (checkForAnyInput(expr)) {
                             return true;
                         }
                     }

Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java	2012-05-16 21:19:02 UTC (rev 4116)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java	2012-05-16 21:19:08 UTC (rev 4117)
@@ -618,6 +618,15 @@
         }
 
         FrameUtil.convertNode(copyNode, sourceGroup, null, symbolMap.asMap(), metadata, true);  
+        
+        //any proc relational criteria that is not input criteria should stay above the source
+        if (sourceGroup.isProcedure() && !copyNode.getGroups().isEmpty()) {
+        	if (this.createdNodes != null) {
+        		this.createdNodes.remove(this.createdNodes.size() - 1);
+        	}
+        	return false;
+        }
+        
         PlanNode intermediateParent = NodeEditor.findParent(projectNode, NodeConstants.Types.ACCESS, NodeConstants.Types.SOURCE | NodeConstants.Types.SET_OP);
         if (intermediateParent != null) {
             intermediateParent.addAsParent(copyNode);

Modified: trunk/engine/src/main/java/org/teiid/query/processor/proc/CreateCursorResultSetInstruction.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/CreateCursorResultSetInstruction.java	2012-05-16 21:19:02 UTC (rev 4116)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/CreateCursorResultSetInstruction.java	2012-05-16 21:19:08 UTC (rev 4117)
@@ -71,9 +71,9 @@
         if (update) {
         	boolean hasNext = procEnv.iterateCursor(rsName);
     		if (hasNext) {
-    			procEnv.getContext().getVariableContext().setValue(ProcedurePlan.ROWCOUNT, procEnv.getCurrentRow(rsName).get(0));
+    			procEnv.getCurrentVariableContext().setValue(ProcedurePlan.ROWCOUNT, procEnv.getCurrentRow(rsName).get(0));
     		} else {
-    			procEnv.getContext().getVariableContext().setValue(ProcedurePlan.ROWCOUNT, 0);
+    			procEnv.getCurrentVariableContext().setValue(ProcedurePlan.ROWCOUNT, 0);
     		}
     		procEnv.removeResults(rsName);
         }

Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java	2012-05-16 21:19:02 UTC (rev 4116)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestProcedureRelational.java	2012-05-16 21:19:08 UTC (rev 4117)
@@ -236,6 +236,28 @@
         TestProcessor.helpProcess(plan, dataManager, expected); 
     }
     
+    @Test public void testProcAsTableInJoinWithOutJoinPredicate(){
+        String sql = "select param1, param2, pm1.vsp26.e2, pm1.g1.e2 from pm1.vsp26, pm1.g1 where pm1.vsp26.e2 = pm1.g1.e2 and param1 = pm1.g1.e2 and param2 = pm1.g1.e1 order by param1, param2, pm1.vsp26.e2"; //$NON-NLS-1$
+
+        // Create expected results
+        List<?>[] expected = new List[] { 
+            Arrays.asList(new Object[] { new Integer(0), "a", new Integer(0), 0}), //$NON-NLS-1$
+            Arrays.asList(new Object[] { new Integer(0), "a", new Integer(0), 0}), //$NON-NLS-1$
+            Arrays.asList(new Object[] { new Integer(0), "a", new Integer(0), 0}), //$NON-NLS-1$
+            Arrays.asList(new Object[] { new Integer(0), "a", new Integer(0), 0}), //$NON-NLS-1$
+            Arrays.asList(new Object[] { new Integer(1), "c", new Integer(1), 1}), //$NON-NLS-1$
+            Arrays.asList(new Object[] { new Integer(2), "b", new Integer(2), 2}), //$NON-NLS-1$
+            Arrays.asList(new Object[] { new Integer(3), "a", new Integer(3), 3}), //$NON-NLS-1$
+        };       
+        // Construct data manager with data
+        FakeDataManager dataManager = new FakeDataManager();
+        TestProcessor.sampleData1(dataManager);   
+        // Plan query
+        ProcessorPlan plan = TestProcessor.helpGetPlan(sql, RealMetadataFactory.example1Cached());       
+        // Run query
+        TestProcessor.helpProcess(plan, dataManager, expected); 
+    }
+    
     @Test public void testProcAsTableInSubquery(){
         String sql = "select param1, param2, pm1.vsp26.e2, (select count(e1) from pm1.vsp26 where param1 = 1 and param2 = 'a') x from pm1.vsp26, pm1.g1 where param1 = pm1.g1.e2 and param2 = pm1.g1.e1 order by param1, param2, e2"; //$NON-NLS-1$
 



More information about the teiid-commits mailing list