[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