[teiid-commits] teiid SVN: r4595 - in branches/7.7.x/engine/src: main/java/org/teiid/query/rewriter and 1 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Fri Sep 13 08:58:49 EDT 2013


Author: jolee
Date: 2013-09-13 08:58:49 -0400 (Fri, 13 Sep 2013)
New Revision: 4595

Modified:
   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/rewriter/QueryRewriter.java
   branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestAccessPatterns.java
   branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
Log:
BZ975033:  EDS_5.3.1_3_2013 + Teiid-2633: Criteria is assumed needed when no other predicates determined during RuleRaiseAccess (reprise2)

Modified: 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/RuleCopyCriteria.java	2013-09-06 12:09:53 UTC (rev 4594)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleCopyCriteria.java	2013-09-13 12:58:49 UTC (rev 4595)
@@ -248,7 +248,7 @@
                 List<Criteria> newJoinCrits = new LinkedList<Criteria>();
 
                 //we don't want to continue discovery since that could be recursive
-                Map<Expression, Expression> srcToTgt = buildElementMap(joinCrits, node.hasBooleanProperty(NodeConstants.Info.IS_COPIED)?null:newJoinCrits, combinedCriteria, metadata);
+                Map<Expression, Expression> srcToTgt = buildElementMap(joinCrits, node.hasBooleanProperty(NodeConstants.Info.IS_COPIED)?null:newJoinCrits, combinedCriteria, metadata, underAccess);
                 
                 changedTree |= !newJoinCrits.isEmpty();
 
@@ -256,7 +256,7 @@
                     
                     changedTree |= createCriteria(false, toCopy, combinedCriteria, srcToTgt, newJoinCrits, metadata, underAccess);
                     
-                    srcToTgt = buildElementMap(allCriteria, null, null, metadata);
+                    srcToTgt = buildElementMap(allCriteria, null, null, metadata, underAccess);
                                 
                     changedTree |= createCriteria(true, joinCrits, combinedCriteria, srcToTgt, newJoinCrits, metadata, underAccess);
                 }
@@ -383,7 +383,7 @@
      * @param metadata 
      * @return
      */
