[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