[teiid-commits] teiid SVN: r2976 - 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 14:55:45 EST 2011
Author: shawkins
Date: 2011-03-08 14:55:44 -0500 (Tue, 08 Mar 2011)
New Revision: 2976
Modified:
trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java
trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
trunk/engine/src/test/java/org/teiid/query/sql/lang/TestCriteria.java
Log:
TEIID-1498 refinement to remove the need for full cnf
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 18:13:40 UTC (rev 2975)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-03-08 19:55:44 UTC (rev 2976)
@@ -1459,7 +1459,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: trunk/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java 2011-03-08 18:13:40 UTC (rev 2975)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java 2011-03-08 19:55:44 UTC (rev 2976)
@@ -25,7 +25,6 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.LinkedList;
import java.util.List;
import org.teiid.core.types.DataTypeManager;
@@ -146,120 +145,36 @@
return compCrit;
}
- public static Criteria toDisjunctiveNormalForm(Criteria input) {
- Criteria result = normalize(input, true);
- return cloneIfNeeded(input, result);
- }
+ public static Criteria applyDemorgan(Criteria input) {
- private static Criteria cloneIfNeeded(Criteria input, Criteria result) {
- if (result != null && !result.equals(input)) {
- return (Criteria) result.clone();
- }
- return input;
- }
-
- public static Criteria toConjunctiveNormalForm(Criteria input) {
- Criteria result = normalize(input, false);
- return cloneIfNeeded(input, result);
- }
-
- /**
- * Returns a new criteria object in the equivalent normal form to the input.
- *
- * @param input
- * @return
- */
- static Criteria normalize(Criteria input, boolean dnf) {
-
- 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<CompoundCriteria> parts = new LinkedList<CompoundCriteria>();
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()];
- int i = 0;
- for (CompoundCriteria crit : parts) {
- divisors[i++] = total;
- total *= crit.getCriteriaCount();
- }
-
- List<Criteria> newCrits = new ArrayList<Criteria>(total);
-
- for (i = 0; i < total; i++) {
- CompoundCriteria crit = new CompoundCriteria(dnf?CompoundCriteria.AND:CompoundCriteria.OR, new ArrayList<Criteria>(parts.size() + criteria.size()));
- crit.getCriteria().addAll(criteria);
- for (int j = 0; j < parts.size(); j++) {
- CompoundCriteria disjunct = parts.get(j);
-
- Criteria part = 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: 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 18:13:40 UTC (rev 2975)
+++ trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2011-03-08 19:55:44 UTC (rev 2976)
@@ -2231,23 +2231,41 @@
helpTestRewriteCriteria(original, expected);
}
- /**
- * TODO: this should just be (pm1.g1.e2 >= 5) OR (pm1.g1.e1 <> '1')
- */
@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 original = "not((pm1.g1.e1 like '%' or pm1.g1.e2 = 1) and pm1.g1.e2 < 5)"; //$NON-NLS-1$
+ String expected = "pm1.g1.e2 >= 5"; //$NON-NLS-1$
helpTestRewriteCriteria(original, expected);
}
+ @Test public void testRewriteNullHandling4a() {
+ String original = "not(not((pm1.g1.e1 like '%' or pm1.g1.e2 = 1) and pm1.g1.e2 < 5))"; //$NON-NLS-1$
+ String expected = "((pm1.g1.e1 IS NOT NULL) OR (pm1.g1.e2 = 1)) AND (pm1.g1.e2 < 5)"; //$NON-NLS-1$
+
+ helpTestRewriteCriteria(original, expected);
+ }
+
@Test public void testRewriteNullHandling5() {
- String original = "not(pm1.g1.e1 not like '%' and pm1.g1.e3 = '1') or pm1.g1.e2 < 5"; //$NON-NLS-1$
- String expected = "(pm1.g1.e1 IS NOT NULL) OR (pm1.g1.e3 <> TRUE) OR (pm1.g1.e2 < 5)"; //$NON-NLS-1$
+ String original = "not((pm1.g1.e1 not like '%' or pm1.g1.e2 = 1) and pm1.g1.e2 < 5)"; //$NON-NLS-1$
+ String expected = "((pm1.g1.e1 IS NOT NULL) AND (pm1.g1.e2 <> 1)) OR (pm1.g1.e2 >= 5)"; //$NON-NLS-1$
helpTestRewriteCriteria(original, expected);
}
+ @Test public void testRewriteNullHandling6() {
+ String original = "not((pm1.g1.e1 not like '%' and pm1.g1.e2 = 1) or pm1.g1.e2 < 5)"; //$NON-NLS-1$
+ String expected = "((pm1.g1.e1 IS NOT NULL) OR (pm1.g1.e2 <> 1)) AND (pm1.g1.e2 >= 5)"; //$NON-NLS-1$
+
+ helpTestRewriteCriteria(original, expected);
+ }
+
+ @Test public void testRewriteNullHandling7() {
+ String original = "not(not(pm1.g1.e1 not like '%' and pm1.g1.e2 = 1) or pm1.g1.e2 < 5)"; //$NON-NLS-1$
+ String expected = "1 = 0"; //$NON-NLS-1$
+
+ helpTestRewriteCriteria(original, expected);
+ }
+
@Test public void testRewriteChar() {
String original = "convert(pm1.g1.e1, char) = '100'"; //$NON-NLS-1$
String expected = "1 = 0"; //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/sql/lang/TestCriteria.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/lang/TestCriteria.java 2011-03-08 18:13:40 UTC (rev 2975)
+++ trunk/engine/src/test/java/org/teiid/query/sql/lang/TestCriteria.java 2011-03-08 19:55:44 UTC (rev 2976)
@@ -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