[teiid-commits] teiid SVN: r3065 - in trunk: connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc and 5 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue Apr 5 13:46:53 EDT 2011


Author: shawkins
Date: 2011-04-05 13:46:53 -0400 (Tue, 05 Apr 2011)
New Revision: 3065

Modified:
   trunk/api/src/main/java/org/teiid/language/Literal.java
   trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SQLConversionVisitor.java
   trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/TestSQLConversionVisitor.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentCriteriaProcessor.java
   trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/Constant.java
Log:
TEIID-1546 adding logic to be more selective to what is marked as a bind value

Modified: trunk/api/src/main/java/org/teiid/language/Literal.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/Literal.java	2011-04-05 16:58:20 UTC (rev 3064)
+++ trunk/api/src/main/java/org/teiid/language/Literal.java	2011-04-05 17:46:53 UTC (rev 3065)
@@ -35,6 +35,7 @@
     private Class<?> type;
     private boolean bindValue;
     private boolean multiValued;
+    private boolean isBindEligible;
     
     public Literal(Object value, Class<?> type) {
         this.value = value;
@@ -76,5 +77,19 @@
 	public void setType(Class<?> type) {
 		this.type = type;
 	}
+	
+	/**
+	 * Set by the optimizer if the literal was created by the evaluation of another expression.
+	 * Setting to true will not always result in the value being handled as a bind value.
+	 * That can be forced {@link #isBindValue()}
+	 * @return
+	 */
+	public boolean isBindEligible() {
+		return isBindEligible;
+	}
+	
+	public void setBindEligible(boolean isBindEligible) {
+		this.isBindEligible = isBindEligible;
+	}
 
 }

