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$