[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 &lt;= 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