[teiid-commits] teiid SVN: r2978 - 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 15:39:59 EST 2011


Author: shawkins
Date: 2011-03-08 15:39:59 -0500 (Tue, 08 Mar 2011)
New Revision: 2978

Modified:
   trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/AbstractCompareCriteria.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/BetweenCriteria.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java
   trunk/engine/src/test/java/org/teiid/query/processor/eval/TestCriteriaEvaluator.java
   trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
Log:
TEIID-1497 adding rewrite logic to handle non-executable subqueries

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 20:26:58 UTC (rev 2977)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2011-03-08 20:39:59 UTC (rev 2978)
@@ -1144,7 +1144,10 @@
 		    if (isNull(sub.getExpression())) {
 		        return UNKNOWN_CRITERIA;
 		    }
-		    rewriteSubqueryContainer((SubqueryContainer)criteria, true);
+		    rewriteSubqueryContainer(sub, true);
+		    if (!RelationalNodeUtil.shouldExecute(sub.getCommand(), false, true)) {
+		    	return getSimpliedCriteria(criteria, sub.getExpression(), !sub.isNegated(), true);
+		    }
         } else if (criteria instanceof DependentSetCriteria) {
             criteria = rewriteDependentSetCriteria((DependentSetCriteria)criteria);
         } else if (criteria instanceof ExpressionCriteria) {
@@ -1266,107 +1269,10 @@
                     } 
                 } else { 
                     if (operator == CompoundCriteria.AND) {
-	                	if (converted instanceof IsNullCriteria) {
-		                	IsNullCriteria inc = (IsNullCriteria)converted;
-		                	if (!inc.isNegated()) {
-			                	Criteria crit = exprMap.get(inc.getExpression());
-			                	if (crit == null) {
-			                		exprMap.put(inc.getExpression(), converted);
-			                	} else if (!(crit instanceof IsNullCriteria)) {
-			                		return FALSE_CRITERIA;
-			                	}
-		                	}
-		                } else if (converted instanceof SetCriteria) {
-		                	SetCriteria sc = (SetCriteria)converted;
-		                	Criteria crit = exprMap.get(sc.getExpression());
-		                	if (crit instanceof IsNullCriteria) {
-		                		return FALSE_CRITERIA;
-		                	}
-		                	if (!sc.isNegated() && sc.isAllConstants()) {
-		                    	if (crit == null) {
-		                    		exprMap.put(sc.getExpression(), converted);
-		                    	} else if (crit instanceof SetCriteria) {
-		                    		SetCriteria sc1 = (SetCriteria)crit;
-		                    		newCrits.remove(sc1);
-		                    		sc1.getValues().retainAll(sc.getValues());
-		                    		if (sc1.getValues().isEmpty()) {
-		                    			return FALSE_CRITERIA;
-		                    		}
-		                    		//TODO: single value as compare criteria
-		                    		newCrits.add(sc1);
-		                    		exprMap.put(sc1.getExpression(), sc1);
-		                    		continue;
-		                    	} else {
-		                    		CompareCriteria cc = (CompareCriteria)crit;
-		                    		for (Iterator<Constant> exprIter = sc.getValues().iterator(); exprIter.hasNext();) {
-										if (!Evaluator.compare(cc, exprIter.next().getValue(), ((Constant)cc.getRightExpression()).getValue())) {
-											exprIter.remove();
-										}
-									}
-		                    		if (sc.getValues().isEmpty()) {
-		                    			return FALSE_CRITERIA;
-		                    		}
-		                    		if (cc.getOperator() != CompareCriteria.EQ) {
-			                    		newCrits.remove(cc);
-			                    		//TODO: single value as compare criteria
-			                    		exprMap.put(sc.getExpression(), sc);
-		                    		} else {
-		                    			continue;
-		                    		}
-		                    	}
-		                	}
-		                } else if (converted instanceof CompareCriteria) {
-		                	CompareCriteria cc = (CompareCriteria)converted;
-		                	Criteria crit = exprMap.get(cc.getLeftExpression());
-		                	if (crit instanceof IsNullCriteria) {
-		                		return FALSE_CRITERIA;
-		                	}
-		                	if (cc.getRightExpression() instanceof Constant) {
-		                    	if (crit == null) {
-		                    		exprMap.put(cc.getLeftExpression(), cc);
-		                    	} else if (crit instanceof SetCriteria) {
-		                    		SetCriteria sc = (SetCriteria)crit;
-		                    		boolean modified = false;
-		                    		for (Iterator<Constant> exprIter = sc.getValues().iterator(); exprIter.hasNext();) {
-										if (!Evaluator.compare(cc, exprIter.next().getValue(), ((Constant)cc.getRightExpression()).getValue())) {
-											if (!modified) {
-												modified = true;
-												newCrits.remove(sc);
-											}
-											exprIter.remove();
-										}
-									}
-		                    		//TODO: single value as compare criteria
-		                    		if (sc.getValues().isEmpty()) {
-		                    			return FALSE_CRITERIA;
-		                    		}
-		                    		if (cc.getOperator() == CompareCriteria.EQ) {
-		                        		exprMap.put(cc.getLeftExpression(), cc);
-		                    		} else if (modified) {
-		                    			newCrits.add(sc);
-		                    			exprMap.put(sc.getExpression(), sc);
-			                    		continue;
-		                    		}
-		                    	} else {
-		                    		CompareCriteria cc1 = (CompareCriteria)crit;
-		                    		if (cc1.getOperator() == CompareCriteria.NE) {
-		                        		exprMap.put(cc.getLeftExpression(), cc);
-		                    		} else if (cc1.getOperator() == CompareCriteria.EQ) {
-		                    			if (!Evaluator.compare(cc1, ((Constant)cc1.getRightExpression()).getValue(), ((Constant)cc.getRightExpression()).getValue())) {
-											return FALSE_CRITERIA;
-										}
-		                    			continue;
-		                    		} 
-		                    		if (cc.getOperator() == CompareCriteria.EQ) {
-		                    			if (!Evaluator.compare(cc1, ((Constant)cc.getRightExpression()).getValue(), ((Constant)cc1.getRightExpression()).getValue())) {
-		                    				return FALSE_CRITERIA;
-		                    			}
-		                    			exprMap.put(cc.getLeftExpression(), cc);
-		                    			newCrits.remove(cc1);
-		                    		}
-		                    	}
-		                	}
-	                    } 
+	                	 converted = rewriteAndConjunct(converted, exprMap, newCrits);
+	                	 if (converted != null) {
+	                		 return converted;
+	                	 }
                     } else {
                     	//or
                     	if (converted instanceof SetCriteria) {
@@ -1407,8 +1313,8 @@
 			                	}
                     		}
                     	}
