From teiid-commits at lists.jboss.org Thu Aug 22 10:43:09 2013
Content-Type: multipart/mixed; boundary="===============2766135382753507950=="
MIME-Version: 1.0
From: teiid-commits at lists.jboss.org
To: teiid-commits at lists.jboss.org
Subject: [teiid-commits] teiid SVN: r4592 - in branches/7.7.x:
engine/src/main/java/org/teiid/query/optimizer/relational and 2 other
directories.
Date: Thu, 22 Aug 2013 10:43:08 -0400
Message-ID: <201308221443.r7MEh84s008918@svn01.web.mwc.hst.phx2.redhat.com>
--===============2766135382753507950==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Author: jolee
Date: 2013-08-22 10:43:08 -0400 (Thu, 22 Aug 2013)
New Revision: 4592
Modified:
branches/7.7.x/build/kits/jboss-container/teiid-releasenotes.html
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/RuleCleanCriteria.java
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational=
/rules/RuleCopyCriteria.java
branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational=
/rules/RuleRaiseNull.java
branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimi=
zer.java
Log:
BZ975033: EDS_5.3.1_3_2013 + Teiid-2633: Criteria is assumed needed when n=
o other predicates determined during RuleRaiseAccess
Modified: branches/7.7.x/build/kits/jboss-container/teiid-releasenotes.html
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/7.7.x/build/kits/jboss-container/teiid-releasenotes.html 2013-=
08-15 06:35:56 UTC (rev 4591)
+++ branches/7.7.x/build/kits/jboss-container/teiid-releasenotes.html 2013-=
08-22 14:43:08 UTC (rev 4592)
@@ -258,6 +258,8 @@
[TEIID-2611=
] - Client forwards compatibility issue
+[TEIID-2633=
] - Criteria is assumed needed when no other predicates determined during =
RuleRaiseAccess
+
=
From 7.7.7
Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/rel=
ational/RelationalPlanner.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relationa=
l/RelationalPlanner.java 2013-08-15 06:35:56 UTC (rev 4591)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relationa=
l/RelationalPlanner.java 2013-08-22 14:43:08 UTC (rev 4592)
@@ -469,6 +469,12 @@
rules.push(RuleConstants.PUSH_SELECT_CRITERIA);
rules.push(RuleConstants.PLAN_JOINS);
}
+ =
+ if(hints.hasJoin) {
+ rules.push(RuleConstants.CLEAN_CRITERIA);
+ rules.push(RuleConstants.COPY_CRITERIA);
+ }
+ =
rules.push(RuleConstants.RAISE_ACCESS);
if (hints.hasSetQuery) {
rules.push(RuleConstants.PLAN_UNIONS);
@@ -479,7 +485,6 @@
rules.push(RuleConstants.CLEAN_CRITERIA);
}
if(hints.hasJoin) {
- rules.push(RuleConstants.COPY_CRITERIA);
rules.push(RuleConstants.PUSH_NON_JOIN_CRITERIA);
}
if(hints.hasVirtualGroups) {
Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/rel=
ational/rules/RuleCleanCriteria.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relationa=
l/rules/RuleCleanCriteria.java 2013-08-15 06:35:56 UTC (rev 4591)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relationa=
l/rules/RuleCleanCriteria.java 2013-08-22 14:43:08 UTC (rev 4592)
@@ -54,7 +54,7 @@
=
boolean pushRaiseNull =3D false;
=
- pushRaiseNull =3D clean(plan);
+ pushRaiseNull =3D clean(plan, !rules.contains(RuleConstants.COPY_C=
RITERIA));
=
if (pushRaiseNull) {
rules.push(RuleConstants.RAISE_NULL);
@@ -63,24 +63,25 @@
return plan; =
}
=
- private boolean clean(PlanNode plan)
+ private boolean clean(PlanNode plan, boolean removeAllPhantom)
throws TeiidComponentException {
boolean pushRaiseNull =3D false;
plan.setProperty(Info.OUTPUT_COLS, null);
for (PlanNode node : plan.getChildren()) {
- pushRaiseNull |=3D clean(node);
+ pushRaiseNull |=3D clean(node, removeAllPhantom);
}
if (plan.getType() =3D=3D NodeConstants.Types.SELECT) {
- pushRaiseNull |=3D cleanCriteria(plan);
+ pushRaiseNull |=3D cleanCriteria(plan, removeAllPhantom);
}
return pushRaiseNull;
}
=
- boolean cleanCriteria(PlanNode critNode) throws TeiidComponentExceptio=
n {
- if (critNode.hasBooleanProperty(NodeConstants.Info.IS_PHANTOM)) {
- NodeEditor.removeChildNode(critNode.getParent(), critNode);
- return false;
- }
+ boolean cleanCriteria(PlanNode critNode, boolean removeAllPhantom) thr=
ows TeiidComponentException {
+ if (critNode.hasBooleanProperty(NodeConstants.Info.IS_PHANTOM) =
+ && (removeAllPhantom || critNode.hasBooleanProperty(Info.IS_COPI=
ED))) {
+ NodeEditor.removeChildNode(critNode.getParent(), critNode);
+ return false;
+ }
=
//TODO: remove dependent set criteria that has not been meaningful=
ly pushed from its parent join
=
Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/rel=
ational/rules/RuleCopyCriteria.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relationa=
l/rules/RuleCopyCriteria.java 2013-08-15 06:35:56 UTC (rev 4591)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relationa=
l/rules/RuleCopyCriteria.java 2013-08-22 14:43:08 UTC (rev 4592)
@@ -96,9 +96,10 @@
return plan;
}
=
- if (tryToCopy(plan, new Set[2], metadata)) {
+ if (tryToCopy(plan, new Set[2], metadata, false)) {
//Push any newly created criteria nodes and try to copy them a=
fterwards
rules.push(RuleConstants.COPY_CRITERIA);
+ rules.push(RuleConstants.RAISE_ACCESS);
rules.push(RuleConstants.PUSH_NON_JOIN_CRITERIA);
}
=
@@ -127,7 +128,9 @@
List joinCriteria,
Set combinedCriteria,
boolean checkForGroupReduction,
- QueryMetadataInterface metadata) {
+ QueryMetadataInterface metadata,
+ boolean underAccess) {
+ =
int startGroups =3D GroupsUsedByElementsVisitor.getGroups(crit).si=
ze();
=
Criteria tgtCrit =3D (Criteria) crit.clone();
@@ -153,8 +156,28 @@
return false;
}
=
+ boolean isNew =3D combinedCriteria.add(tgtCrit);
+ =
+ if (underAccess) {
+ boolean use =3D false;
+ if (isNew && !checkForGroupReduction) {
+ if (endGroups =3D=3D 1) {
+ use =3D true;
+ } else if (tgtCrit instanceof CompareCriteria) {
+ CompareCriteria cc =3D (CompareCriteria)tgtCrit;
+ int leftGroups =3D GroupsUsedByElementsVisitor.getGroups(cc.get=
LeftExpression()).size();
+ if (leftGroups =3D=3D endGroups || leftGroups =3D=3D 0) {
+ use =3D true;
+ }
+ }
+ }
+ if (!use) {
+ return false;
+ }
+ }
+ =
//if this is unique or it a duplicate but reduced a current join c=
onjunct, return true
- if (combinedCriteria.add(tgtCrit)) {
+ if (isNew) {
joinCriteria.add(tgtCrit);
return true;
} else if (checkForGroupReduction) {
@@ -172,7 +195,7 @@
* @param node
* @return true if criteria has been created
*/
- private boolean tryToCopy(PlanNode node, Set[] criteriaInfo,=
QueryMetadataInterface metadata) {
+ private boolean tryToCopy(PlanNode node, Set[] criteriaInfo,=
QueryMetadataInterface metadata, boolean underAccess) {
boolean changedTree =3D false;
=
if (node =3D=3D null) {
@@ -184,14 +207,15 @@
JoinType jt =3D (JoinType)node.getProperty(NodeConstants.Info.=
JOIN_TYPE);
=
if (jt =3D=3D JoinType.JOIN_FULL_OUTER) {
- return visitChildern(node, criteriaInfo, changedTree, meta=
data);
+ return visitChildern(node, criteriaInfo, changedTree, meta=
data, underAccess);
}
=
Set[] leftChildCriteria =3D new Set[2];
Set[] rightChildCriteria =3D new Set[2];
=
- changedTree |=3D tryToCopy(node.getFirstChild(), leftChildCrit=
eria, metadata);
- changedTree |=3D tryToCopy(node.getLastChild(), rightChildCrit=
eria, metadata);
+ changedTree |=3D tryToCopy(node.getFirstChild(), leftChildCrit=
eria, metadata, underAccess);
+ changedTree |=3D tryToCopy(node.getLastChild(), rightChildCrit=
eria, metadata, underAccess);
+ =
=
List joinCrits =3D (List) node.getProperty=
(NodeConstants.Info.JOIN_CRITERIA);
Set combinedCriteria =3D null;
@@ -227,11 +251,11 @@
=
if (!toCopy.isEmpty()) {
=
- changedTree |=3D createCriteria(false, toCopy, combine=
dCriteria, srcToTgt, newJoinCrits, metadata);
+ changedTree |=3D createCriteria(false, toCopy, combine=
dCriteria, srcToTgt, newJoinCrits, metadata, underAccess);
=
srcToTgt =3D buildElementMap(allCriteria, null, null, =
metadata);
=
- changedTree |=3D createCriteria(true, joinCrits, combi=
nedCriteria, srcToTgt, newJoinCrits, metadata);
+ changedTree |=3D createCriteria(true, joinCrits, combi=
nedCriteria, srcToTgt, newJoinCrits, metadata, underAccess);
}
=
joinCrits.addAll(newJoinCrits);
@@ -254,7 +278,7 @@
return changedTree;
}
=
- changedTree =3D visitChildern(node, criteriaInfo, changedTree, met=
adata);
+ changedTree =3D visitChildern(node, criteriaInfo, changedTree, met=
adata, underAccess);
=
//visit select nodes on the way back up
switch (node.getType()) {
@@ -292,7 +316,7 @@
Set combinedC=
riteria,
Map srcToTgt,
List newJoinC=
rits,
- QueryMetadataInterface =
metadata) {
+ QueryMetadataInterface =
metadata, boolean underAccess) {
boolean changedTree =3D false;
if (srcToTgt.size() =3D=3D 0) {
return changedTree;
@@ -301,7 +325,7 @@
while (i.hasNext()) {
Criteria crit =3D i.next();
=
- if (copyCriteria(crit, srcToTgt, newJoinCrits, combinedCriteri=
a, copyingJoinCriteria, metadata)) {
+ if (copyCriteria(crit, srcToTgt, newJoinCrits, combinedCriteri=
a, copyingJoinCriteria, metadata, underAccess)) {
changedTree =3D true;
if (!copyingJoinCriteria) {
crit =3D newJoinCrits.get(newJoinCrits.size() - 1);
@@ -342,12 +366,13 @@
private boolean visitChildern(PlanNode node,
Set[] criteriaInfo,
boolean changedTree,
- QueryMetadataInterface metadata) {
+ QueryMetadataInterface metadata, boolean=
underAccess) {
if (node.getChildCount() > 0) {
+ underAccess |=3D node.getType() =3D=3D NodeConstants.Types.ACCESS;
List children =3D node.getChildren();
for (int i =3D 0; i < children.size(); i++) {
PlanNode childNode =3D children.get(i);
- changedTree |=3D tryToCopy(childNode, i=3D=3D0?criteriaInf=
o:new Set[2], metadata);
+ changedTree |=3D tryToCopy(childNode, i=3D=3D0?criteriaInf=
o:new Set[2], metadata, underAccess);
}
}
return changedTree;
Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/rel=
ational/rules/RuleRaiseNull.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relationa=
l/rules/RuleRaiseNull.java 2013-08-15 06:35:56 UTC (rev 4591)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relationa=
l/rules/RuleRaiseNull.java 2013-08-22 14:43:08 UTC (rev 4592)
@@ -36,6 +36,7 @@
import org.teiid.query.optimizer.relational.OptimizerRule;
import org.teiid.query.optimizer.relational.RuleStack;
import org.teiid.query.optimizer.relational.plantree.NodeConstants;
+import org.teiid.query.optimizer.relational.plantree.NodeConstants.Info;
import org.teiid.query.optimizer.relational.plantree.NodeEditor;
import org.teiid.query.optimizer.relational.plantree.NodeFactory;
import org.teiid.query.optimizer.relational.plantree.PlanNode;
@@ -220,7 +221,7 @@
case NodeConstants.Types.PROJECT: =
{
// check for project into
- PlanNode upperProject =3D NodeEditor.findParent(parentNode.getParent()=
, NodeConstants.Types.PROJECT); =
+ PlanNode upperProject =3D NodeEditor.findParent(parentNode.getParent()=
, NodeConstants.Types.PROJECT, NodeConstants.Types.SOURCE); =
=
if (upperProject =3D=3D null
|| upperProject.getProperty(NodeConstants.Info.INTO_GROUP) =3D=3D nu=
ll) {
@@ -228,6 +229,14 @@
}
break;
}
+ case NodeConstants.Types.SOURCE:
+ {
+ PlanNode upperProject =3D parentNode.getParent();
+ if (upperProject !=3D null && upperProject.getType() =3D=3D NodeConsta=
nts.Types.PROJECT && upperProject.hasProperty(Info.INTO_GROUP)) {
+ break; //an insert plan
+ }
+ return raiseNullNode(rootNode, parentNode, nullNode, nodes=
);
+ }
default:
{
return raiseNullNode(rootNode, parentNode, nullNode, nodes=
);
Modified: branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/Tes=
tOptimizer.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestOptim=
izer.java 2013-08-15 06:35:56 UTC (rev 4591)
+++ branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestOptim=
izer.java 2013-08-22 14:43:08 UTC (rev 4592)
@@ -2649,10 +2649,9 @@
*/
@Test public void testCopyCriteriaWithOuterJoin5_defect10050(){
=
- ProcessorPlan plan =3D helpPlan(
- "select pm2.g1.e1, pm2.g2.e1, pm2.g3.e1 from ( (pm2.g1 right o=
uter join pm2.g2 on pm2.g1.e1=3Dpm2.g2.e1) right outer join pm2.g3 on pm2.g=
2.e1=3Dpm2.g3.e1) where pm2.g3.e1 =3D 'a'", example1(), //$NON-NLS-1$
- new String[] { "SELECT g_2.e1, g_1.e1, g_0.e1 FROM pm2.g3 AS g=
_0 LEFT OUTER JOIN (pm2.g2 AS g_1 LEFT OUTER JOIN pm2.g1 AS g_2 ON g_2.e1 =
=3D g_1.e1 AND g_2.e1 =3D 'a') ON g_1.e1 =3D g_0.e1 AND g_1.e1 =3D 'a' WHER=
E g_0.e1 =3D 'a'" }); //$NON-NLS-1$
- checkNodeTypes(plan, FULL_PUSHDOWN); =
+ helpPlan("select pm2.g1.e1, pm1.g2.e1, pm2.g3.e1 from ( (pm2.g1 right=
outer join pm1.g2 on pm2.g1.e1=3Dpm1.g2.e1) right outer join pm2.g3 on pm1=
.g2.e1=3Dpm2.g3.e1) where pm2.g3.e1 =3D 'a'", example1(), //$NON-NLS-1$
+ new String[] { "SELECT g_0.e1 FROM pm1.g2 AS g_0 WHERE g_0=
.e1 =3D 'a'", "SELECT g_0.e1 FROM pm2.g1 AS g_0 WHERE g_0.e1 =3D 'a'", "SEL=
ECT g_0.e1 FROM pm2.g3 AS g_0 WHERE g_0.e1 =3D 'a'" }); //$NON-NLS-1$ =
=
+ =
} =
=
/**
@@ -2673,8 +2672,20 @@
ProcessorPlan plan =3D helpPlan("select pm2.g1.e1, pm2.g2.e1 from =
pm2.g1 right outer join pm2.g2 on pm2.g2.e1=3Dpm2.g1.e1 where pm2.g2.e1 IN =
('a', 'b')", example1(), //$NON-NLS-1$
new String[] { "SELECT pm2.g1.e1, pm2.g2.e1 FROM pm2.g2 LEFT O=
UTER JOIN pm2.g1 ON pm2.g2.e1 =3D pm2.g1.e1 AND pm2.g1.e1 IN ('a', 'b') WHE=
RE pm2.g2.e1 IN ('a', 'b')" }); //$NON-NLS-1$
checkNodeTypes(plan, FULL_PUSHDOWN); =
- } =
+ } =
+
+ @Test public void testCopyCriteriaWithTransitivePushdown(){
+ ProcessorPlan plan =3D helpPlan("select pm2.g1.e1, pm2.g2.e1 from =
pm2.g1, pm2.g2, pm2.g3 where pm2.g1.e1 =3D pm2.g2.e1 and pm2.g2.e1 =3D pm2.=
g3.e1", example1(), //$NON-NLS-1$
+ new String[] { "SELECT g_0.e1, g_1.e1 FROM pm2.g1 AS g_0, pm2.=
g2 AS g_1, pm2.g3 AS g_2 WHERE (g_0.e1 =3D g_1.e1) AND (g_1.e1 =3D g_2.e1)"=
}); //$NON-NLS-1$
+ checkNodeTypes(plan, FULL_PUSHDOWN); =
+ }
=
+ @Test public void testCopyCriteriaWithTransitivePushdown1(){
+ ProcessorPlan plan =3D helpPlan("select pm2.g1.e1, pm2.g2.e1 from =
pm2.g1, pm2.g2, pm2.g3 where pm2.g1.e1 =3D pm2.g2.e1 and pm2.g2.e1 =3D pm2.=
g3.e1 and pm2.g1.e1 =3D 'a'", example1(), //$NON-NLS-1$
+ new String[] { "SELECT g_0.e1, g_1.e1 FROM pm2.g1 AS g_0, pm2.=
g2 AS g_1, pm2.g3 AS g_2 WHERE (g_0.e1 =3D g_1.e1) AND (g_1.e1 =3D g_2.e1) =
AND (g_0.e1 =3D 'a') AND (g_1.e1 =3D 'a') AND (g_2.e1 =3D 'a')" }); //$NON-=
NLS-1$
+ checkNodeTypes(plan, FULL_PUSHDOWN); =
+ } =
+ =
@Test public void testCleanCriteria(){
=
ProcessorPlan plan =3D helpPlan("select pm2.g1.e1, pm2.g2.e1 from =
pm2.g1, pm2.g2 where pm2.g1.e1=3Dpm2.g2.e1 and pm2.g1.e2 IN (1, 2)", exampl=
e1(), //$NON-NLS-1$
--===============2766135382753507950==--