[teiid-commits] teiid SVN: r2974 - in trunk/engine/src: test/java/org/teiid/query/rewriter and 1 other directory.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Mon Mar 7 20:38:13 EST 2011
Author: shawkins
Date: 2011-03-07 20:38:13 -0500 (Mon, 07 Mar 2011)
New Revision: 2974
Modified:
trunk/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java
trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
Log:
TEIID-1498 fix for disjunctive predicate error
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-07 21:03:52 UTC (rev 2973)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Criteria.java 2011-03-08 01:38:13 UTC (rev 2974)
@@ -25,7 +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;
@@ -148,11 +147,20 @@
}
public static Criteria toDisjunctiveNormalForm(Criteria input) {
- return normalize(input, true);
+ Criteria result = normalize(input, true);
+ return cloneIfNeeded(input, result);
}
+
+ 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) {
- return normalize(input, false);
+ Criteria result = normalize(input, false);
+ return cloneIfNeeded(input, result);
}
/**
@@ -192,11 +200,10 @@
operator = (operator==CompoundCriteria.OR)?CompoundCriteria.AND:CompoundCriteria.OR;
}
- List criteria = new ArrayList(compCrit.getCriteria().size());
- List parts = new LinkedList();
+ List<Criteria> criteria = new ArrayList<Criteria>(compCrit.getCriteria().size());
+ List<CompoundCriteria> parts = new LinkedList<CompoundCriteria>();
- for (Iterator i = compCrit.getCriteria().iterator(); i.hasNext();) {
- Criteria crit = (Criteria)i.next();
+ for (Criteria crit : compCrit.getCriteria()) {
if (invert) {
crit = new NotCriteria(crit);
@@ -228,21 +235,21 @@
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();
+ int i = 0;
+ for (CompoundCriteria crit : parts) {
+ divisors[i++] = total;
+ total *= crit.getCriteriaCount();
}
- List newCrits = new ArrayList(total);
+ List<Criteria> newCrits = new ArrayList<Criteria>(total);
- for (int i = 0; i < total; i++) {
- CompoundCriteria crit = new CompoundCriteria(dnf?CompoundCriteria.AND:CompoundCriteria.OR, new ArrayList(parts.size() + criteria.size()));
+ 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 = (CompoundCriteria)parts.get(j);
+ CompoundCriteria disjunct = parts.get(j);
- Criteria part = (Criteria)disjunct.getCriteria().get((i/divisors[j])%disjunct.getCriteriaCount());
+ Criteria part = disjunct.getCriteria().get((i/divisors[j])%disjunct.getCriteriaCount());
crit.addCriteria(part);
}
newCrits.add(crit);
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-07 21:03:52 UTC (rev 2973)
+++ trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2011-03-08 01:38:13 UTC (rev 2974)
@@ -2231,9 +2231,12 @@
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 expected = "(pm1.g1.e2 >= 5) AND ((pm1.g1.e2 >= 5) OR (pm1.g1.e1 <> '1'))"; //$NON-NLS-1$
helpTestRewriteCriteria(original, expected);
}
More information about the teiid-commits
mailing list