[teiid-commits] teiid SVN: r4222 - in trunk/engine/src: main/java/org/teiid/query/sql/lang and 2 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Thu Jul 5 11:43:22 EDT 2012


Author: shawkins
Date: 2012-07-05 11:43:21 -0400 (Thu, 05 Jul 2012)
New Revision: 4222

Modified:
   trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/SubqueryAwareRelationalNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/SubqueryContainer.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
   trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSelectNode.java
Log:
TEIID-2091 improving txn detection for txnautowrap detect

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -25,6 +25,7 @@
 import static org.teiid.query.analysis.AnalysisRecord.*;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -45,13 +46,18 @@
 import org.teiid.query.processor.ProcessorDataManager;
 import org.teiid.query.processor.RegisterRequestParameter;
 import org.teiid.query.rewriter.QueryRewriter;
+import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.Command;
+import org.teiid.query.sql.lang.ExistsCriteria;
 import org.teiid.query.sql.lang.OrderByItem;
 import org.teiid.query.sql.lang.Query;
 import org.teiid.query.sql.lang.Select;
+import org.teiid.query.sql.lang.SubqueryContainer;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.Expression;
+import org.teiid.query.sql.symbol.ScalarSubquery;
 import org.teiid.query.sql.util.SymbolMap;
+import org.teiid.query.sql.visitor.ValueIteratorProviderCollectorVisitor;
 import org.teiid.query.util.CommandContext;
 
 
@@ -440,5 +446,38 @@
 	public void setConnectorBindingId(String connectorBindingId) {
 		this.connectorBindingId = connectorBindingId;
 	}
-    
+	
+	@Override
+	protected Collection<? extends LanguageObject> getObjects() {
+		ArrayList<LanguageObject> list = new ArrayList<LanguageObject>();
+		if (projection != null) {
+			for (Object obj : projection) {
+				if (obj instanceof LanguageObject) {
+					list.add((LanguageObject)obj);
+				}
+			}
+		}
+		if (shouldEvaluate) {
+			//collect any evaluatable subqueries
+			for (SubqueryContainer<?> container : ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(this.command)) {
+				if (container instanceof ExistsCriteria && ((ExistsCriteria)container).shouldEvaluate()) {
+					list.add(container);
+				}
+				if (container instanceof ScalarSubquery && ((ScalarSubquery)container).shouldEvaluate()) {
+					list.add(container);
+				}
+			}
+		}
+		return list;
+	}
+	
+	@Override
+	public Boolean requiresTransaction(boolean transactionalReads) {
+		Boolean required = super.requiresTransaction(transactionalReads);
+		if (Boolean.TRUE.equals(required)) {
+			return true;
+		}
+		return null;
+	}
+	
 }
\ No newline at end of file

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -24,6 +24,8 @@
 
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 
@@ -37,6 +39,7 @@
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.function.FunctionMethods;
 import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.ArrayTable;
 import org.teiid.query.sql.lang.TableFunctionReference.ProjectedColumn;
 import org.teiid.query.util.CommandContext;
@@ -107,5 +110,10 @@
 		terminateBatches();
 		return pullBatch();
 	}
+	
+	@Override
+	protected Collection<? extends LanguageObject> getObjects() {
+		return Arrays.asList(this.table.getArrayValue());
+	}
 
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -24,6 +24,7 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -37,6 +38,7 @@
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.eval.Evaluator;
 import org.teiid.query.processor.RegisterRequestParameter;
+import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.BatchedUpdateCommand;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.util.VariableContext;
@@ -177,5 +179,15 @@
         super.copy(this, clonedNode);
         return clonedNode;
     }
+    
+    @Override
+    protected Collection<? extends LanguageObject> getObjects() {
+    	return null;
+    }
+    
+    @Override
+    public Boolean requiresTransaction(boolean transactionalReads) {
+    	return true;
+    }
 
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -33,6 +33,7 @@
 import org.teiid.query.sql.lang.Criteria;
 import org.teiid.query.sql.lang.DependentSetCriteria;
 import org.teiid.query.sql.lang.Query;
