[teiid-commits] teiid SVN: r1829 - in trunk/connectors/connector-jdbc/src: test/java/org/teiid/connector/jdbc/db2 and 1 other directory.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue Feb 16 11:40:01 EST 2010


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);
+    }
 
 }



More information about the teiid-commits mailing list