[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