[teiid-commits] teiid SVN: r3001 - in branches/7.1.x/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
Thu Mar 17 10:41:44 EDT 2011
Author: shawkins
Date: 2011-03-17 10:41:44 -0400 (Thu, 17 Mar 2011)
New Revision: 3001
Modified:
branches/7.1.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/AbstractCompareCriteria.java
branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/BetweenCriteria.java
branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java
branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java
branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/SubqueryCompareCriteria.java
branches/7.1.x/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
branches/7.1.x/engine/src/test/java/org/teiid/query/sql/lang/TestCriteria.java
Log:
TEIID-1498 fix for cnf rewrite clone issue
Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-03-17 14:25:04 UTC (rev 3000)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-03-17 14:41:44 UTC (rev 3001)
@@ -1159,7 +1159,7 @@
Criteria innerCrit = criteria.getCriteria();
if (innerCrit instanceof CompoundCriteria) {
//reduce to only negation of predicates, so that the null/unknown handling criteria is applied appropriately
- return rewriteCriteria(Criteria.toConjunctiveNormalForm(criteria));
+ return rewriteCriteria(Criteria.applyDemorgan(innerCrit));
}
if (innerCrit instanceof Negatable) {
((Negatable) innerCrit).negate();
Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/AbstractCompareCriteria.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/AbstractCompareCriteria.java 2011-03-17 14:25:04 UTC (rev 3000)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/AbstractCompareCriteria.java 2011-03-17 14:41:44 UTC (rev 3001)
@@ -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: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/BetweenCriteria.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/BetweenCriteria.java 2011-03-17 14:25:04 UTC (rev 3000)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/BetweenCriteria.java 2011-03-17 14:41:44 UTC (rev 3001)
@@ -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,6 +191,11 @@
criteriaCopy.setNegated(isNegated());
return criteriaCopy;
}
+
+ @Override
+ public void negate() {
+ this.negated = !this.negated;
+ }
}
Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java 2011-03-17 14:25:04 UTC (rev 3000)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java 2011-03-17 14:41:44 UTC (rev 3001)
@@ -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;
@@ -174,21 +173,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: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java 2011-03-17 14:25:04 UTC (rev 3000)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java 2011-03-17 14:41:44 UTC (rev 3001)
@@ -25,8 +25,6 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedList;
import java.util.List;
import org.teiid.core.types.DataTypeManager;
@@ -147,112 +145,36 @@
return compCrit;
}
- public static Criteria toDisjunctiveNormalForm(Criteria input) {
- return normalize(input, true);
- }
-
- public static Criteria toConjunctiveNormalForm(Criteria input) {
- return normalize(input, false);
- }
-
- /**
- * Returns a new criteria object in the equivalent normal form to the input.
- *
- * @param input
- * @return
- */
- static Criteria normalize(Criteria input, boolean dnf) {
+ public static Criteria applyDemorgan(Criteria input) {
- boolean invert = false;
-
if (input instanceof NotCriteria) {
NotCriteria not = (NotCriteria)input;
- Criteria child = not.getCriteria();
-
- if (child instanceof NotCriteria) {
- return normalize(((NotCriteria)child).getCriteria(), dnf);
- }
-
- if (child instanceof CompoundCriteria) {
- invert = true;
- input = child;
- }
+ return not.getCriteria();
}
if (!(input instanceof CompoundCriteria)) {
- return input;
+ return new NotCriteria(input);
}
CompoundCriteria compCrit = (CompoundCriteria)input;
- int operator = compCrit.getOperator();
+ int operator = (compCrit.getOperator()==CompoundCriteria.OR)?CompoundCriteria.AND:CompoundCriteria.OR;
- if (invert) {
- operator = (operator==CompoundCriteria.OR)?CompoundCriteria.AND:CompoundCriteria.OR;
- }
+ List<Criteria> criteria = new ArrayList<Criteria>(compCrit.getCriteria().size());
- List criteria = new ArrayList(compCrit.getCriteria().size());
- List parts = new LinkedList();
-
- for (Iterator i = compCrit.getCriteria().iterator(); i.hasNext();) {
- Criteria crit = (Criteria)i.next();
+ for (Criteria crit : compCrit.getCriteria()) {
- if (invert) {
- crit = new NotCriteria(crit);
- }
-
- crit = normalize(crit, dnf);
-
- if (crit instanceof CompoundCriteria) {
- CompoundCriteria child = (CompoundCriteria)crit;
-
- if (operator == child.getOperator()) {
- criteria.addAll(child.getCriteria());
- continue;
- }
-
- if ((dnf && operator == CompoundCriteria.AND) || (!dnf && operator == CompoundCriteria.OR)) {
- parts.add(child);
- continue;
- }
- }
+ crit = new NotCriteria(crit);
criteria.add(crit);
}
-
- if (parts.isEmpty()) {
- //no expansion needed, just return
- return new CompoundCriteria(operator, criteria);
- }
- int total = 1;
- int[] divisors = new int[parts.size()];
-
- for (int i = 0; i < parts.size(); i++) {
- divisors[i] = total;
- total *= ((CompoundCriteria)parts.get(i)).getCriteriaCount();
- }
-
- List newCrits = new ArrayList(total);
-
- for (int i = 0; i < total; i++) {
- CompoundCriteria crit = new CompoundCriteria(dnf?CompoundCriteria.AND:CompoundCriteria.OR, new ArrayList(parts.size() + criteria.size()));
- crit.getCriteria().addAll(criteria);
- for (int j = 0; j < parts.size(); j++) {
- CompoundCriteria disjunct = (CompoundCriteria)parts.get(j);
-
- Criteria part = (Criteria)disjunct.getCriteria().get((i/divisors[j])%disjunct.getCriteriaCount());
- crit.addCriteria(part);
- }
- newCrits.add(crit);
- }
-
- return new CompoundCriteria(!dnf?CompoundCriteria.AND:CompoundCriteria.OR, newCrits);
+ return new CompoundCriteria(operator, criteria);
}
@Override
- public Class getType() {
+ public Class<?> getType() {
return DataTypeManager.DefaultDataClasses.BOOLEAN;
}
Modified: branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/SubqueryCompareCriteria.java
===================================================================
--- branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/SubqueryCompareCriteria.java 2011-03-17 14:25:04 UTC (rev 3000)
+++ branches/7.1.x/engine/src/main/java/org/teiid/query/sql/lang/SubqueryCompareCriteria.java 2011-03-17 14:41:44 UTC (rev 3001)
@@ -213,5 +213,15 @@
public Expression getRightExpression() {
return new ScalarSubquery(getCommand());
}
+
+ @Override
+ public void negate() {
+ super.negate();
+ if (this.predicateQuantifier == ALL) {
+ this.predicateQuantifier = SOME;
+ } else {
+ this.predicateQuantifier = ALL;
+ }
+ }
}
Modified: branches/7.1.x/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2011-03-17 14:25:04 UTC (rev 3000)
+++ branches/7.1.x/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2011-03-17 14:41:44 UTC (rev 3001)
@@ -2231,7 +2231,7 @@
@Test public void testRewriteNullHandling4() {
String original = "not((pm1.g1.e1 like '%' or pm1.g1.e1 = '1') and pm1.g1.e2 < 5)"; //$NON-NLS-1$
- String expected = "(pm1.g1.e2 < 5) AND ((pm1.g1.e2 < 5) OR (pm1.g1.e1 <> '1'))"; //$NON-NLS-1$
+ String expected = "pm1.g1.e2 >= 5"; //$NON-NLS-1$
helpTestRewriteCriteria(original, expected);
}
Modified: branches/7.1.x/engine/src/test/java/org/teiid/query/sql/lang/TestCriteria.java
===================================================================
--- branches/7.1.x/engine/src/test/java/org/teiid/query/sql/lang/TestCriteria.java 2011-03-17 14:25:04 UTC (rev 3000)
+++ branches/7.1.x/engine/src/test/java/org/teiid/query/sql/lang/TestCriteria.java 2011-03-17 14:41:44 UTC (rev 3001)
@@ -25,18 +25,12 @@
import java.util.Arrays;
import java.util.Collection;
-import org.teiid.api.exception.query.QueryParserException;
-import org.teiid.query.parser.QueryParser;
-import org.teiid.query.sql.lang.CompareCriteria;
-import org.teiid.query.sql.lang.CompoundCriteria;
-import org.teiid.query.sql.lang.Criteria;
-import org.teiid.query.sql.lang.NotCriteria;
+import junit.framework.TestCase;
+
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
-import junit.framework.*;
-
/**
*/
public class TestCriteria extends TestCase {
@@ -57,8 +51,8 @@
}
public void helpTestSeparateCriteria(Criteria originalCrit, Criteria[] partsArray) {
- Collection expectedParts = Arrays.asList(partsArray);
- Collection actualParts = Criteria.separateCriteriaByAnd(originalCrit);
+ Collection<Criteria> expectedParts = Arrays.asList(partsArray);
+ Collection<Criteria> actualParts = Criteria.separateCriteriaByAnd(originalCrit);
assertEquals("Didn't get the same parts ", expectedParts, actualParts); //$NON-NLS-1$
}
@@ -185,48 +179,5 @@
compCrit2.addCriteria(crit2);
helpTestCombineCriteria(crit3, compCrit, compCrit2);
}
-
- private void helpTestNormalize(String critString,
- String resultString, String cnfString) throws QueryParserException {
- QueryParser parser = new QueryParser();
- Criteria crit = parser.parseCriteria(critString);
-
- assertEquals(resultString, Criteria.normalize(crit, true).toString());
- assertEquals(cnfString, Criteria.normalize(crit, false).toString());
- }
- public void testNF() throws Exception {
- String critString = "((4 = '4') AND (5 = '5')) OR ((1 = '1') AND ((2 = '2') OR (3 = '3')))"; //$NON-NLS-1$
- String resultString = "((4 = '4') AND (5 = '5')) OR ((1 = '1') AND (2 = '2')) OR ((1 = '1') AND (3 = '3'))"; //$NON-NLS-1$
- String cnf = "((4 = '4') OR (1 = '1')) AND ((5 = '5') OR (1 = '1')) AND ((4 = '4') OR ((2 = '2') OR (3 = '3'))) AND ((5 = '5') OR ((2 = '2') OR (3 = '3')))"; //$NON-NLS-1$
- helpTestNormalize(critString, resultString, cnf);
- }
-
- public void testNF1() throws Exception {
- String critString = "4 = '4'"; //$NON-NLS-1$
- String resultString = "4 = '4'"; //$NON-NLS-1$
- helpTestNormalize(critString, resultString, resultString);
- }
-
- public void testNF2() throws Exception {
- String critString = "((4 = '4') OR (1 = '1') OR (2 = '2')) AND ((3 = '3') OR (5 = '5'))"; //$NON-NLS-1$
- String resultString = "((4 = '4') AND (3 = '3')) OR ((1 = '1') AND (3 = '3')) OR ((2 = '2') AND (3 = '3')) OR ((4 = '4') AND (5 = '5')) OR ((1 = '1') AND (5 = '5')) OR ((2 = '2') AND (5 = '5'))"; //$NON-NLS-1$
- String cnf = "((4 = '4') OR (1 = '1') OR (2 = '2')) AND ((3 = '3') OR (5 = '5'))"; //$NON-NLS-1$
- helpTestNormalize(critString, resultString, cnf);
- }
-
- public void testNF3() throws Exception {
- String critString = "NOT (((1 = '1') OR (2 = '2')) AND ((3 = '3') OR (5 = '5')))"; //$NON-NLS-1$
- String resultString = "((NOT (1 = '1')) AND (NOT (2 = '2'))) OR ((NOT (3 = '3')) AND (NOT (5 = '5')))"; //$NON-NLS-1$
- String cnf = "((NOT (1 = '1')) OR (NOT (3 = '3'))) AND ((NOT (2 = '2')) OR (NOT (3 = '3'))) AND ((NOT (1 = '1')) OR (NOT (5 = '5'))) AND ((NOT (2 = '2')) OR (NOT (5 = '5')))"; //$NON-NLS-1$
- helpTestNormalize(critString, resultString, cnf);
- }
-
- public void testNF4() throws Exception {
- String critString = "(1 = '1') OR (2 = '2')"; //$NON-NLS-1$
- String resultString = "(1 = '1') OR (2 = '2')"; //$NON-NLS-1$
- String cnf = "(1 = '1') OR (2 = '2')"; //$NON-NLS-1$
- helpTestNormalize(critString, resultString, cnf);
- }
-
}
More information about the teiid-commits
mailing list