Modified: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SQLConversionVisitor.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SQLConversionVisitor.java	2011-04-05 16:58:20 UTC (rev 3064)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/SQLConversionVisitor.java	2011-04-05 17:46:53 UTC (rev 3065)
@@ -193,7 +193,7 @@
      * @see org.teiid.language.visitor.SQLStringVisitor#visit(org.teiid.language.Literal)
      */
     public void visit(Literal obj) {
-        if (this.prepared && (replaceWithBinding || TranslatedCommand.isBindEligible(obj) || obj.isBindValue())) {
+        if (this.prepared && ((replaceWithBinding && obj.isBindEligible()) || TranslatedCommand.isBindEligible(obj) || obj.isBindValue())) {
             buffer.append(UNDEFINED_PARAM);
             preparedValues.add(obj);
         } else {

Modified: trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/TestSQLConversionVisitor.java
===================================================================
--- trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/TestSQLConversionVisitor.java	2011-04-05 16:58:20 UTC (rev 3064)
+++ trunk/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/TestSQLConversionVisitor.java	2011-04-05 17:46:53 UTC (rev 3065)
@@ -22,7 +22,7 @@
 
 package org.teiid.translator.jdbc;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -35,8 +35,8 @@
 import org.teiid.dqp.internal.datamgr.TstLanguageBridgeFactory;
 import org.teiid.language.LanguageObject;
 import org.teiid.metadata.RuntimeMetadata;
+import org.teiid.translator.ExecutionContext;
 import org.teiid.translator.TranslatorException;
-import org.teiid.translator.ExecutionContext;
 
 /**
  */
@@ -311,28 +311,28 @@
 
     @Test public void testPreparedStatementCreationWithUpdate() {
         helpTestVisitor(getTestVDB(),
-                        "update parts set part_weight = 'a' where part_weight < 5", //$NON-NLS-1$
+                        "update parts set part_weight = 'a' || 'b' where part_weight < 50/10", //$NON-NLS-1$
                         "UPDATE PARTS SET PART_WEIGHT = ? WHERE PARTS.PART_WEIGHT < ?", //$NON-NLS-1$
                         true); 
     }
     
     @Test public void testPreparedStatementCreationWithInsert() {
         helpTestVisitor(getTestVDB(),
-                        "insert into parts (part_weight) values (5)", //$NON-NLS-1$
+                        "insert into parts (part_weight) values (50/10)", //$NON-NLS-1$
                         "INSERT INTO PARTS (PART_WEIGHT) VALUES (?)", //$NON-NLS-1$
                         true); 
     }
     
     @Test public void testPreparedStatementCreationWithSelect() {
         helpTestVisitor(getTestVDB(),
-                        "select part_name from parts where part_id not in ('x', 'y') and part_weight < 6", //$NON-NLS-1$
-                        "SELECT PARTS.PART_NAME FROM PARTS WHERE PARTS.PART_ID NOT IN (?, ?) AND PARTS.PART_WEIGHT < ?", //$NON-NLS-1$
+                        "select part_name from parts where part_id not in ('x' || 'a', 'y' || 'b') and part_weight < '6'", //$NON-NLS-1$
+                        "SELECT PARTS.PART_NAME FROM PARTS WHERE PARTS.PART_ID NOT IN (?, ?) AND PARTS.PART_WEIGHT < '6'", //$NON-NLS-1$
                         true); 
     }
     
     @Test public void testPreparedStatementCreationWithLike() {
         helpTestVisitor(getTestVDB(),
-                        "select part_name from parts where part_name like '%foo'", //$NON-NLS-1$
+                        "select part_name from parts where part_name like '%foo' || '_'", //$NON-NLS-1$
                         "SELECT PARTS.PART_NAME FROM PARTS WHERE PARTS.PART_NAME LIKE ?", //$NON-NLS-1$
                         true); 
     }
@@ -361,7 +361,7 @@
     
     @Test public void testPreparedStatementCreationWithCase() {
         helpTestVisitor(getTestVDB(),
-                        "SELECT PARTS.PART_NAME FROM PARTS WHERE PARTS.PART_WEIGHT = CASE WHEN PARTS.PART_NAME='a' THEN 'b' ELSE 'c' END", //$NON-NLS-1$
+                        "SELECT PARTS.PART_NAME FROM PARTS WHERE PARTS.PART_WEIGHT = CASE WHEN PARTS.PART_NAME='a' || 'b' THEN 'b' ELSE 'c' END", //$NON-NLS-1$
                         "SELECT PARTS.PART_NAME FROM PARTS WHERE PARTS.PART_WEIGHT = CASE WHEN PARTS.PART_NAME = ? THEN 'b' ELSE 'c' END", //$NON-NLS-1$
                         true); 
     }

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java	2011-04-05 16:58:20 UTC (rev 3064)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java	2011-04-05 17:46:53 UTC (rev 3065)
@@ -493,6 +493,7 @@
         Literal result = new Literal(constant.getValue(), constant.getType());
         result.setBindValue(constant.isMultiValued());
         result.setMultiValued(constant.isMultiValued());
+        result.setBindEligible(constant.isBindEligible());
         return result;
     }
 

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentCriteriaProcessor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentCriteriaProcessor.java	2011-04-05 16:58:20 UTC (rev 3064)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentCriteriaProcessor.java	2011-04-05 17:46:53 UTC (rev 3065)
@@ -382,13 +382,13 @@
     	
     	for (int i = 0; i < numberOfSets; i++) {
     		if (maxSize == 1 || i + 1 == state.replacement.size()) {
-				orCrits.add(new CompareCriteria(crit.getExpression(), CompareCriteria.EQ, new Constant(iter.next())));    				
+				orCrits.add(new CompareCriteria(crit.getExpression(), CompareCriteria.EQ, newConstant(iter.next())));    				
 			} else {
 	    		List<Constant> vals = new ArrayList<Constant>(Math.min(state.replacement.size(), maxSize));
 				
 	    		for (int j = 0; j < maxSize && iter.hasNext(); j++) {
 	    			Object val = iter.next();
-	                vals.add(new Constant(val));
+	                vals.add(newConstant(val));
 	            }
 	            
 	            SetCriteria sc = new SetCriteria();
@@ -402,5 +402,11 @@
     	}
     	return new CompoundCriteria(CompoundCriteria.OR, orCrits);
     }
+    
+    private Constant newConstant(Object val) {
+    	Constant c = new Constant(val);
+    	c.setBindEligible(true);
+    	return c;
+    }
 
 }

Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2011-04-05 16:58:20 UTC (rev 3064)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2011-04-05 17:46:53 UTC (rev 3065)
@@ -46,6 +46,7 @@
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.api.exception.query.QueryValidatorException;
+import org.teiid.common.buffer.BlockedException;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.TeiidException;
 import org.teiid.core.TeiidProcessingException;
@@ -172,8 +173,8 @@
  */
 public class QueryRewriter {
 
-    public static final CompareCriteria TRUE_CRITERIA = new CompareCriteria(new Constant(new Integer(1), DataTypeManager.DefaultDataClasses.INTEGER), CompareCriteria.EQ, new Constant(new Integer(1), DataTypeManager.DefaultDataClasses.INTEGER));
-    public static final CompareCriteria FALSE_CRITERIA = new CompareCriteria(new Constant(new Integer(1), DataTypeManager.DefaultDataClasses.INTEGER), CompareCriteria.EQ, new Constant(new Integer(0), DataTypeManager.DefaultDataClasses.INTEGER));
+    public static final CompareCriteria TRUE_CRITERIA = new CompareCriteria(new Constant(1, DataTypeManager.DefaultDataClasses.INTEGER), CompareCriteria.EQ, new Constant(1, DataTypeManager.DefaultDataClasses.INTEGER));
+    public static final CompareCriteria FALSE_CRITERIA = new CompareCriteria(new Constant(1, DataTypeManager.DefaultDataClasses.INTEGER), CompareCriteria.EQ, new Constant(0, DataTypeManager.DefaultDataClasses.INTEGER));
     public static final CompareCriteria UNKNOWN_CRITERIA = new CompareCriteria(new Constant(null, DataTypeManager.DefaultDataClasses.STRING), CompareCriteria.NE, new Constant(null, DataTypeManager.DefaultDataClasses.STRING));
     
     private static final Map<String, String> ALIASED_FUNCTIONS = new HashMap<String, String>();
@@ -2280,7 +2281,9 @@
             }
             return expression;
     	}
