[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