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);
}