[teiid-commits] teiid SVN: r3209 - in branches/7.4.x: engine/src/main/java/org/teiid/query/optimizer/relational and 8 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue May 31 22:43:24 EDT 2011


Author: shawkins
Date: 2011-05-31 22:43:24 -0400 (Tue, 31 May 2011)
New Revision: 3209

Modified:
   branches/7.4.x/engine/src/main/java/org/teiid/query/eval/Evaluator.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleImplementJoinStrategy.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/DependentCriteriaProcessor.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/DependentValueSource.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/EnhancedSortMergeJoinStrategy.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/sql/util/ValueIteratorSource.java
   branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java
   branches/7.4.x/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestCrossSourceStarJoin.java
Log:
TEIID-1615 removing unnecessary sorting from inner joins that implement semi-joins

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/eval/Evaluator.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/eval/Evaluator.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/eval/Evaluator.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -109,6 +109,7 @@
 import org.teiid.query.sql.symbol.XMLNamespaces.NamespaceItem;
 import org.teiid.query.sql.util.ValueIterator;
 import org.teiid.query.sql.util.ValueIteratorSource;
+import org.teiid.query.sql.util.VariableContext;
 import org.teiid.query.util.CommandContext;
 import org.teiid.query.xquery.saxon.SaxonXQueryExpression;
 import org.teiid.query.xquery.saxon.SaxonXQueryExpression.Result;
