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==--