+import org.teiid.query.sql.lang.QueryCommand;
 
 
 /**
@@ -208,5 +209,13 @@
 	public void setPushdown(boolean pushdown) {
 		this.pushdown = pushdown;
 	}
+	
+	@Override
+	public Boolean requiresTransaction(boolean transactionalReads) {
+		if (transactionalReads || !(this.getCommand() instanceof QueryCommand)) {
+			return true;
+		}
+		return null;
+	}
 
 }
\ No newline at end of file

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -120,5 +120,10 @@
     public Criteria getInputCriteria() {
         return this.inputCriteria;
     }
+    
+    @Override
+    public Boolean requiresTransaction(boolean transactionalReads) {
+    	return true; //TODO: check the underlying 
+    }
 
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -113,5 +113,10 @@
 		this.batchRow = 1;
 		this.insertCount = 0;
 	}
+	
+	@Override
+	public Boolean requiresTransaction(boolean transactionalReads) {
+		return true;
+	}
 
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -25,6 +25,7 @@
 import static org.teiid.query.analysis.AnalysisRecord.*;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -38,6 +39,7 @@
 import org.teiid.core.TeiidProcessingException;
 import org.teiid.query.processor.ProcessorDataManager;
 import org.teiid.query.processor.relational.SourceState.ImplicitBuffer;
+import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.Criteria;
 import org.teiid.query.sql.lang.JoinType;
 import org.teiid.query.util.CommandContext;
@@ -329,5 +331,18 @@
     public DependentValueSource getDependentValueSource() {
 		return dvs;
 	}
+    
+    @Override
+    protected Collection<? extends LanguageObject> getObjects() {
+    	List<LanguageObject> all = new ArrayList<LanguageObject>();
+    	if (leftExpressions != null) {
+    		all.addAll(leftExpressions);
+    		all.addAll(rightExpressions);
+    	}
+    	if (joinCriteria != null) {
+    		all.add(joinCriteria);
+    	}
+    	return all;
+    }
 
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -180,4 +180,12 @@
         return props;
     }
     
+    @Override
+    public Boolean requiresTransaction(boolean transactionalReads) {
+		if (Boolean.TRUE.equals(getProcessorPlan().requiresTransaction(transactionalReads))) {
+			return true;
+		}
+		return null;
+    }
+    
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -283,4 +283,12 @@
 		return modelName;
 	}
     
+    @Override
+    public Boolean requiresTransaction(boolean transactionalReads) {
+		if (getMode() != Mode.ITERATOR) {
+			return true;
+		}
+		return null;
+    }
+    
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -26,6 +26,7 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -39,6 +40,7 @@
 import org.teiid.core.TeiidProcessingException;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.symbol.AliasSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.util.SymbolMap;
@@ -221,4 +223,9 @@
         return props;
     }
     
+    @Override
+    protected Collection<? extends LanguageObject> getObjects() {
+    	return this.selectSymbols;
+    }
+    
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -637,4 +637,12 @@
 		throw e;
 	}
 	
+	/**
+	 * @param transactionalReads  
+	 * @return true if required, false if not required, and null if transactional reads and a single source command is issued.
+	 */
+	public Boolean requiresTransaction(boolean transactionalReads) {
+		return false;
+	}
+	
 }
\ No newline at end of file

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -40,13 +40,12 @@
 import org.teiid.query.processor.ProcessorPlan;
 import org.teiid.query.processor.QueryProcessor;
 import org.teiid.query.processor.RegisterRequestParameter;
-import org.teiid.query.processor.relational.ProjectIntoNode.Mode;
 import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.Create;
 import org.teiid.query.sql.lang.Insert;
-import org.teiid.query.sql.lang.QueryCommand;
 import org.teiid.query.sql.lang.SourceHint;
 import org.teiid.query.sql.lang.WithQueryCommand;
+import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.tempdata.TempTableStore;
 import org.teiid.query.tempdata.TempTableStore.TransactionMode;
 import org.teiid.query.util.CommandContext;
@@ -57,7 +56,7 @@
 
 	// Initialize state - don't reset
 	private RelationalNode root;
-	private List outputCols;
+	private List<? extends Expression> outputCols;
 	private List<WithQueryCommand> with;
 	
 	private List<WithQueryCommand> withToProcess;
@@ -131,7 +130,7 @@
      * Get list of resolved elements describing output columns for this plan.
      * @return List of SingleElementSymbol
      */
-    public List getOutputElements() {
+    public List<? extends Expression> getOutputElements() {
         return this.outputCols;
     }
 
@@ -244,7 +243,7 @@
     /** 
      * @param outputCols The outputCols to set.
      */
-    public void setOutputElements(List outputCols) {
+    public void setOutputElements(List<? extends Expression> outputCols) {
         this.outputCols = outputCols;
     }
     
@@ -267,40 +266,32 @@
 				}
 			}
     	}
-    	return requiresTransaction(transactionalReads, root);
+    	return Boolean.TRUE.equals(requiresTransaction(transactionalReads, root));
     }
     