+                        newCrits.add(converted);
                     }
-                    newCrits.add(converted);
                 }            
             }
 		}
@@ -1428,6 +1334,116 @@
         }
 	}
     
+    /**
+     * Rewrite the given conjunct
+     * @return null if the conjunct was internally handled 
+     */
+    private Criteria rewriteAndConjunct(Criteria converted, Map<Expression, Criteria> exprMap, LinkedHashSet<Criteria> newCrits) throws ExpressionEvaluationException {
+    	if (converted instanceof IsNullCriteria) {
+        	IsNullCriteria inc = (IsNullCriteria)converted;
+        	if (!inc.isNegated()) {
+            	Criteria crit = exprMap.get(inc.getExpression());
+            	if (crit == null) {
+            		exprMap.put(inc.getExpression(), converted);
+            	} else if (!(crit instanceof IsNullCriteria)) {
+            		return FALSE_CRITERIA;
+            	}
+        	}
+        } else if (converted instanceof SetCriteria) {
+        	SetCriteria sc = (SetCriteria)converted;
+        	Criteria crit = exprMap.get(sc.getExpression());
+        	if (crit instanceof IsNullCriteria) {
+        		return FALSE_CRITERIA;
+        	}
+        	if (!sc.isNegated() && sc.isAllConstants()) {
+            	if (crit == null) {
+            		exprMap.put(sc.getExpression(), converted);
+            	} else if (crit instanceof SetCriteria) {
+            		SetCriteria sc1 = (SetCriteria)crit;
+            		newCrits.remove(sc1);
+            		sc1.getValues().retainAll(sc.getValues());
+            		if (sc1.getValues().isEmpty()) {
+            			return FALSE_CRITERIA;
+            		}
+            		//TODO: single value as compare criteria
+            		newCrits.add(sc1);
+            		exprMap.put(sc1.getExpression(), sc1);
+            		return null;
+            	} else {
+            		CompareCriteria cc = (CompareCriteria)crit;
+            		for (Iterator<Constant> exprIter = sc.getValues().iterator(); exprIter.hasNext();) {
+						if (!Evaluator.compare(cc, exprIter.next().getValue(), ((Constant)cc.getRightExpression()).getValue())) {
+							exprIter.remove();
+						}
+					}
+            		if (sc.getValues().isEmpty()) {
+            			return FALSE_CRITERIA;
+            		}
+            		if (cc.getOperator() != CompareCriteria.EQ) {
+                		newCrits.remove(cc);
+                		//TODO: single value as compare criteria
+                		exprMap.put(sc.getExpression(), sc);
+            		} else {
+            			return null;
+            		}
+            	}
+        	}
+        } else if (converted instanceof CompareCriteria) {
+        	CompareCriteria cc = (CompareCriteria)converted;
+        	Criteria crit = exprMap.get(cc.getLeftExpression());
+        	if (crit instanceof IsNullCriteria) {
+        		return FALSE_CRITERIA;
+        	}
+        	if (cc.getRightExpression() instanceof Constant) {
+            	if (crit == null) {
+            		exprMap.put(cc.getLeftExpression(), cc);
+            	} else if (crit instanceof SetCriteria) {
+            		SetCriteria sc = (SetCriteria)crit;
+            		boolean modified = false;
+            		for (Iterator<Constant> exprIter = sc.getValues().iterator(); exprIter.hasNext();) {
+						if (!Evaluator.compare(cc, exprIter.next().getValue(), ((Constant)cc.getRightExpression()).getValue())) {
+							if (!modified) {
+								modified = true;
+								newCrits.remove(sc);
+							}
+							exprIter.remove();
+						}
+					}
+            		//TODO: single value as compare criteria
+            		if (sc.getValues().isEmpty()) {
+            			return FALSE_CRITERIA;
+            		}
+            		if (cc.getOperator() == CompareCriteria.EQ) {
+                		exprMap.put(cc.getLeftExpression(), cc);
+            		} else if (modified) {
+            			newCrits.add(sc);
+            			exprMap.put(sc.getExpression(), sc);
+                		return null;
+            		}
+            	} else {
+            		CompareCriteria cc1 = (CompareCriteria)crit;
+            		if (cc1.getOperator() == CompareCriteria.NE) {
+                		exprMap.put(cc.getLeftExpression(), cc);
+            		} else if (cc1.getOperator() == CompareCriteria.EQ) {
+            			if (!Evaluator.compare(cc1, ((Constant)cc1.getRightExpression()).getValue(), ((Constant)cc.getRightExpression()).getValue())) {
+							return FALSE_CRITERIA;
+						}
+            			return null;
+            		} 
+            		if (cc.getOperator() == CompareCriteria.EQ) {
+            			if (!Evaluator.compare(cc1, ((Constant)cc.getRightExpression()).getValue(), ((Constant)cc1.getRightExpression()).getValue())) {
+            				return FALSE_CRITERIA;
+            			}
+            			exprMap.put(cc.getLeftExpression(), cc);
+            			newCrits.remove(cc1);
+            		}
+            	}
+        	}
+        }
+    	newCrits.add(converted);
+    	return null;
+    }
+    
     private Criteria evaluateCriteria(Criteria crit) throws TeiidComponentException, TeiidProcessingException{
         if(EvaluatableVisitor.isFullyEvaluatable(crit, !processing)) {
             try {
@@ -1568,6 +1584,10 @@
         }
         
         rewriteSubqueryContainer(criteria, true);
+        
+        if (!RelationalNodeUtil.shouldExecute(criteria.getCommand(), false, true)) {
+	    	return getSimpliedCriteria(criteria, criteria.getLeftExpression(), criteria.getPredicateQuantifier()==SubqueryCompareCriteria.ALL, true);
+	    }
 
         return criteria;
     }

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/AbstractCompareCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/AbstractCompareCriteria.java	2011-03-08 20:26:58 UTC (rev 2977)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/AbstractCompareCriteria.java	2011-03-08 20:39:59 UTC (rev 2978)
@@ -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: trunk/engine/src/main/java/org/teiid/query/sql/lang/BetweenCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/BetweenCriteria.java	2011-03-08 20:26:58 UTC (rev 2977)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/BetweenCriteria.java	2011-03-08 20:39:59 UTC (rev 2978)
@@ -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,7 +191,11 @@
         criteriaCopy.setNegated(isNegated());
 		return criteriaCopy;
 	}
