Author: shawkins
Date: 2012-05-15 22:06:06 -0400 (Tue, 15 May 2012)
New Revision: 4107
Modified:
branches/7.7.x/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorManager.java
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/NewCalculateCostUtil.java
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java
branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestVirtualDepJoin.java
Log:
TEIID-2040 fix for sort init error
Modified:
branches/7.7.x/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorManager.java
===================================================================
---
branches/7.7.x/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorManager.java 2012-05-15
23:34:40 UTC (rev 4106)
+++
branches/7.7.x/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorManager.java 2012-05-16
02:06:06 UTC (rev 4107)
@@ -264,11 +264,10 @@
return this.executionFactory;
}
- public void setExecutionFactory(ExecutionFactory<Object, Object> ef) {
- this.executionFactory = ef;
+ public void setExecutionFactory(ExecutionFactory<?, ?> ef) {
+ this.executionFactory = (ExecutionFactory<Object, Object>) ef;
}
-
/**
* Get the ConnectionFactory object required by this manager
* @return
Modified:
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
===================================================================
---
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java 2012-05-15
23:34:40 UTC (rev 4106)
+++
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java 2012-05-16
02:06:06 UTC (rev 4107)
@@ -393,11 +393,13 @@
if (hints.hasRelationalProc) {
rules.push(RuleConstants.PLAN_PROCEDURES);
}
+ if (hints.hasJoin) {
+ rules.push(RuleConstants.CHOOSE_DEPENDENT);
+ }
if(hints.hasAggregates) {
rules.push(new RulePushAggregates(idGenerator));
}
if(hints.hasJoin) {
- rules.push(RuleConstants.CHOOSE_DEPENDENT);
rules.push(RuleConstants.CHOOSE_JOIN_STRATEGY);
rules.push(RuleConstants.RAISE_ACCESS);
//after planning the joins, let the criteria be pushed back into place
Modified:
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/NewCalculateCostUtil.java
===================================================================
---
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/NewCalculateCostUtil.java 2012-05-15
23:34:40 UTC (rev 4106)
+++
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/NewCalculateCostUtil.java 2012-05-16
02:06:06 UTC (rev 4107)
@@ -25,17 +25,7 @@
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
import java.util.Map.Entry;
import org.teiid.api.exception.query.QueryMetadataException;
@@ -55,19 +45,7 @@
import org.teiid.query.optimizer.relational.plantree.PlanNode;
import org.teiid.query.optimizer.relational.plantree.NodeConstants.Info;
import org.teiid.query.resolver.util.ResolverUtil;
-import org.teiid.query.sql.lang.AbstractSetCriteria;
-import org.teiid.query.sql.lang.CompareCriteria;
-import org.teiid.query.sql.lang.CompoundCriteria;
-import org.teiid.query.sql.lang.Criteria;
-import org.teiid.query.sql.lang.DependentSetCriteria;
-import org.teiid.query.sql.lang.IsNullCriteria;
-import org.teiid.query.sql.lang.JoinType;
-import org.teiid.query.sql.lang.MatchCriteria;
-import org.teiid.query.sql.lang.NotCriteria;
-import org.teiid.query.sql.lang.PredicateCriteria;
-import org.teiid.query.sql.lang.SetCriteria;
-import org.teiid.query.sql.lang.SetQuery;
-import org.teiid.query.sql.lang.SubquerySetCriteria;
+import org.teiid.query.sql.lang.*;
import org.teiid.query.sql.lang.SetQuery.Operation;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
@@ -1321,7 +1299,8 @@
depExpressions.add(dsc.getExpression());
continue;
}
- if (sourceNode.getType() == NodeConstants.Types.SOURCE) {
+ switch (sourceNode.getType()) {
+ case NodeConstants.Types.SOURCE: {
PlanNode child = sourceNode.getFirstChild();
child = FrameUtil.findOriginatingNode(child, child.getGroups());
if (child != null && child.getType() == NodeConstants.Types.SET_OP) {
@@ -1343,7 +1322,16 @@
NodeEditor.removeChildNode(planNode.getParent(), planNode);
}
rpsc.getCreatedNodes().clear();
- }
+ break;
+ }
+ case NodeConstants.Types.GROUP: {
+ if (rpsc.pushAcrossGroupBy(sourceNode, critNode, metadata, false)) {
+ critNodes.add(critNode);
+ initialTargets.add(sourceNode.getFirstChild());
+ }
+ break;
+ }
+ }
//the source must be a null or project node, which we don't care about
}
return targets;
Modified:
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java
===================================================================
---
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java 2012-05-15
23:34:40 UTC (rev 4106)
+++
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushSelectCriteria.java 2012-05-16
02:06:06 UTC (rev 4107)
@@ -136,13 +136,7 @@
}
case NodeConstants.Types.GROUP:
{
- if (!critNode.hasBooleanProperty(NodeConstants.Info.IS_HAVING)) {
- SymbolMap symbolMap = (SymbolMap)
sourceNode.getProperty(NodeConstants.Info.SYMBOL_MAP);
- FrameUtil.convertNode(critNode, null, null, symbolMap.asMap(),
metadata, true);
- NodeEditor.removeChildNode(critNode.getParent(), critNode);
- sourceNode.getFirstChild().addAsParent(critNode);
- moved = true;
- }
+ moved = pushAcrossGroupBy(sourceNode, critNode, metadata, true);
}
}
@@ -157,6 +151,29 @@
return plan;
}
+ boolean pushAcrossGroupBy(PlanNode sourceNode,
+ PlanNode critNode, QueryMetadataInterface metadata, boolean inPlan)
+ throws QueryPlannerException {
+ boolean moved = false;
+ if (!critNode.hasBooleanProperty(NodeConstants.Info.IS_HAVING)) {
+ SymbolMap symbolMap = (SymbolMap)
sourceNode.getProperty(NodeConstants.Info.SYMBOL_MAP);
+ FrameUtil.convertNode(critNode, null, null, symbolMap.asMap(), metadata, true);
+ if (inPlan) {
+ NodeEditor.removeChildNode(critNode.getParent(), critNode);
+ sourceNode.getFirstChild().addAsParent(critNode);
+ }
+ moved = true;
+ if (critNode.hasBooleanProperty(NodeConstants.Info.IS_DEPENDENT_SET)) {
+ PlanNode accessNode = NodeEditor.findParent(critNode, NodeConstants.Types.ACCESS);
+ if (accessNode != null) {
+ markDependent(critNode, accessNode);
+ moved = false; //terminal position
+ }
+ }
+ }
+ return moved;
+ }
+
private PlanNode findOriginatingNode(QueryMetadataInterface metadata,
CapabilitiesFinder capFinder, PlanNode critNode, AnalysisRecord record)
throws TeiidComponentException, QueryMetadataException {
@@ -302,7 +319,8 @@
currentNode = path.pop();
// Look for situations where we don't allow SELECT to be pushed
- if(currentNode.getType() == NodeConstants.Types.ACCESS) {
+ switch (currentNode.getType()) {
+ case NodeConstants.Types.ACCESS:
try {
if (!RuleRaiseAccess.canRaiseOverSelect(currentNode, metadata,
capFinder, critNode, null)) {
return currentNode;
@@ -311,17 +329,16 @@
satisfyAccessPatterns(critNode, currentNode);
}
- if (critNode.hasBooleanProperty(NodeConstants.Info.IS_DEPENDENT_SET))
{
- //once a dependent crit node is pushed, don't bother pushing
it further into the command
- //dependent access node will use this as an assumption for where
dependent sets can appear in the command
- critNode.setProperty(NodeConstants.Info.IS_PUSHED,
Boolean.TRUE);
- currentNode.setProperty(NodeConstants.Info.IS_DEPENDENT_SET,
Boolean.TRUE);
+ if (critNode.hasBooleanProperty(NodeConstants.Info.IS_DEPENDENT_SET)
+ && NodeEditor.findNodePreOrder(currentNode.getFirstChild(),
NodeConstants.Types.GROUP, NodeConstants.Types.SOURCE) == null) {
+ markDependent(critNode, currentNode);
return currentNode.getFirstChild();
}
} catch(QueryMetadataException e) {
throw new QueryPlannerException(e,
QueryPlugin.Util.getString("ERR.015.004.0020", currentNode.getGroups()));
//$NON-NLS-1$
}
- } else if(currentNode.getType() == NodeConstants.Types.JOIN) {
+ break;
+ case NodeConstants.Types.JOIN:
//pushing below a join is not necessary under an access node
if (this.createdNodes == null && NodeEditor.findParent(currentNode,
NodeConstants.Types.ACCESS) != null) {
return currentNode;
@@ -343,14 +360,25 @@
}
satisfyAccessPatterns(critNode, currentNode);
- } else if (FrameUtil.isOrderedOrStrictLimit(currentNode)) {
- return currentNode;
- }
+ break;
+ default:
+ if (FrameUtil.isOrderedOrStrictLimit(currentNode)) {
+ return currentNode;
+ }
+ }
}
-
return sourceNode;
}
+ private void markDependent(PlanNode critNode, PlanNode accessNode) {
+ //once a dependent crit node is pushed, don't bother pushing it further into the
command
+ //dependent access node will use this as an assumption for where dependent sets can
appear in the command
+ critNode.setProperty(NodeConstants.Info.IS_PUSHED, Boolean.TRUE);
+ if (createdNodes == null) {
+ accessNode.setProperty(NodeConstants.Info.IS_DEPENDENT_SET, Boolean.TRUE);
+ }
+ }
+
boolean pushAcrossFrame(PlanNode sourceNode, PlanNode critNode, QueryMetadataInterface
metadata)
throws QueryPlannerException {
Modified:
branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestVirtualDepJoin.java
===================================================================
---
branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestVirtualDepJoin.java 2012-05-15
23:34:40 UTC (rev 4106)
+++
branches/7.7.x/engine/src/test/java/org/teiid/query/processor/TestVirtualDepJoin.java 2012-05-16
02:06:06 UTC (rev 4107)
@@ -636,8 +636,8 @@
ProcessorPlan plan = TestProcessor.helpGetPlan(command, metadata, finder,
context);
TestOptimizer.checkNodeTypes(plan, new int[] {
- 2, // Access
- 0, // DependentAccess
+ 1, // Access
+ 1, // DependentAccess
0, // DependentSelect
0, // DependentProject
0, // DupRemove
@@ -652,7 +652,7 @@
0 // UnionAll
});
- TestOptimizer.checkDependentJoinCount(plan, 0);
+ TestOptimizer.checkDependentJoinCount(plan, 1);
// Run query
TestProcessor.helpProcess(plan, context, dataManager, expected);
}