@@ -427,7 +428,8 @@
         	valueIter = new CollectionValueIterator(((SetCriteria)criteria).getValues());
         } else if (criteria instanceof DependentSetCriteria){
         	ContextReference ref = (ContextReference)criteria;
-    		ValueIteratorSource vis = (ValueIteratorSource)getContext(criteria).getVariableContext().getGlobalValue(ref.getContextSymbol());
+        	VariableContext vc = getContext(criteria).getVariableContext();
+    		ValueIteratorSource vis = (ValueIteratorSource)vc.getGlobalValue(ref.getContextSymbol());
     		Set<Object> values;
     		try {
     			values = vis.getCachedSet(ref.getValueExpression());
@@ -437,6 +439,7 @@
         	if (values != null) {
         		return values.contains(leftValue);
         	}
+    		vis.setUnused(true);
         	//there are too many values to justify a linear search or holding
         	//them in memory
         	return true;

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -238,7 +238,9 @@
                 if(stype == JoinStrategyType.MERGE || stype == JoinStrategyType.ENHANCED_SORT) {
                 	MergeJoinStrategy mjStrategy = null;
                 	if (stype.equals(JoinStrategyType.ENHANCED_SORT)) { 
-                		mjStrategy = new EnhancedSortMergeJoinStrategy(leftSort, (SortOption)node.getProperty(NodeConstants.Info.SORT_RIGHT));
+                		EnhancedSortMergeJoinStrategy esmjStrategy = new EnhancedSortMergeJoinStrategy(leftSort, (SortOption)node.getProperty(NodeConstants.Info.SORT_RIGHT));
+                		esmjStrategy.setSemiDep(node.hasBooleanProperty(Info.IS_SEMI_DEP));
+                		mjStrategy = esmjStrategy;
                 	} else {
                 		mjStrategy = new MergeJoinStrategy(leftSort, (SortOption)node.getProperty(NodeConstants.Info.SORT_RIGHT), false);
                 	}

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/plantree/NodeConstants.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -95,6 +95,7 @@
         IS_OPTIONAL,          // Boolean
         IS_LEFT_DISTINCT, 	// Boolean
         IS_RIGHT_DISTINCT, 	// Boolean
+        IS_SEMI_DEP,		// Boolean
 
         // Project node properties
         PROJECT_COLS,       // List <SingleElementSymbol>

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCollapseSource.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -24,6 +24,7 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -172,9 +173,11 @@
 		 */
 		if (queryCommand instanceof SetQuery) {
 			((SetQuery)queryCommand).setAll(false);
-		} else if (!NewCalculateCostUtil.usesKey(accessNode, queryCommand.getProjectedSymbols(), metadata) && CapabilitiesUtil.supports(Capability.QUERY_SELECT_DISTINCT, RuleRaiseAccess.getModelIDFromAccess(accessNode, metadata), metadata, capFinder)) {
+		} else if (CapabilitiesUtil.supports(Capability.QUERY_SELECT_DISTINCT, RuleRaiseAccess.getModelIDFromAccess(accessNode, metadata), metadata, capFinder)) {
 			Query query = (Query)queryCommand;
-			if (!QueryRewriter.isDistinctWithGroupBy(query)) {
+			HashSet<GroupSymbol> keyPreservingGroups = new HashSet<GroupSymbol>();
+			ResolverUtil.findKeyPreserved(query, keyPreservingGroups, metadata);
+			if (!QueryRewriter.isDistinctWithGroupBy(query) && !NewCalculateCostUtil.usesKey(query.getSelect().getProjectedSymbols(), keyPreservingGroups, metadata, true)) {
 				((Query)queryCommand).getSelect().setDistinct(true);
 			}
 		}

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleImplementJoinStrategy.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleImplementJoinStrategy.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleImplementJoinStrategy.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -24,6 +24,7 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -116,6 +117,7 @@
 
             List<SingleElementSymbol> leftExpressions = (List<SingleElementSymbol>) joinNode.getProperty(NodeConstants.Info.LEFT_EXPRESSIONS);
             List<SingleElementSymbol> rightExpressions = (List<SingleElementSymbol>) joinNode.getProperty(NodeConstants.Info.RIGHT_EXPRESSIONS);
+            int origExpressionCount = leftExpressions.size();
 
             //check index information on each side
             //TODO: don't do null order compensation - in fact we should check what the order actually is, but we don't have that metadata
@@ -169,11 +171,26 @@
             	joinNode.setProperty(NodeConstants.Info.LEFT_EXPRESSIONS, leftExpressions);
             	joinNode.setProperty(NodeConstants.Info.RIGHT_EXPRESSIONS, rightExpressions);
             }
-            
+
+            Set<SingleElementSymbol> outputSymbols = new LinkedHashSet<SingleElementSymbol>((List<SingleElementSymbol>)joinNode.getProperty(NodeConstants.Info.OUTPUT_COLS));
+
 			boolean pushedLeft = insertSort(joinNode.getFirstChild(), leftExpressions, joinNode, metadata, capabilitiesFinder, pushLeft);	
-			insertSort(joinNode.getLastChild(), rightExpressions, joinNode, metadata, capabilitiesFinder, pushRight);
-        	
-        	if (joinNode.getProperty(NodeConstants.Info.JOIN_TYPE) == JoinType.JOIN_INNER && (!pushRight || !pushedLeft)) {
+			
+	        if (origExpressionCount == 1 
+	        		&& joinNode.getProperty(NodeConstants.Info.JOIN_TYPE) == JoinType.JOIN_INNER 
+	        		&& joinNode.getProperty(NodeConstants.Info.DEPENDENT_VALUE_SOURCE) != null
+	        		&& !joinNode.hasCollectionProperty(Info.NON_EQUI_JOIN_CRITERIA)) {
+	        	Collection<SingleElementSymbol> output = (Collection<SingleElementSymbol>) joinNode.getProperty(NodeConstants.Info.OUTPUT_COLS);
+	        	Collection<GroupSymbol> groups = GroupsUsedByElementsVisitor.getGroups(output);
+	        	if (Collections.disjoint(groups, FrameUtil.findJoinSourceNode(joinNode.getFirstChild()).getGroups())) {
+	        		pushRight = false;
+	        		joinNode.setProperty(Info.IS_SEMI_DEP, Boolean.TRUE);
+	        	}
+			}
+
+			boolean pushedRight = insertSort(joinNode.getLastChild(), rightExpressions, joinNode, metadata, capabilitiesFinder, pushRight);
+			
+        	if (joinNode.getProperty(NodeConstants.Info.JOIN_TYPE) == JoinType.JOIN_INNER && (!pushedRight || !pushedLeft)) {
         		joinNode.setProperty(NodeConstants.Info.JOIN_STRATEGY, JoinStrategyType.ENHANCED_SORT);
         	}
         }
@@ -207,8 +224,20 @@
                 
         PlanNode sortNode = createSortNode(new ArrayList<SingleElementSymbol>(orderSymbols), outputSymbols);
         
+        boolean distinct = false;
+        if (sourceNode.getType() == NodeConstants.Types.SOURCE && outputSymbols.size() == expressions.size() && outputSymbols.containsAll(expressions)) {
+        	PlanNode setOp = NodeEditor.findNodePreOrder(sourceNode.getFirstChild(), NodeConstants.Types.SET_OP, NodeConstants.Types.SOURCE);
+        	if (setOp != null) {
+        		if (setOp.hasBooleanProperty(NodeConstants.Info.USE_ALL)) {
+        			distinct = true;
+        		}
+        	} else if (NodeEditor.findNodePreOrder(sourceNode.getFirstChild(), NodeConstants.Types.DUP_REMOVE, NodeConstants.Types.PROJECT) != null) {
+	        	distinct = true;
+	        }
+        }
+        
         if (sourceNode.getType() == NodeConstants.Types.ACCESS) {
-        	if (NewCalculateCostUtil.usesKey(sourceNode, expressions, metadata)) {
+        	if (distinct || NewCalculateCostUtil.usesKey(sourceNode, expressions, metadata)) {
                 joinNode.setProperty(joinNode.getFirstChild() == childNode ? NodeConstants.Info.IS_LEFT_DISTINCT : NodeConstants.Info.IS_RIGHT_DISTINCT, true);
         	}
 	        if (attemptPush && RuleRaiseAccess.canRaiseOverSort(sourceNode, metadata, capFinder, sortNode, null, false)) {
@@ -221,6 +250,10 @@
 	        }
         }
         
+        if (distinct) {
+            joinNode.setProperty(joinNode.getFirstChild() == childNode ? NodeConstants.Info.IS_LEFT_DISTINCT : NodeConstants.Info.IS_RIGHT_DISTINCT, true);
+    	}
+        
         joinNode.setProperty(joinNode.getFirstChild() == childNode ? NodeConstants.Info.SORT_LEFT : NodeConstants.Info.SORT_RIGHT, SortOption.SORT);
         
         if (needsCorrection) {

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/DependentCriteriaProcessor.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/DependentCriteriaProcessor.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/DependentCriteriaProcessor.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -87,18 +87,21 @@
         public void sort() throws BlockedException,
                    TeiidComponentException, TeiidProcessingException {
             if (dvs == null) {
-            	//TODO: detect if we're already distinct
-            	if (sortUtility == null) {
-            		List<Expression> sortSymbols = new ArrayList<Expression>(dependentSetStates.size());
-	                List<Boolean> sortDirection = new ArrayList<Boolean>(sortSymbols.size());
-	                for (int i = 0; i < dependentSetStates.size(); i++) {
-	                    sortDirection.add(Boolean.valueOf(OrderBy.ASC));
-	                    sortSymbols.add(dependentSetStates.get(i).valueExpression);
-	                }
-	                DependentValueSource originalVs = (DependentValueSource)dependentNode.getContext().getVariableContext().getGlobalValue(valueSource);
-	                this.sortUtility = new SortUtility(originalVs.getTupleBuffer().createIndexedTupleSource(), sortSymbols, sortDirection, Mode.DUP_REMOVE, dependentNode.getBufferManager(), dependentNode.getConnectionID(), originalVs.getTupleBuffer().getSchema());
-            	}
-            	dvs = new DependentValueSource(sortUtility.sort());
+                DependentValueSource originalVs = (DependentValueSource)dependentNode.getContext().getVariableContext().getGlobalValue(valueSource);
+                if (!originalVs.isDistinct()) {
+	            	if (sortUtility == null) {
+	            		List<Expression> sortSymbols = new ArrayList<Expression>(dependentSetStates.size());
+		                List<Boolean> sortDirection = new ArrayList<Boolean>(sortSymbols.size());
+		                for (int i = 0; i < dependentSetStates.size(); i++) {
+		                    sortDirection.add(Boolean.valueOf(OrderBy.ASC));
+		                    sortSymbols.add(dependentSetStates.get(i).valueExpression);
+		                }
+		                this.sortUtility = new SortUtility(originalVs.getTupleBuffer().createIndexedTupleSource(), sortSymbols, sortDirection, Mode.DUP_REMOVE, dependentNode.getBufferManager(), dependentNode.getConnectionID(), originalVs.getTupleBuffer().getSchema());
+	            	}
+	            	dvs = new DependentValueSource(sortUtility.sort());
+                } else {
+                	dvs = originalVs;
+                }
             	for (SetState setState : dependentSetStates) {
                     setState.valueIterator = dvs.getValueIterator(setState.valueExpression);
                     if (setState.maxNdv > 0 && setState.maxNdv < dvs.getTupleBuffer().getRowCount()) {
@@ -363,8 +366,10 @@
         return hasNextCommand;
     }
     
-    public Criteria replaceDependentCriteria(AbstractSetCriteria crit, SetState state) {
+    public Criteria replaceDependentCriteria(AbstractSetCriteria crit, SetState state) throws TeiidComponentException {
     	if (state.overMax) {
+            DependentValueSource originalVs = (DependentValueSource)dependentNode.getContext().getVariableContext().getGlobalValue(((DependentSetCriteria)crit).getContextSymbol());
+            originalVs.setUnused(true);
     		return QueryRewriter.TRUE_CRITERIA;
     	}
     	if (state.replacement.isEmpty()) {

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/DependentValueSource.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/DependentValueSource.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/DependentValueSource.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -48,6 +48,8 @@
 
     private TupleBuffer buffer;
     private Map<Expression, Set<Object>> cachedSets;
+    private boolean unused; //TODO: use this value instead of the context
+    private boolean distinct;
     
     public DependentValueSource(TupleBuffer tupleSourceID) {
         this.buffer = tupleSourceID;
@@ -105,5 +107,23 @@
     	}
     	return result;
     }
+    
+    @Override
+    public boolean isUnused() {
+		return unused;
+	}
+    
+    @Override
+    public void setUnused(boolean unused) {
+		this.unused = unused;
+	}
+    
+    public boolean isDistinct() {
+		return distinct;
+	}
+    
+    public void setDistinct(boolean distinct) {
+		this.distinct = distinct;
+	}
            
 }

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/EnhancedSortMergeJoinStrategy.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/EnhancedSortMergeJoinStrategy.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/EnhancedSortMergeJoinStrategy.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -55,6 +55,8 @@
  */
 public class EnhancedSortMergeJoinStrategy extends MergeJoinStrategy {
 	
+	private boolean semiDep;
+	
 	private TupleSource currentSource;
 	private SourceState sortedSource;
 	private SourceState notSortedSource;
@@ -65,6 +67,7 @@
 	private int[] reverseIndexes;
 	private List<?> sortedTuple;
 	private boolean repeatedMerge;
+	private boolean validSemiDep;
 	
 	/**
 	 * Number of index batches we'll allow to marked as prefers memory regardless of buffer space
@@ -224,6 +227,17 @@
         	this.sortedSource = this.leftSource;
         	this.notSortedSource = this.rightSource;
 
+    		if (semiDep && this.leftSource.isDistinct()) {
+    			this.rightSource.getTupleBuffer();
+    			if (!this.joinNode.getDependentValueSource().isUnused()) {
+    				//sort is not needed
+    				this.processingSortRight = SortOption.NOT_SORTED;
+    				this.validSemiDep = true;
+    				//TODO: this requires full buffering and performs an unnecessary projection
+    				return;
+    			}
+        	}
+
         	if (!repeatedMerge) {
         		createIndex(this.leftSource, this.processingSortLeft == SortOption.ALREADY_SORTED);
         	} else {
@@ -295,6 +309,12 @@
 	    		if (currentTuple == null) {
 	    			return;
 	    		}
+	    		if (validSemiDep) {
+	    			List<?> tuple = this.currentTuple;
+	    			this.currentTuple = null;
+	    			this.joinNode.addBatchRow(outputTuple(this.leftSource.getOuterVals(), tuple));
+	    			continue;
+	    		}
 	        	List<?> key = RelationalNode.projectTuple(this.notSortedSource.getExpressionIndexes(), this.currentTuple);
 	        	tb = new TupleBrowser(this.index, new CollectionTupleSource(Arrays.asList(key).iterator()), OrderBy.ASC);
 	    	}
@@ -319,12 +339,18 @@
     
     @Override
     public EnhancedSortMergeJoinStrategy clone() {
-    	return new EnhancedSortMergeJoinStrategy(this.sortLeft, this.sortRight);
+    	EnhancedSortMergeJoinStrategy clone = new EnhancedSortMergeJoinStrategy(this.sortLeft, this.sortRight);
+    	clone.semiDep = this.semiDep;
+    	return clone;
     }
     
     @Override
     public String getName() {
-    	return "ENHANCED SORT JOIN"; //$NON-NLS-1$
+    	return "ENHANCED SORT JOIN"; //$NON-NLS-1$ 
     }
+    
+    public void setSemiDep(boolean semiDep) {
+		this.semiDep = semiDep;
+	}
        	
 }

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -75,6 +75,8 @@
     private Map combinedElementMap;
     private int[] projectionIndexes;
     
+    private DependentValueSource dvs;
+    
     public JoinNode(int nodeID) {
         super(nodeID);
     }
@@ -182,7 +184,9 @@
             this.joinStrategy.loadLeft();
             if (isDependent()) { 
                 TupleBuffer buffer = this.joinStrategy.leftSource.getTupleBuffer();
-                this.getContext().getVariableContext().setGlobalValue(this.dependentValueSource, new DependentValueSource(buffer));
+                dvs = new DependentValueSource(buffer);
+                dvs.setDistinct(this.joinStrategy.leftSource.isDistinct());
+                this.getContext().getVariableContext().setGlobalValue(this.dependentValueSource, dvs);
             }
             state = State.LOAD_RIGHT;
         }
@@ -270,13 +274,24 @@
         this.dependentValueSource = dependentValueSource;
     }
     
+    public String getDependentValueSourceName() {
+		return dependentValueSource;
+	}
+    
     public void closeDirect() {
         super.closeDirect();
         joinStrategy.close();
         if (this.getContext() != null && this.dependentValueSource != null) {
         	this.getContext().getVariableContext().setGlobalValue(this.dependentValueSource, null);
         }
+        this.dvs = null;
     }
+    
+    @Override
+    public void reset() {
+    	super.reset();
+    	this.dvs = null;
+    }
 
     public JoinType getJoinType() {
         return this.joinType;
@@ -310,5 +325,9 @@
         	throw BATCH_AVILABLE;
         }
     }
+    
+    public DependentValueSource getDependentValueSource() {
+		return dvs;
+	}
 
 }

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -938,7 +938,7 @@
 			return;
 		}
 		if (query.getFrom().getClauses().size() == 1) {
-			findKeyPreserved((FromClause)query.getFrom().getClauses().get(0), keyPreservingGroups, metadata);
+			findKeyPreserved(query.getFrom().getClauses().get(0), keyPreservingGroups, metadata);
 			return;
 		}
 		//non-ansi join

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -64,7 +64,6 @@
 import org.teiid.query.metadata.TempMetadataAdapter;
 import org.teiid.query.metadata.TempMetadataID;
 import org.teiid.query.metadata.TempMetadataStore;
-import org.teiid.query.optimizer.relational.rules.NewCalculateCostUtil;
 import org.teiid.query.optimizer.relational.rules.RuleMergeCriteria;
 import org.teiid.query.optimizer.relational.rules.RulePlaceAccess;
 import org.teiid.query.optimizer.relational.rules.RuleMergeCriteria.PlannedResult;
@@ -634,7 +633,7 @@
         }
         
         if (from != null && !query.getIsXML()) {
-        	writeSubqueriesAsJoins(query);
+        	rewriteSubqueriesAsJoins(query);
         }
 
         query = rewriteGroupBy(query);
@@ -667,7 +666,7 @@
         return query;
     }
 
-	private void writeSubqueriesAsJoins(Query query)
+	private void rewriteSubqueriesAsJoins(Query query)
 			throws TeiidComponentException, QueryMetadataException,
 			QueryResolverException {
 		if (query.getCriteria() == null) {
@@ -722,7 +721,7 @@
 			Criteria mappedCriteria = Criteria.combineCriteria(plannedResult.nonEquiJoinCriteria);
 			ExpressionMappingVisitor.mapExpressions(mappedCriteria, expressionMap);
 			query.setCriteria(Criteria.combineCriteria(query.getCriteria(), mappedCriteria));
-		    query.getFrom().addClause((FromClause) q.getFrom().getClauses().get(0));
+		    query.getFrom().addClause(q.getFrom().getClauses().get(0));
 		    query.getTemporaryMetadata().putAll(q.getTemporaryMetadata());
 			//transform the query into an inner join 
 		}

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/sql/util/ValueIteratorSource.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/sql/util/ValueIteratorSource.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/sql/util/ValueIteratorSource.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -50,5 +50,9 @@
     ValueIterator getValueIterator(Expression valueExpression) throws TeiidComponentException;
     
     Set<Object> getCachedSet(Expression valueExpression) throws TeiidComponentException, TeiidProcessingException;
-    
+
+	void setUnused(boolean unused);
+
+	boolean isUnused();
+
 }

Modified: branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java
===================================================================
--- branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -235,7 +235,7 @@
         ProcessorPlan plan = TestOptimizer.helpPlan(sql,  
                                       metadata,
                                       null, getAggregatesFinder(),
-                                      new String[] {"SELECT g_0.p_productid AS c_0 FROM m2.product AS g_0 WHERE g_0.p_divid = 100 ORDER BY c_0", "SELECT g_0.o_productid AS c_0, g_0.o_dealerid AS c_1, SUM(g_0.o_amount) AS c_2 FROM m1.\"order\" AS g_0, m1.dealer AS g_1 WHERE (g_0.o_dealerid = g_1.d_dealerid) AND (g_1.d_state = 'CA') AND (g_0.o_productid IN (<dependent values>)) GROUP BY g_0.o_productid, g_0.o_dealerid ORDER BY c_0"},  //$NON-NLS-1$ //$NON-NLS-2$
+                                      new String[] {"SELECT g_0.p_productid AS c_0 FROM m2.product AS g_0 WHERE g_0.p_divid = 100 ORDER BY c_0", "SELECT g_0.o_productid, g_0.o_dealerid, SUM(g_0.o_amount) FROM m1.\"order\" AS g_0, m1.dealer AS g_1 WHERE (g_0.o_dealerid = g_1.d_dealerid) AND (g_1.d_state = 'CA') AND (g_0.o_productid IN (<dependent values>)) GROUP BY g_0.o_productid, g_0.o_dealerid"},  //$NON-NLS-1$ //$NON-NLS-2$
                                                     TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING );
 
         TestOptimizer.checkNodeTypes(plan, new int[] {
@@ -265,7 +265,7 @@
         ProcessorPlan plan = TestOptimizer.helpPlan(sql,  
                                       metadata,
                                       null, getAggregatesFinder(),
-                                      new String[] {"SELECT g_0.p_productid AS c_0 FROM m2.product AS g_0 WHERE g_0.p_divid = 100 ORDER BY c_0", "SELECT g_0.o_productid AS c_0, g_0.o_dealerid AS c_1, MAX(g_0.o_amount) AS c_2, SUM(g_0.o_amount) AS c_3 FROM m1.\"order\" AS g_0, m1.dealer AS g_1 WHERE (g_0.o_dealerid = g_1.d_dealerid) AND (g_1.d_state = 'CA') AND (g_0.o_productid IN (<dependent values>)) GROUP BY g_0.o_productid, g_0.o_dealerid ORDER BY c_0"},  //$NON-NLS-1$ //$NON-NLS-2$
+                                      new String[] {"SELECT g_0.p_productid AS c_0 FROM m2.product AS g_0 WHERE g_0.p_divid = 100 ORDER BY c_0", "SELECT g_0.o_productid, g_0.o_dealerid, MAX(g_0.o_amount), SUM(g_0.o_amount) FROM m1.\"order\" AS g_0, m1.dealer AS g_1 WHERE (g_0.o_dealerid = g_1.d_dealerid) AND (g_1.d_state = 'CA') AND (g_0.o_productid IN (<dependent values>)) GROUP BY g_0.o_productid, g_0.o_dealerid"},  //$NON-NLS-1$ //$NON-NLS-2$
                                                     TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING );
 
         TestOptimizer.checkNodeTypes(plan, new int[] {

Modified: branches/7.4.x/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestCrossSourceStarJoin.java
===================================================================
--- branches/7.4.x/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestCrossSourceStarJoin.java	2011-06-01 01:01:56 UTC (rev 3208)
+++ branches/7.4.x/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestCrossSourceStarJoin.java	2011-06-01 02:43:24 UTC (rev 3209)
@@ -44,7 +44,7 @@
 @SuppressWarnings("nls")
 public class TestCrossSourceStarJoin {
 	
-    @Test public void testCrossSourceStartJoin() throws Exception {
+    @Test public void testCrossSourceStarJoin() throws Exception {
         String sql = "select p.Description, sum(AMOUNT) from s3 p, s2 c, s1 b, o1 f " +
         		"where p.PRODUCTID = f.PRODUCT and c.CurrencyCode = f.CURRENCY and b.BOOKID = f.BOOK and b.Name = 'xyz' and c.Name = 'abc' Group by p.Description";
         
@@ -106,7 +106,7 @@
         		"SELECT g_0.CurrencyCode AS c_0 FROM sybase.s2 AS g_0 WHERE g_0.Name = 'abc' ORDER BY c_0", 
         		"SELECT g_0.BOOKID AS c_0 FROM sybase.s1 AS g_0 WHERE g_0.Name = 'xyz' ORDER BY c_0", 
         		"SELECT g_0.PRODUCTID AS c_0, g_0.Description AS c_1 FROM sybase.s3 AS g_0 ORDER BY c_0", 
-        		"SELECT g_0.BOOK AS c_0, g_0.CURRENCY AS c_1, g_0.PRODUCT AS c_2, SUM(g_0.AMOUNT) AS c_3 FROM oracle.o1 AS g_0 WHERE (g_0.BOOK IN (<dependent values>)) AND (g_0.CURRENCY IN (<dependent values>)) AND (g_0.PRODUCT IN (<dependent values>)) GROUP BY g_0.BOOK, g_0.CURRENCY, g_0.PRODUCT ORDER BY c_0 NULLS FIRST"
+        		"SELECT g_0.BOOK, g_0.CURRENCY, g_0.PRODUCT, SUM(g_0.AMOUNT) FROM oracle.o1 AS g_0 WHERE (g_0.BOOK IN (<dependent values>)) AND (g_0.CURRENCY IN (<dependent values>)) AND (g_0.PRODUCT IN (<dependent values>)) GROUP BY g_0.BOOK, g_0.CURRENCY, g_0.PRODUCT"
         }, finder, ComparisonMode.EXACT_COMMAND_STRING);
         
         //test that aggregate will not be staged
@@ -115,7 +115,7 @@
         		"SELECT g_0.CurrencyCode AS c_0 FROM sybase.s2 AS g_0 WHERE g_0.Name = 'abc' ORDER BY c_0", 
         		"SELECT g_0.BOOKID AS c_0 FROM sybase.s1 AS g_0 WHERE g_0.Name = 'xyz' ORDER BY c_0", 
         		"SELECT g_0.PRODUCTID AS c_0, g_0.Description AS c_1 FROM sybase.s3 AS g_0 ORDER BY c_0", 
-        		"SELECT g_0.BOOK AS c_0, g_0.CURRENCY AS c_1, g_0.PRODUCT AS c_2, g_0.AMOUNT AS c_3 FROM oracle.o1 AS g_0 WHERE (g_0.BOOK IN (<dependent values>)) AND (g_0.CURRENCY IN (<dependent values>)) AND (g_0.PRODUCT IN (<dependent values>)) ORDER BY c_0 NULLS FIRST"
+        		"SELECT g_0.BOOK, g_0.CURRENCY, g_0.PRODUCT, g_0.AMOUNT FROM oracle.o1 AS g_0 WHERE (g_0.BOOK IN (<dependent values>)) AND (g_0.CURRENCY IN (<dependent values>)) AND (g_0.PRODUCT IN (<dependent values>))"
         }, finder, ComparisonMode.EXACT_COMMAND_STRING);
     } 
 



More information about the teiid-commits mailing list