+
+	@Override
+	public void negate() {
+		this.negated = !this.negated;		
+	}
 	
-
 }
 

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java	2011-03-08 20:26:58 UTC (rev 2977)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/CompareCriteria.java	2011-03-08 20:39:59 UTC (rev 2978)
@@ -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;
@@ -178,21 +177,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: trunk/engine/src/test/java/org/teiid/query/processor/eval/TestCriteriaEvaluator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/eval/TestCriteriaEvaluator.java	2011-03-08 20:26:58 UTC (rev 2977)
+++ trunk/engine/src/test/java/org/teiid/query/processor/eval/TestCriteriaEvaluator.java	2011-03-08 20:39:59 UTC (rev 2978)
@@ -93,7 +93,7 @@
         assertEquals("Result did not match expected value", expectedMatch, result); //$NON-NLS-1$
     }
         
-    private void helpTestCompareSubqueryCriteria(Criteria crit, boolean expectedResult, final Collection values) throws ExpressionEvaluationException, BlockedException, TeiidComponentException{
+    private void helpTestCompareSubqueryCriteria(Criteria crit, Boolean expectedResult, final Collection<Object> values) throws ExpressionEvaluationException, BlockedException, TeiidComponentException{
         
         Map elementMap = new HashMap();
         ElementSymbol e1 = new ElementSymbol("e1"); //$NON-NLS-1$
@@ -109,7 +109,7 @@
         			TeiidComponentException {
         		return new CollectionValueIterator(values);
         	}
-        }.evaluate(crit, tuple));
+        }.evaluateTVL(crit, tuple));
     }
 
     private SubqueryCompareCriteria helpGetCompareSubqueryCriteria(int operator, int predicateQuantifier){
@@ -470,7 +470,7 @@
         ArrayList values = new ArrayList();
         values.add(null);
         values.add(null);
-        helpTestCompareSubqueryCriteria(crit, false, values); 
+        helpTestCompareSubqueryCriteria(crit, null, values); 
     }
 
     @Test public void testCompareSubqueryCriteriaNulls4() throws Exception {
@@ -478,7 +478,7 @@
         ArrayList values = new ArrayList();
         values.add(null);
         values.add(null);
-        helpTestCompareSubqueryCriteria(crit, false, values); 
+        helpTestCompareSubqueryCriteria(crit, null, values); 
     }
 
     @Test public void testCompareSubqueryCriteriaNulls5() throws Exception {
@@ -507,7 +507,7 @@
         ArrayList values = new ArrayList();
         values.add(null);
         values.add(null);
-        helpTestCompareSubqueryCriteria(crit, false, values); 
+        helpTestCompareSubqueryCriteria(crit, null, values); 
     }
 
     /**
@@ -518,8 +518,8 @@
         ArrayList values = new ArrayList();
         values.add(null);
         values.add(null);
-        helpTestCompareSubqueryCriteria(crit, false, values); 
-    }
+        helpTestCompareSubqueryCriteria(crit, null, values); 
+    }    
     
     /**
      * Big decimal comparisons should ignore precision.

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 20:26:58 UTC (rev 2977)
+++ trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java	2011-03-08 20:39:59 UTC (rev 2978)
@@ -2429,6 +2429,18 @@
     	helpTestRewriteCriteria("pm1.g1.e2 in (5, 6) or pm1.g1.e2 = 2", "pm1.g1.e2 IN (2, 5, 6)");
     }
     
+    @Test public void testRewriteCritSubqueryFalse() {
+        helpTestRewriteCriteria("exists(select 1 from pm1.g1 where 1=0)", "1 = 0"); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
+    @Test public void testRewriteCritSubqueryFalse1() {
+        helpTestRewriteCriteria("not(pm1.g1.e1 < SOME (select 'a' from pm1.g1 where 1=0))", "1 = 0"); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
+    @Test public void testRewriteCritSubqueryFalse2() {
+        helpTestRewriteCriteria("pm1.g1.e1 < ALL (select 'a' from pm1.g1 where 1=0)", "pm1.g1.e1 IS NOT NULL"); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
 	@Test public void testUDFParse() throws Exception {     
         FunctionLibrary funcLibrary = new FunctionLibrary(FakeMetadataFactory.SFM.getSystemFunctions(), new FunctionTree("foo", new FakeFunctionMetadataSource()));
         FakeMetadataFacade metadata = new FakeMetadataFacade(FakeMetadataFactory.example1Cached().getStore(), funcLibrary);



More information about the teiid-commits mailing list