-    /**
-     * Currently does not detect procedures in non-inline view subqueries
-     */
-    boolean requiresTransaction(boolean transactionalReads, RelationalNode node) {
-    	if (node instanceof DependentAccessNode) {
-			if (transactionalReads || !(((DependentAccessNode)node).getCommand() instanceof QueryCommand)) {
-				return true;
-			}
-			return false;
-		}
-    	if (node instanceof ProjectIntoNode) {
-    		if (((ProjectIntoNode)node).getMode() == Mode.ITERATOR) {
-    			return transactionalReads;
-    		}
+    static Boolean requiresTransaction(boolean transactionalReads, RelationalNode node) {
+    	Boolean requiresTxn = node.requiresTransaction(transactionalReads);
+    	if (Boolean.TRUE.equals(requiresTxn)) {
     		return true;
-    	} else if (node instanceof AccessNode) {
-			return false;
-		}
-		if (transactionalReads) {
-			return true;
-		}
-		if (node instanceof PlanExecutionNode) {
-			ProcessorPlan plan = ((PlanExecutionNode)node).getProcessorPlan();
-			return plan.requiresTransaction(transactionalReads);
-		}
+    	}
 		for (RelationalNode child : node.getChildren()) {
-			if (child != null && requiresTransaction(transactionalReads, child)) {
+			if (child == null) {
+				continue;
+			}
+			Boolean childRequires = requiresTransaction(transactionalReads, child);
+			if (Boolean.TRUE.equals(childRequires)) {
 				return true;
 			}
+			if (transactionalReads) {
+				if (childRequires == null) {
+					if (requiresTxn == null) {
+						return true;
+					}
+					requiresTxn = null;
+				}
+			}
 		}
-		return false;
+		return requiresTxn;
     }
     
     @Override

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -25,6 +25,7 @@
 import static org.teiid.query.analysis.AnalysisRecord.*;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -36,6 +37,7 @@
 import org.teiid.core.TeiidProcessingException;
 import org.teiid.query.analysis.AnalysisRecord;
 import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.Criteria;
 import org.teiid.query.util.CommandContext;
 
@@ -97,7 +99,7 @@
         }
 
         while (currentRow <= currentBatch.getEndRow() && !isBatchFull()) {
-    		List tuple = currentBatch.getTuple(currentRow);
+    		List<?> tuple = currentBatch.getTuple(currentRow);
 
             if(getEvaluator(this.elementMap).evaluate(this.criteria, tuple)) {
                 addBatchRow(projectTuple(this.projectionIndexes, tuple));
@@ -139,4 +141,9 @@
         return props;
     }
     
+    @Override
+    protected Collection<? extends LanguageObject> getObjects() {
+    	return Arrays.asList(this.criteria);
+    }
+    
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/SubqueryAwareRelationalNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/SubqueryAwareRelationalNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/SubqueryAwareRelationalNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -22,6 +22,7 @@
 
 package org.teiid.query.processor.relational;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 
@@ -29,9 +30,11 @@
 import org.teiid.common.buffer.BlockedException;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.query.eval.Evaluator;
+import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.TableFunctionReference;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
+import org.teiid.query.sql.visitor.ValueIteratorProviderCollectorVisitor;
 
 public abstract class SubqueryAwareRelationalNode extends RelationalNode {
 
@@ -77,5 +80,15 @@
 			getContext().getVariableContext().setValue(entry.getKey(), getEvaluator(Collections.emptyMap()).evaluate(entry.getValue(), null));
 		}
 	}
+	
+	abstract protected Collection<? extends LanguageObject> getObjects();
+	
+	@Override
+	public Boolean requiresTransaction(boolean transactionalReads) {
+		if (!transactionalReads) {
+			return false;
+		}
+		return !ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(getObjects()).isEmpty();
+	}
 
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -27,6 +27,8 @@
 import java.io.Reader;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -44,6 +46,7 @@
 import org.teiid.core.types.TransformationException;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.TextTable;
 import org.teiid.query.sql.lang.TextTable.TextColumn;
 import org.teiid.query.sql.symbol.Expression;
@@ -483,4 +486,9 @@
 		return result;
 	}
 	
+	@Override
+	protected Collection<? extends LanguageObject> getObjects() {
+		return Arrays.asList(this.table.getFile());
+	}
+	
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -24,6 +24,7 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -48,6 +49,7 @@
 import org.teiid.query.processor.ProcessorDataManager;
 import org.teiid.query.processor.relational.GroupingNode.ProjectingTupleSource;
 import org.teiid.query.processor.relational.SortUtility.Mode;
+import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.OrderBy;
 import org.teiid.query.sql.lang.OrderByItem;
 import org.teiid.query.sql.symbol.ElementSymbol;
