[teiid-commits] teiid SVN: r2978 - in trunk/engine/src: main/java/org/teiid/query/sql/lang and 2 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Tue Mar 8 15:39:59 EST 2011
Author: shawkins
Date: 2011-03-08 15:39:59 -0500 (Tue, 08 Mar 2011)
New Revision: 2978
Modified:
trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/AbstractCompareCriteria.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/BetweenCriteria.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java
trunk/engine/src/test/java/org/teiid/query/processor/eval/TestCriteriaEvaluator.java
trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
Log:
TEIID-1497 adding rewrite logic to handle non-executable subqueries
Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-03-08 20:26:58 UTC (rev 2977)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-03-08 20:39:59 UTC (rev 2978)
@@ -1144,7 +1144,10 @@
if (isNull(sub.getExpression())) {
return UNKNOWN_CRITERIA;
}
- rewriteSubqueryContainer((SubqueryContainer)criteria, true);
+ rewriteSubqueryContainer(sub, true);
+ if (!RelationalNodeUtil.shouldExecute(sub.getCommand(), false, true)) {
+ return getSimpliedCriteria(criteria, sub.getExpression(), !sub.isNegated(), true);
+ }
} else if (criteria instanceof DependentSetCriteria) {
criteria = rewriteDependentSetCriteria((DependentSetCriteria)criteria);
} else if (criteria instanceof ExpressionCriteria) {
@@ -1266,107 +1269,10 @@
}
} else {
if (operator == CompoundCriteria.AND) {
- if (converted instanceof IsNullCriteria) {
- IsNullCriteria inc = (IsNullCriteria)converted;
- if (!inc.isNegated()) {
- Criteria crit = exprMap.get(inc.getExpression());
- if (crit == null) {
- exprMap.put(inc.getExpression(), converted);
- } else if (!(crit instanceof IsNullCriteria)) {
- return FALSE_CRITERIA;
- }
- }
- } else if (converted instanceof SetCriteria) {
- SetCriteria sc = (SetCriteria)converted;
- Criteria crit = exprMap.get(sc.getExpression());
- if (crit instanceof IsNullCriteria) {
- return FALSE_CRITERIA;
- }
- if (!sc.isNegated() && sc.isAllConstants()) {
- if (crit == null) {
- exprMap.put(sc.getExpression(), converted);
- } else if (crit instanceof SetCriteria) {
- SetCriteria sc1 = (SetCriteria)crit;
- newCrits.remove(sc1);
- sc1.getValues().retainAll(sc.getValues());
- if (sc1.getValues().isEmpty()) {
- return FALSE_CRITERIA;
- }
- //TODO: single value as compare criteria
- newCrits.add(sc1);
- exprMap.put(sc1.getExpression(), sc1);
- continue;
- } else {
- CompareCriteria cc = (CompareCriteria)crit;
- for (Iterator<Constant> exprIter = sc.getValues().iterator(); exprIter.hasNext();) {
- if (!Evaluator.compare(cc, exprIter.next().getValue(), ((Constant)cc.getRightExpression()).getValue())) {
- exprIter.remove();
- }
- }
- if (sc.getValues().isEmpty()) {
- return FALSE_CRITERIA;
- }
- if (cc.getOperator() != CompareCriteria.EQ) {
- newCrits.remove(cc);
- //TODO: single value as compare criteria
- exprMap.put(sc.getExpression(), sc);
- } else {
- continue;
- }
- }
- }
- } else if (converted instanceof CompareCriteria) {
- CompareCriteria cc = (CompareCriteria)converted;
- Criteria crit = exprMap.get(cc.getLeftExpression());
- if (crit instanceof IsNullCriteria) {
- return FALSE_CRITERIA;
- }
- if (cc.getRightExpression() instanceof Constant) {
- if (crit == null) {
- exprMap.put(cc.getLeftExpression(), cc);
- } else if (crit instanceof SetCriteria) {
- SetCriteria sc = (SetCriteria)crit;
- boolean modified = false;
- for (Iterator<Constant> exprIter = sc.getValues().iterator(); exprIter.hasNext();) {
- if (!Evaluator.compare(cc, exprIter.next().getValue(), ((Constant)cc.getRightExpression()).getValue())) {
- if (!modified) {
- modified = true;
- newCrits.remove(sc);
- }
- exprIter.remove();
- }
- }
- //TODO: single value as compare criteria
- if (sc.getValues().isEmpty()) {
- return FALSE_CRITERIA;
- }
- if (cc.getOperator() == CompareCriteria.EQ) {
- exprMap.put(cc.getLeftExpression(), cc);
- } else if (modified) {
- newCrits.add(sc);
- exprMap.put(sc.getExpression(), sc);
- continue;
- }
- } else {
- CompareCriteria cc1 = (CompareCriteria)crit;
- if (cc1.getOperator() == CompareCriteria.NE) {
- exprMap.put(cc.getLeftExpression(), cc);
- } else if (cc1.getOperator() == CompareCriteria.EQ) {
- if (!Evaluator.compare(cc1, ((Constant)cc1.getRightExpression()).getValue(), ((Constant)cc.getRightExpression()).getValue())) {
- return FALSE_CRITERIA;
- }
- continue;
- }
- if (cc.getOperator() == CompareCriteria.EQ) {
- if (!Evaluator.compare(cc1, ((Constant)cc.getRightExpression()).getValue(), ((Constant)cc1.getRightExpression()).getValue())) {
- return FALSE_CRITERIA;
- }
- exprMap.put(cc.getLeftExpression(), cc);
- newCrits.remove(cc1);
- }
- }
- }
- }
+ converted = rewriteAndConjunct(converted, exprMap, newCrits);
+ if (converted != null) {
+ return converted;
+ }
} else {
//or
if (converted instanceof SetCriteria) {
@@ -1407,8 +1313,8 @@
}
}
}
+ newCrits.add(converted);
}
- newCrits.add(converted);
}
}
}
@@ -1428,6 +1334,116 @@
}
}
+ /**
+ * Rewrite the given conjunct
+ * @return null if the conjunct was internally handled
+ */
+ private Criteria rewriteAndConjunct(Criteria converted, Map<Expression, Criteria> exprMap, LinkedHashSet<Criteria> newCrits) throws ExpressionEvaluationException {
+ if (converted instanceof IsNullCriteria) {
+ IsNullCriteria inc = (IsNullCriteria)converted;
+ if (!inc.isNegated()) {
+ Criteria crit = exprMap.get(inc.getExpression());
+ if (crit == null) {
+ exprMap.put(inc.getExpression(), converted);
+ } else if (!(crit instanceof IsNullCriteria)) {
+ return FALSE_CRITERIA;
+ }
+ }
+ } else if (converted instanceof SetCriteria) {
+ SetCriteria sc = (SetCriteria)converted;
+ Criteria crit = exprMap.get(sc.getExpression());
+ if (crit instanceof IsNullCriteria) {
+ return FALSE_CRITERIA;
+ }
+ if (!sc.isNegated() && sc.isAllConstants()) {
+ if (crit == null) {
+ exprMap.put(sc.getExpression(), converted);
+ } else if (crit instanceof SetCriteria) {
+ SetCriteria sc1 = (SetCriteria)crit;
+ newCrits.remove(sc1);
+ sc1.getValues().retainAll(sc.getValues());
+ if (sc1.getValues().isEmpty()) {
+ return FALSE_CRITERIA;
+ }
+ //TODO: single value as compare criteria
+ newCrits.add(sc1);
+ exprMap.put(sc1.getExpression(), sc1);
+ return null;
+ } else {
+ CompareCriteria cc = (CompareCriteria)crit;
+ for (Iterator<Constant> exprIter = sc.getValues().iterator(); exprIter.hasNext();) {
+ if (!Evaluator.compare(cc, exprIter.next().getValue(), ((Constant)cc.getRightExpression()).getValue())) {
+ exprIter.remove();
+ }
+ }
+ if (sc.getValues().isEmpty()) {
+ return FALSE_CRITERIA;
+ }
+ if (cc.getOperator() != CompareCriteria.EQ) {
+ newCrits.remove(cc);
+ //TODO: single value as compare criteria
+ exprMap.put(sc.getExpression(), sc);
+ } else {
+ return null;
+ }
+ }
+ }
+ } else if (converted instanceof CompareCriteria) {
+ CompareCriteria cc = (CompareCriteria)converted;
+ Criteria crit = exprMap.get(cc.getLeftExpression());
+ if (crit instanceof IsNullCriteria) {
+ return FALSE_CRITERIA;
+ }
+ if (cc.getRightExpression() instanceof Constant) {
+ if (crit == null) {
+ exprMap.put(cc.getLeftExpression(), cc);
+ } else if (crit instanceof SetCriteria) {
+ SetCriteria sc = (SetCriteria)crit;
+ boolean modified = false;
+ for (Iterator<Constant> exprIter = sc.getValues().iterator(); exprIter.hasNext();) {
+ if (!Evaluator.compare(cc, exprIter.next().getValue(), ((Constant)cc.getRightExpression()).getValue())) {
+ if (!modified) {
+ modified = true;
+ newCrits.remove(sc);
+ }
+ exprIter.remove();
+ }
+ }
+ //TODO: single value as compare criteria
+ if (sc.getValues().isEmpty()) {
+ return FALSE_CRITERIA;
+ }
+ if (cc.getOperator() == CompareCriteria.EQ) {
+ exprMap.put(cc.getLeftExpression(), cc);
+ } else if (modified) {
+ newCrits.add(sc);
+ exprMap.put(sc.getExpression(), sc);
+ return null;
+ }
+ } else {
+ CompareCriteria cc1 = (CompareCriteria)crit;
+ if (cc1.getOperator() == CompareCriteria.NE) {
+ exprMap.put(cc.getLeftExpression(), cc);
+ } else if (cc1.getOperator() == CompareCriteria.EQ) {
+ if (!Evaluator.compare(cc1, ((Constant)cc1.getRightExpression()).getValue(), ((Constant)cc.getRightExpression()).getValue())) {
+ return FALSE_CRITERIA;
+ }
+ return null;
+ }
+ if (cc.getOperator() == CompareCriteria.EQ) {
+ if (!Evaluator.compare(cc1, ((Constant)cc.getRightExpression()).getValue(), ((Constant)cc1.getRightExpression()).getValue())) {
+ return FALSE_CRITERIA;
+ }
+ exprMap.put(cc.getLeftExpression(), cc);
+ newCrits.remove(cc1);
+ }
+ }
+ }
+ }
+ newCrits.add(converted);
+ return null;
+ }
+
private Criteria evaluateCriteria(Criteria crit) throws TeiidComponentException, TeiidProcessingException{
if(EvaluatableVisitor.isFullyEvaluatable(crit, !processing)) {
try {
@@ -1568,6 +1584,10 @@
}
rewriteSubqueryContainer(criteria, true);
+
+ if (!RelationalNodeUtil.shouldExecute(criteria.getCommand(), false, true)) {
+ return getSimpliedCriteria(criteria, criteria.getLeftExpression(), criteria.getPredicateQuantifier()==SubqueryCompareCriteria.ALL, true);
+ }
return criteria;
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/AbstractCompareCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/AbstractCompareCriteria.java 2011-03-08 20:26:58 UTC (rev 2977)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/AbstractCompareCriteria.java 2011-03-08 20:39:59 UTC (rev 2978)
@@ -23,6 +23,7 @@
package org.teiid.query.sql.lang;
import org.teiid.query.QueryPlugin;
+import org.teiid.query.sql.lang.PredicateCriteria.Negatable;
import org.teiid.query.sql.symbol.Expression;
/**
@@ -30,7 +31,7 @@
* {@link SubqueryCompareCriteria}. The comparison operators are defined
* here.</p>
*/
-public abstract class AbstractCompareCriteria extends PredicateCriteria {
+public abstract class AbstractCompareCriteria extends PredicateCriteria implements Negatable {
/** Constant indicating the two operands are equal. */
public static final int EQ = 1;
@@ -132,5 +133,22 @@
default: return "??"; //$NON-NLS-1$
}
}
+
+ @Override
+ public void negate() {
+ this.setOperator(getInverseOperator(this.getOperator()));
+ }
+
+ public static int getInverseOperator(int op) {
+ switch ( op ) {
+ case EQ: return NE;
+ case NE: return EQ;
+ case LT: return GE;
+ case GT: return LE;
+ case LE: return GT;
+ case GE: return LT;
+ default: return -1;
+ }
+ }
} // END CLASS
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/BetweenCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/BetweenCriteria.java 2011-03-08 20:26:58 UTC (rev 2977)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/BetweenCriteria.java 2011-03-08 20:39:59 UTC (rev 2978)
@@ -24,14 +24,15 @@
import org.teiid.core.util.EquivalenceUtil;
import org.teiid.core.util.HashCodeUtil;
-import org.teiid.query.sql.*;
+import org.teiid.query.sql.LanguageVisitor;
+import org.teiid.query.sql.lang.PredicateCriteria.Negatable;
import org.teiid.query.sql.symbol.Expression;
/**
* Represents criteria such as: "<expression> [NOT] BETWEEN <lowerExpression> AND <upperExpression>".
*/
-public class BetweenCriteria extends PredicateCriteria {
+public class BetweenCriteria extends PredicateCriteria implements Negatable {
private Expression expression;
private Expression lowerExpression;
@@ -190,7 +191,11 @@
criteriaCopy.setNegated(isNegated());
return criteriaCopy;
}
+
+ @Override
+ public void negate() {
+ this.negated = !this.negated;
+ }
-
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java 2011-03-08 20:26:58 UTC (rev 2977)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java 2011-03-08 20:39:59 UTC (rev 2978)
@@ -25,7 +25,6 @@
import org.teiid.core.util.EquivalenceUtil;
import org.teiid.core.util.HashCodeUtil;
import org.teiid.query.sql.LanguageVisitor;
-import org.teiid.query.sql.lang.PredicateCriteria.Negatable;
import org.teiid.query.sql.symbol.Expression;
@@ -42,7 +41,7 @@
* <LI>5 <= length(companyName)</LI>
* </UL>
*/
-public class CompareCriteria extends AbstractCompareCriteria implements Negatable {
+public class CompareCriteria extends AbstractCompareCriteria {
/** The right-hand expression. */
private Expression rightExpression;
@@ -178,21 +177,4 @@
return result;
}
- @Override
- public void negate() {
- this.setOperator(getInverseOperator(this.getOperator()));
- }
-
- public static int getInverseOperator(int op) {
- switch ( op ) {
- case EQ: return NE;
- case NE: return EQ;
- case LT: return GE;
- case GT: return LE;
- case LE: return GT;
- case GE: return LT;
- default: return -1;
- }
- }
-
} // END CLASS
Modified: trunk/engine/src/test/java/org/teiid/query/processor/eval/TestCriteriaEvaluator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/eval/TestCriteriaEvaluator.java 2011-03-08 20:26:58 UTC (rev 2977)
+++ trunk/engine/src/test/java/org/teiid/query/processor/eval/TestCriteriaEvaluator.java 2011-03-08 20:39:59 UTC (rev 2978)
@@ -93,7 +93,7 @@
assertEquals("Result did not match expected value", expectedMatch, result); //$NON-NLS-1$
}
- private void helpTestCompareSubqueryCriteria(Criteria crit, boolean expectedResult, final Collection values) throws ExpressionEvaluationException, BlockedException, TeiidComponentException{
+ private void helpTestCompareSubqueryCriteria(Criteria crit, Boolean expectedResult, final Collection<Object> values) throws ExpressionEvaluationException, BlockedException, TeiidComponentException{
Map elementMap = new HashMap();
ElementSymbol e1 = new ElementSymbol("e1"); //$NON-NLS-1$
@@ -109,7 +109,7 @@
TeiidComponentException {
return new CollectionValueIterator(values);
}
- }.evaluate(crit, tuple));
+ }.evaluateTVL(crit, tuple));
}
private SubqueryCompareCriteria helpGetCompareSubqueryCriteria(int operator, int predicateQuantifier){
@@ -470,7 +470,7 @@
ArrayList values = new ArrayList();
values.add(null);
values.add(null);
- helpTestCompareSubqueryCriteria(crit, false, values);
+ helpTestCompareSubqueryCriteria(crit, null, values);
}
@Test public void testCompareSubqueryCriteriaNulls4() throws Exception {
@@ -478,7 +478,7 @@
ArrayList values = new ArrayList();
values.add(null);
values.add(null);
- helpTestCompareSubqueryCriteria(crit, false, values);
+ helpTestCompareSubqueryCriteria(crit, null, values);
}
@Test public void testCompareSubqueryCriteriaNulls5() throws Exception {
@@ -507,7 +507,7 @@
ArrayList values = new ArrayList();
values.add(null);
values.add(null);
- helpTestCompareSubqueryCriteria(crit, false, values);
+ helpTestCompareSubqueryCriteria(crit, null, values);
}
/**
@@ -518,8 +518,8 @@
ArrayList values = new ArrayList();
values.add(null);
values.add(null);
- helpTestCompareSubqueryCriteria(crit, false, values);
- }
+ helpTestCompareSubqueryCriteria(crit, null, values);
+ }
/**
* Big decimal comparisons should ignore precision.
Modified: trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2011-03-08 20:26:58 UTC (rev 2977)
+++ trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2011-03-08 20:39:59 UTC (rev 2978)
@@ -2429,6 +2429,18 @@
helpTestRewriteCriteria("pm1.g1.e2 in (5, 6) or pm1.g1.e2 = 2", "pm1.g1.e2 IN (2, 5, 6)");
}
+ @Test public void testRewriteCritSubqueryFalse() {
+ helpTestRewriteCriteria("exists(select 1 from pm1.g1 where 1=0)", "1 = 0"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Test public void testRewriteCritSubqueryFalse1() {
+ helpTestRewriteCriteria("not(pm1.g1.e1 < SOME (select 'a' from pm1.g1 where 1=0))", "1 = 0"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Test public void testRewriteCritSubqueryFalse2() {
+ helpTestRewriteCriteria("pm1.g1.e1 < ALL (select 'a' from pm1.g1 where 1=0)", "pm1.g1.e1 IS NOT NULL"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
@Test public void testUDFParse() throws Exception {
FunctionLibrary funcLibrary = new FunctionLibrary(FakeMetadataFactory.SFM.getSystemFunctions(), new FunctionTree("foo", new FakeFunctionMetadataSource()));
FakeMetadataFacade metadata = new FakeMetadataFacade(FakeMetadataFactory.example1Cached().getStore(), funcLibrary);
More information about the teiid-commits
mailing list