+    	boolean isBindEligible = true;
     	if(expression instanceof Function) {
+    		isBindEligible = !isConstantConvert(expression);
     		expression = rewriteFunction((Function) expression);
 		} else if (expression instanceof CaseExpression) {
 			expression = rewriteCaseExpression((CaseExpression)expression);
@@ -2319,13 +2322,35 @@
 			return expression;
 		}
     	
+		return evaluate(expression, isBindEligible);
+	}
+
+	private Constant evaluate(Expression expression, boolean isBindEligible)
+			throws ExpressionEvaluationException, BlockedException,
+			TeiidComponentException {
 		Object value = evaluator.evaluate(expression, Collections.emptyList());
         if (value instanceof Constant) {
         	return (Constant)value; //multi valued substitution
         }
-		return new Constant(value, expression.getType());
+		Constant result = new Constant(value, expression.getType());
+		result.setBindEligible(isBindEligible);
+		return result;
 	}
     
+    private boolean isConstantConvert(Expression ex) {
+    	if (ex instanceof Constant) {
+    		return true;
+    	}
+    	if (!(ex instanceof Function)) {
+    		return false;
+    	}
+    	Function f = (Function)ex;
+		if (!FunctionLibrary.isConvert(f)) {
+			return false;
+		}
+		return isConstantConvert(f.getArg(0));
+    }
+    
     private Expression rewriteExpression(AggregateSymbol expression) {
     	if (expression.isBoolean()) {
     		if (expression.getAggregateFunction() == Type.EVERY) {
@@ -2691,7 +2716,8 @@
             if (!processing) {
             	param.setExpression(rewriteExpressionDirect(param.getExpression()));
             } else if (!(param.getExpression() instanceof Constant)) {
-            	param.setExpression(new Constant(this.evaluator.evaluate(param.getExpression(), null), param.getClassType()));
+            	boolean isBindEligible = !isConstantConvert(param.getExpression());
+            	param.setExpression(evaluate(param.getExpression(), isBindEligible));
             }
         }
         return storedProcedure;

Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/Constant.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/Constant.java	2011-04-05 16:58:20 UTC (rev 3064)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/Constant.java	2011-04-05 17:46:53 UTC (rev 3065)
@@ -44,6 +44,7 @@
 	private Object value;
 	private Class<?> type;
 	private boolean multiValued;
+	private boolean bindEligible;
 
 	/**
 	 * Construct a typed constant.  The specified value is not verified to be a value
@@ -52,7 +53,7 @@
      * @param value Constant value, may be null
 	 * @param type Type for the constant, should never be null
 	 */
-	public Constant(Object value, Class type) {
+	public Constant(Object value, Class<?> type) {
         // Set value
         this.value = DataTypeManager.convertToRuntimeType(value);
 
@@ -194,6 +195,7 @@
 	public Object clone() {
         Constant copy =  new Constant(getValue(), getType());
         copy.multiValued = multiValued;
+        copy.bindEligible = bindEligible;
         return copy;
 	}
 
@@ -219,4 +221,12 @@
 		return ((Comparable)this.value).compareTo(o.getValue());
 	}
 	
+	public boolean isBindEligible() {
+		return bindEligible;
+	}
+	
+	public void setBindEligible(boolean bindEligible) {
+		this.bindEligible = bindEligible;
+	}
+	
 }



More information about the teiid-commits mailing list