@@ -471,5 +473,10 @@
 			this.elementMap = createLookupMap(sourceElements);
 		}
 	}
+	
+	@Override
+	protected Collection<? extends LanguageObject> getObjects() {
+		return getElements();
+	}
     
 }

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -23,6 +23,7 @@
 package org.teiid.query.processor.relational;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -54,6 +55,7 @@
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.eval.Evaluator;
 import org.teiid.query.function.FunctionDescriptor;
+import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.XMLTable;
 import org.teiid.query.sql.lang.XMLTable.XMLColumn;
 import org.teiid.query.xquery.saxon.XQueryEvaluator;
@@ -339,5 +341,10 @@
 	private boolean hasNextBatch() {
 		return this.outputRow + this.buffer.getBatchSize() <= rowCount + 1;
 	}
+	
+	@Override
+	protected Collection<? extends LanguageObject> getObjects() {
+		return this.table.getPassing();
+	}
 
 }
\ No newline at end of file

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/SubqueryContainer.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/SubqueryContainer.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/SubqueryContainer.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -22,11 +22,13 @@
 
 package org.teiid.query.sql.lang;
 
+import org.teiid.query.sql.LanguageObject;
+
 /**
- * This interface defines a common interface for all MetaMatrix SQL objects 
+ * This interface defines a common interface for all SQL objects 
  * that contain subqueries. 
  */
-public interface SubqueryContainer<T extends Command> {
+public interface SubqueryContainer<T extends Command> extends LanguageObject {
 
     /**
      * Returns the subquery Command object

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -1547,7 +1547,10 @@
             0,      // Select
             0,      // Sort
             0       // UnionAll
-        });                                    
+        });  
+        
+        assertTrue(plan.requiresTransaction(true));
+        assertFalse(plan.requiresTransaction(false));
     }
 
     @Test public void testCantPushJoin2() {

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestSubqueryPushdown.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -22,6 +22,7 @@
 
 package org.teiid.query.optimizer;
 
+import static org.junit.Assert.*;
 import static org.teiid.query.optimizer.TestOptimizer.*;
 
 import org.junit.After;
@@ -142,6 +143,9 @@
             null, capFinder,
             new String[] { "SELECT intkey FROM bqt1.smalla AS n WHERE intkey = (SELECT MAX(intkey) FROM bqt1.smallb AS s WHERE s.stringkey = n.stringkey)" }, SHOULD_SUCCEED); //$NON-NLS-1$ 
         checkNodeTypes(plan, FULL_PUSHDOWN); 
+        
+        assertFalse(plan.requiresTransaction(true));
+        assertFalse(plan.requiresTransaction(false));
     }   
 
     @Test public void testPushCorrelatedSubquery2() {
@@ -276,6 +280,9 @@
             0,      // Sort
             0       // UnionAll
         }); 
+        
+        assertTrue(plan.requiresTransaction(true));
+        assertFalse(plan.requiresTransaction(false));
     }
 
     @Test public void testCorrelatedSubquery2() {
@@ -749,6 +756,9 @@
         ProcessorPlan plan = helpPlan("Select e1 from pm1.g1 where e1 > (select e1 FROM pm2.g1 where e2 = 13)", RealMetadataFactory.example1Cached(),  //$NON-NLS-1$
             new String[] { "SELECT g_0.e1 FROM pm1.g1 AS g_0 WHERE g_0.e1 > (SELECT g_0.e1 FROM pm2.g1 AS g_0 WHERE g_0.e2 = 13)" }, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
         checkNodeTypes(plan, FULL_PUSHDOWN); 
+        
+        assertTrue(plan.requiresTransaction(true));
+        assertFalse(plan.requiresTransaction(false));
     }
     
     @Test public void testScalarSubquery1() throws TeiidComponentException, TeiidProcessingException {

Modified: trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSelectNode.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSelectNode.java	2012-07-03 20:05:54 UTC (rev 4221)
+++ trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSelectNode.java	2012-07-05 15:43:21 UTC (rev 4222)
@@ -22,8 +22,7 @@
 
 package org.teiid.query.processor.relational;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.*;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -54,6 +53,7 @@
 import org.teiid.query.unittest.RealMetadataFactory;
 import org.teiid.query.util.CommandContext;
 
+ at SuppressWarnings("unchecked")
 public class TestSelectNode {
 
     public void helpTestSelect(List elements, Criteria criteria, List[] data, List childElements, ProcessorDataManager dataMgr, List[] expected) throws TeiidComponentException, TeiidProcessingException {



More information about the teiid-commits mailing list