-    Map<Expression, Expression> buildElementMap(Collection<Criteria> crits, List<Criteria> newJoinCrits, Set<Criteria> allCriteria, QueryMetadataInterface metadata) {
+    Map<Expression, Expression> buildElementMap(Collection<Criteria> crits, List<Criteria> newJoinCrits, Set<Criteria> allCriteria, QueryMetadataInterface metadata, boolean underAccess) {
         Map<Expression, Expression> srcToTgt = null;
         for (Iterator<Criteria> iter = crits.iterator(); iter.hasNext();) {
         	Criteria theCrit = iter.next();
@@ -407,12 +407,12 @@
             	}
                 Expression oldValue = srcToTgt.put(crit.getLeftExpression(), crit.getRightExpression());
                 boolean removed = false;
-                if (checkWithinJoin(crit, newJoinCrits, allCriteria, oldValue, crit.getRightExpression(), metadata)) {
+                if (checkWithinJoin(crit, newJoinCrits, allCriteria, oldValue, crit.getRightExpression(), metadata, underAccess)) {
                 	iter.remove();
                 	removed = true;
                 }
                 oldValue = srcToTgt.put(crit.getRightExpression(), crit.getLeftExpression());
-                if (checkWithinJoin(crit, newJoinCrits, allCriteria, oldValue, crit.getLeftExpression(), metadata) && !removed) {
+                if (checkWithinJoin(crit, newJoinCrits, allCriteria, oldValue, crit.getLeftExpression(), metadata, underAccess) && !removed) {
                 	iter.remove();
                 }
             }
@@ -427,7 +427,7 @@
      * @return true if the original crit can be removed
      */
 	private boolean checkWithinJoin(CompareCriteria crit, List<Criteria> newJoinCrits, Set<Criteria> allCriteria,
-			Expression oldValue, Expression left, QueryMetadataInterface metadata) {
+			Expression oldValue, Expression left, QueryMetadataInterface metadata, boolean underAccess) {
 		if (newJoinCrits == null || oldValue == null) {
 			return false;
 		}
@@ -442,6 +442,12 @@
 			return false;
 		}
 		if (allCriteria.add(newCrit)) {
+			if (underAccess && GroupsUsedByElementsVisitor.getGroups(newCrit).size() > 1) {
+				return false;
+			}
+			if (newCrit instanceof CompareCriteria) {
+				((CompareCriteria)newCrit).setOptional(true);
+			}
 			newJoinCrits.add(newCrit);
 		}
 		if (!GroupsUsedByElementsVisitor.getGroups(crit.getLeftExpression()).isEmpty() && !GroupsUsedByElementsVisitor.getGroups(crit.getRightExpression()).isEmpty()

Modified: branches/7.7.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- branches/7.7.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2013-09-06 12:09:53 UTC (rev 4594)
+++ branches/7.7.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2013-09-13 12:58:49 UTC (rev 4595)
@@ -96,8 +96,9 @@
  */
 public class QueryRewriter {
 
-    public static final CompareCriteria TRUE_CRITERIA = new CompareCriteria(new Constant(1, DataTypeManager.DefaultDataClasses.INTEGER), CompareCriteria.EQ, new Constant(1, DataTypeManager.DefaultDataClasses.INTEGER));
-    public static final CompareCriteria FALSE_CRITERIA = new CompareCriteria(new Constant(1, DataTypeManager.DefaultDataClasses.INTEGER), CompareCriteria.EQ, new Constant(0, DataTypeManager.DefaultDataClasses.INTEGER)) {
+    private static final Constant ZERO_CONSTANT = new Constant(0, DataTypeManager.DefaultDataClasses.INTEGER);
+	public static final CompareCriteria TRUE_CRITERIA = new CompareCriteria(new Constant(1, DataTypeManager.DefaultDataClasses.INTEGER), CompareCriteria.EQ, new Constant(1, DataTypeManager.DefaultDataClasses.INTEGER));
+    public static final CompareCriteria FALSE_CRITERIA = new CompareCriteria(new Constant(1, DataTypeManager.DefaultDataClasses.INTEGER), CompareCriteria.EQ, ZERO_CONSTANT) {
     	public void setOptional(Boolean isOptional) {};
     };
     public static final CompareCriteria UNKNOWN_CRITERIA = new CompareCriteria(new Constant(null, DataTypeManager.DefaultDataClasses.STRING), CompareCriteria.NE, new Constant(null, DataTypeManager.DefaultDataClasses.STRING)) {

Modified: branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestAccessPatterns.java
===================================================================
--- branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestAccessPatterns.java	2013-09-06 12:09:53 UTC (rev 4594)
+++ branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestAccessPatterns.java	2013-09-13 12:58:49 UTC (rev 4595)
@@ -286,7 +286,7 @@
         
         TestOptimizer.helpPlan(sql, metadata,
 						new String[] {
-								"SELECT g_0.e2, g_0.e1 FROM pm5.g1 AS g_0 WHERE (g_0.e1 IN (<dependent values>)) AND (g_0.e1 IN (<dependent values>))", //$NON-NLS-1$ 
+								"SELECT g_0.e2, g_0.e1 FROM pm5.g1 AS g_0 WHERE g_0.e1 IN (<dependent values>)", //$NON-NLS-1$ 
 								"SELECT g_0.e1, g_0.e2, g_0.e3, g_0.e4 FROM pm1.g1 AS g_0", //$NON-NLS-1$
 								"SELECT g_0.e1 FROM pm4.g1 AS g_0 WHERE g_0.e1 IN (<dependent values>)" }, TestOptimizer.getGenericFinder(false), ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$   
     }

Modified: branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
===================================================================
--- branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java	2013-09-06 12:09:53 UTC (rev 4594)
+++ branches/7.7.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java	2013-09-13 12:58:49 UTC (rev 4595)
@@ -2692,6 +2692,15 @@
         checkNodeTypes(plan, FULL_PUSHDOWN);         
     }
     
+    @Test public void testCopyCriteriaWithTransitivePushdown3() throws TeiidComponentException, TeiidProcessingException{
+    	BasicSourceCapabilities caps = getTypicalCapabilities();
+    	caps.setFunctionSupport(SourceSystemFunctions.CONVERT, true);
+        ProcessorPlan plan = helpPlan("select pm1.g1.e1 from pm1.g1, pm1.g2, pm1.g3 where pm1.g1.e1 = pm1.g2.e1 and pm1.g1.e1 = pm1.g3.e2 and pm1.g3.e2 = pm1.g2.e1", RealMetadataFactory.example1Cached(), //$NON-NLS-1$
+            new String[] { "SELECT g_0.e1 FROM pm1.g1 AS g_0, pm1.g2 AS g_1, pm1.g3 AS g_2 WHERE (g_0.e1 = g_1.e1) AND (g_0.e1 = convert(g_2.e2, string)) AND (convert(g_2.e2, string) = g_1.e1)" }
+        , new DefaultCapabilitiesFinder(caps), ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+        checkNodeTypes(plan, FULL_PUSHDOWN);         
+    }
+    
     @Test public void testCleanCriteria(){
         
         ProcessorPlan plan = helpPlan("select pm2.g1.e1, pm2.g2.e1 from pm2.g1, pm2.g2 where pm2.g1.e1=pm2.g2.e1 and pm2.g1.e2 IN (1, 2)", example1(), //$NON-NLS-1$



More information about the teiid-commits mailing list