Author: shawkins
Date: 2010-02-16 11:40:00 -0500 (Tue, 16 Feb 2010)
New Revision: 1829
Modified:
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/ConvertModifier.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/TranslatedCommand.java
trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/db2/TestDB2SqlTranslator.java
Log:
TEIID-934 further work was needed to fix the boolean logic, and in general there was a
problem with any modifier that "cloned" a language object.
Modified:
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/ConvertModifier.java
===================================================================
---
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/ConvertModifier.java 2010-02-15
20:26:34 UTC (rev 1828)
+++
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/ConvertModifier.java 2010-02-16
16:40:00 UTC (rev 1829)
@@ -181,8 +181,14 @@
this.addConvert(FunctionModifier.BOOLEAN, FunctionModifier.STRING, new
FunctionModifier() {
@Override
public List<?> translate(IFunction function) {
- IExpression stringValue = function.getParameters().get(0);
- return Arrays.asList("CASE WHEN ", stringValue, " = 0 THEN
'false' WHEN ", stringValue, " IS NOT NULL THEN 'true'
END"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ IExpression booleanValue = function.getParameters().get(0);
+ if (booleanValue instanceof IFunction) {
+ IFunction nested = (IFunction)booleanValue;
+ if (nested.getName().equalsIgnoreCase("convert") &&
Number.class.isAssignableFrom(nested.getParameters().get(0).getType())) { //$NON-NLS-1$
+ booleanValue = nested.getParameters().get(0);
+ }
+ }
+ return Arrays.asList("CASE WHEN ", booleanValue, " = 0 THEN
'false' WHEN ", booleanValue, " IS NOT NULL THEN 'true'
END"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
});
this.addConvert(FunctionModifier.STRING, FunctionModifier.BOOLEAN, new
FunctionModifier() {
Modified:
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java
===================================================================
---
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java 2010-02-15
20:26:34 UTC (rev 1828)
+++
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java 2010-02-16
16:40:00 UTC (rev 1829)
@@ -32,6 +32,7 @@
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.teiid.connector.api.ExecutionContext;
@@ -76,6 +77,7 @@
private List preparedValues = new ArrayList();
private Set<ILanguageObject> recursionObjects = Collections.newSetFromMap(new
IdentityHashMap<ILanguageObject, Boolean>());
+ private Map<ILanguageObject, Object> translations = new
IdentityHashMap<ILanguageObject, Object>();
private boolean replaceWithBinding = false;
@@ -98,7 +100,19 @@
}
List<?> parts = null;
if (!recursionObjects.contains(obj)) {
- parts = translator.translate(obj, context);
+ Object trans = this.translations.get(obj);
+ if (trans instanceof List<?>) {
+ parts = (List<?>)trans;
+ } else if (trans instanceof ILanguageObject) {
+ obj = (ILanguageObject)trans;
+ } else {
+ parts = translator.translate(obj, context);
+ if (parts != null) {
+ this.translations.put(obj, parts);
+ } else {
+ this.translations.put(obj, obj);
+ }
+ }
}
if (parts != null) {
recursionObjects.add(obj);
Modified:
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/TranslatedCommand.java
===================================================================
---
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/TranslatedCommand.java 2010-02-15
20:26:34 UTC (rev 1828)
+++
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/TranslatedCommand.java 2010-02-16
16:40:00 UTC (rev 1829)
@@ -45,8 +45,8 @@
private boolean prepared;
private List preparedValues;
- private SQLConversionVisitor sqlConversionVisitor;
private Translator sqlTranslator;
+ private ExecutionContext context;
/**
* Constructor, takes a SQLConversionVisitor subclass
@@ -54,8 +54,7 @@
*/
public TranslatedCommand(ExecutionContext context, Translator sqlTranslator){
this.sqlTranslator = sqlTranslator;
- this.sqlConversionVisitor = sqlTranslator.getSQLConversionVisitor();
- this.sqlConversionVisitor.setExecutionContext(context);
+ this.context = context;
}
/**
@@ -66,20 +65,18 @@
* @throws ConnectorException
*/
public void translateCommand(ICommand command) throws ConnectorException {
- this.sql = getSQL(command);
- this.preparedValues = this.sqlConversionVisitor.getPreparedValues();
- this.prepared = this.sqlConversionVisitor.isPrepared();
- }
-
- private String getSQL(ICommand command) {
+ SQLConversionVisitor sqlConversionVisitor =
sqlTranslator.getSQLConversionVisitor();
+ sqlConversionVisitor.setExecutionContext(context);
if (sqlTranslator.usePreparedStatements() || hasBindValue(command)) {
- this.sqlConversionVisitor.setPrepared(true);
+ sqlConversionVisitor.setPrepared(true);
}
- this.sqlConversionVisitor.append(command);
- return this.sqlConversionVisitor.toString();
- }
-
+ sqlConversionVisitor.append(command);
+ this.sql = sqlConversionVisitor.toString();
+ this.preparedValues = sqlConversionVisitor.getPreparedValues();
+ this.prepared = sqlConversionVisitor.isPrepared();
+ }
+
/**
* Simple check to see if any values in the command should be replaced with bind
values
*
Modified:
trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/db2/TestDB2SqlTranslator.java
===================================================================
---
trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/db2/TestDB2SqlTranslator.java 2010-02-15
20:26:34 UTC (rev 1828)
+++
trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/db2/TestDB2SqlTranslator.java 2010-02-16
16:40:00 UTC (rev 1829)
@@ -236,5 +236,14 @@
input, output,
TRANSLATOR);
}
+
+ @Test public void testBooleanToString() throws Exception {
+ String input = "SELECT convert(convert(INTKEY, boolean), string) FROM
BQT1.SmallA"; //$NON-NLS-1$
+ String output = "SELECT CASE WHEN SmallA.IntKey = 0 THEN 'false'
WHEN SmallA.IntKey IS NOT NULL THEN 'true' END FROM SmallA"; //$NON-NLS-1$
+
+ TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB,
+ input,
+ output, TRANSLATOR);
+ }
}