[teiid-commits] teiid SVN: r3310 - in branches/7.4.x: connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/teradata and 4 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Wed Jul 13 15:58:49 EDT 2011


Author: shawkins
Date: 2011-07-13 15:58:48 -0400 (Wed, 13 Jul 2011)
New Revision: 3310

Modified:
   branches/7.4.x/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teradata/TeradataExecutionFactory.java
   branches/7.4.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/teradata/TestTeradataTranslator.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/FrameUtil.java
   branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
   branches/7.4.x/engine/src/main/resources/org/teiid/query/i18n.properties
   branches/7.4.x/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
Log:
TEIID-1664 removing unnecessary implicit conversions and reverting teradata convert removal

Modified: branches/7.4.x/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teradata/TeradataExecutionFactory.java
===================================================================
--- branches/7.4.x/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teradata/TeradataExecutionFactory.java	2011-07-13 16:38:23 UTC (rev 3309)
+++ branches/7.4.x/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/teradata/TeradataExecutionFactory.java	2011-07-13 19:58:48 UTC (rev 3310)
@@ -115,21 +115,12 @@
     	convert.addNumericBooleanConversions();
 		
 		registerFunctionModifier(SourceSystemFunctions.CONVERT, convert);
-		registerFunctionModifier(SourceSystemFunctions.SUBSTRING, new SubstrModifier(this.convert)); 
+		registerFunctionModifier(SourceSystemFunctions.SUBSTRING, new AliasModifier("substr")); //$NON-NLS-1$	
 		registerFunctionModifier(SourceSystemFunctions.RAND, new AliasModifier("random")); //$NON-NLS-1$				
 		registerFunctionModifier(SourceSystemFunctions.LOG, new AliasModifier("LN")); //$NON-NLS-1$
-		registerFunctionModifier(SourceSystemFunctions.LCASE, new StringOnlyModifier("LOWER", this.convert)); //$NON-NLS-1$
-		registerFunctionModifier(SourceSystemFunctions.UCASE, new StringOnlyModifier("UPPER", this.convert)); //$NON-NLS-1$
-		registerFunctionModifier(SourceSystemFunctions.LENGTH, new FunctionModifier() {
-			@Override
-			public List<?> translate(Function function) {
-				ArrayList target = new ArrayList();
-				target.add("character_length("); //$NON-NLS-1$
-				target.addAll(expressionToString(function.getParameters().get(0), convert));
-				target.add(")"); //$NON-NLS-1$
-				return target;
-			}
-		});
+		registerFunctionModifier(SourceSystemFunctions.LCASE, new AliasModifier("LOWER")); //$NON-NLS-1$
+		registerFunctionModifier(SourceSystemFunctions.UCASE, new AliasModifier("UPPER")); //$NON-NLS-1$
+		registerFunctionModifier(SourceSystemFunctions.LENGTH, new AliasModifier("character_length")); //$NON-NLS-1$
 		registerFunctionModifier(SourceSystemFunctions.CURDATE, new AliasModifier("CURRENT_DATE")); //$NON-NLS-1$
 		registerFunctionModifier(SourceSystemFunctions.CURTIME, new AliasModifier("CURRENT_TIME")); //$NON-NLS-1$
 		registerFunctionModifier(SourceSystemFunctions.YEAR, new ExtractModifier("YEAR")); //$NON-NLS-1$
@@ -151,9 +142,9 @@
         registerFunctionModifier(SourceSystemFunctions.LTRIM, new FunctionModifier() {
 			@Override
 			public List<?> translate(Function function) {
-				ArrayList target = new ArrayList();
+				ArrayList<Object> target = new ArrayList<Object>();
 				target.add("TRIM(LEADING FROM ");//$NON-NLS-1$
-				target.addAll(expressionToString(function.getParameters().get(0), convert));
+				target.add(function.getParameters().get(0));
 				target.add(")"); //$NON-NLS-1$				
 				return target; 
 			}
@@ -161,9 +152,9 @@
         registerFunctionModifier(SourceSystemFunctions.RTRIM, new FunctionModifier() {
 			@Override
 			public List<?> translate(Function function) {
-				ArrayList target = new ArrayList();
+				ArrayList<Object> target = new ArrayList<Object>();
 				target.add("TRIM(TRAILING FROM ");//$NON-NLS-1$
-				target.addAll(expressionToString(function.getParameters().get(0), convert));
+				target.add(function.getParameters().get(0));
 				target.add(")"); //$NON-NLS-1$
 				return target; 
 			}
@@ -199,7 +190,7 @@
 	
 	
     @Override
-    public List getSupportedFunctions() {
+    public List<String> getSupportedFunctions() {
         List<String> supportedFunctions = new ArrayList<String>();
         supportedFunctions.addAll(super.getSupportedFunctions());
 
@@ -342,67 +333,31 @@
 		
     	@Override
 		public List<?> translate(Function function) {
-    		ArrayList target = new ArrayList();
+    		ArrayList<Object> target = new ArrayList<Object>();
     		Expression expr1 =  function.getParameters().get(0);
     		Expression expr2 =  function.getParameters().get(1);
     		if (function.getParameters().size() > 2) {
     			Expression expr3 =  function.getParameters().get(2);
 	    		target.add("position("); //$NON-NLS-1$
-	    		target.addAll(expressionToString(expr1, this.convertModifier));
+	    		target.add(expr1);
 	    		target.add( " in "); //$NON-NLS-1$
 	    		target.add("substr("); //$NON-NLS-1$
-	    		target.addAll(expressionToString(expr2, this.convertModifier));
+	    		target.add(expr2);
 	    		target.add(","); //$NON-NLS-1$
 	    		target.add(expr3);
 	    		target.add("))"); //$NON-NLS-1$	    		
     		}
     		else {
 	    		target.add("position("); //$NON-NLS-1$
-	    		target.addAll(expressionToString(expr1, this.convertModifier));
+	    		target.add(expr1);
 	    		target.add( " in "); //$NON-NLS-1$
-	    		target.addAll(expressionToString(expr2, this.convertModifier));
+	    		target.add(expr2);
 	    		target.add(")"); //$NON-NLS-1$
     		}
     		return target;
 		}
 	}
     
-    private static List<?> expressionToString(Expression expr, ConvertModifier modifier) {
-    	Class tgtType = expr.getType();
-		if (tgtType.equals(String.class) && ((expr instanceof Literal) || expr instanceof ColumnReference)) {
-			return Arrays.asList(expr);  
-		}
-		else if (tgtType.equals(String.class) && (expr instanceof Function)) {
-			
-			Function func = (Function)expr;
-			while(true) {
-				Expression arg1 = func.getParameters().get(0);
-				if ((arg1 instanceof Function) && ((Function)arg1).getName().equals("convert")) { //$NON-NLS-1$
-					func = (Function)arg1;
-				}
-				else {
-					break;
-				}
-			}
-			Expression arg1 = func.getParameters().get(0);
-			if (arg1 instanceof ColumnReference) {
-				ColumnReference ref = (ColumnReference)func.getParameters().get(0);
-				if(Number.class.isAssignableFrom(ref.getType())) {
-					ArrayList target = new ArrayList();
-					target.add("cast("); //$NON-NLS-1$
-					target.add(func.getParameters().get(0));
-					target.add(" AS varchar(100))"); //$NON-NLS-1$
-					return target;
-				}
-				else if (String.class.isAssignableFrom(ref.getType())) {
-					return Arrays.asList(ref);
-				}
-			}
-			return modifier.translate(func);	
-		} 
-		return Arrays.asList("cast(" , expr, " AS varchar(100))"); //$NON-NLS-1$ //$NON-NLS-2$ 
-    }
-
 	public static class ExtractModifier extends FunctionModifier {
     	private String type;
     	public ExtractModifier(String type) {
@@ -425,47 +380,6 @@
 		}
 	}
     
-    public static class StringOnlyModifier extends FunctionModifier {
-    	String funcName;
-    	ConvertModifier convertModifier;
-    	public StringOnlyModifier(String name, ConvertModifier converModifier) {
-    		this.funcName = name;
-    		this.convertModifier = converModifier;
-    	}
-    	@Override
-		public List<?> translate(Function function) {
-			Expression expr = function.getParameters().get(0);
-			ArrayList target = new ArrayList();
-			target.add(this.funcName);
-			target.add("("); //$NON-NLS-1$
-			target.addAll(expressionToString(expr, this.convertModifier));
-			target.add(")"); //$NON-NLS-1$
-			return target;
-		}
-	}
-    
-    public static class SubstrModifier extends FunctionModifier {
-    	ConvertModifier convertModifier;
-    	public SubstrModifier(ConvertModifier converModifier) {
-    		this.convertModifier = converModifier;
-    	}
-    	@Override
-		public List<?> translate(Function function) {
-			Expression expr = function.getParameters().get(0);
-			ArrayList target = new ArrayList();
-			target.add("substr("); //$NON-NLS-1$
-			target.addAll(expressionToString(expr, this.convertModifier));
-			target.add(","); //$NON-NLS-1$
-			target.add(function.getParameters().get(1)); 
-			if (function.getParameters().size() > 2 ) {
-				target.add(","); //$NON-NLS-1$
-				target.add(function.getParameters().get(2)); 
-			}
-			target.add(")"); //$NON-NLS-1$
-			return target;
-		}
-	}    
-    
     public static class LeftOrRightFunctionModifier extends FunctionModifier {
         private LanguageFactory langFactory;
         ConvertModifier convertModifier;
@@ -478,11 +392,11 @@
         @Override
         public List<?> translate(Function function) {
             List<Expression> args = function.getParameters();
-            ArrayList target = new ArrayList();
+            ArrayList<Object> target = new ArrayList<Object>();
             if (function.getName().equalsIgnoreCase("left")) { //$NON-NLS-1$
             	//substr(string, 1, length)
             	target.add("substr("); //$NON-NLS-1$
-            	target.addAll(expressionToString(args.get(0), this.convertModifier));
+            	target.add(args.get(0));
             	target.add(","); //$NON-NLS-1$
             	target.add(langFactory.createLiteral(Integer.valueOf(1), TypeFacility.RUNTIME_TYPES.INTEGER));
             	target.add(","); //$NON-NLS-1$
@@ -491,10 +405,10 @@
             } else if (function.getName().equalsIgnoreCase("right")) { //$NON-NLS-1$
             	//substr(case_size, character_length(case_size) -4) 
             	target.add("substr("); //$NON-NLS-1$
-            	target.addAll(expressionToString(args.get(0), this.convertModifier));
+            	target.add(args.get(0));
             	
             	target.add(",(character_length("); //$NON-NLS-1$
-            	target.addAll(expressionToString(args.get(0), this.convertModifier));
+            	target.add(args.get(0));
             	target.add(")-"); //$NON-NLS-1$
             	target.add(args.get(1));
             	target.add("+1))"); //$NON-NLS-1$ // offset for 1 based index

Modified: branches/7.4.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/teradata/TestTeradataTranslator.java
===================================================================
--- branches/7.4.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/teradata/TestTeradataTranslator.java	2011-07-13 16:38:23 UTC (rev 3309)
+++ branches/7.4.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/teradata/TestTeradataTranslator.java	2011-07-13 19:58:48 UTC (rev 3310)
@@ -84,19 +84,19 @@
     
     @Test public void testIntegerToString() throws Exception {
         String input = "SELECT lcase(bigdecimalvalue) FROM BQT1.SMALLA"; 
-        String output = "SELECT LOWER(cast(SmallA.BigDecimalValue AS varchar(100))) FROM SmallA"; 
+        String output = "SELECT LOWER(cast(SmallA.BigDecimalValue AS varchar(4000))) FROM SmallA"; 
         TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, input, output, TRANSLATOR);    	
     }    
     
     @Test public void testSubString() throws Exception {
         String input = "SELECT intkey FROM BQT1.SmallA WHERE SUBSTRING(BQT1.SmallA.IntKey, 1) = '1' ORDER BY intkey"; 
-        String output = "SELECT SmallA.IntKey FROM SmallA WHERE substr(cast(SmallA.IntKey AS varchar(100)),1) = '1' ORDER BY 1"; 
+        String output = "SELECT SmallA.IntKey FROM SmallA WHERE substr(cast(SmallA.IntKey AS varchar(4000)), 1) = '1' ORDER BY 1"; 
         TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, input, output, TRANSLATOR);    	
     }  
     
     @Test public void testSubString2() throws Exception {
         String input = "SELECT intkey FROM BQT1.SmallA WHERE SUBSTRING(BQT1.SmallA.IntKey, 1, 2) = '1' ORDER BY intkey"; 
-        String output = "SELECT SmallA.IntKey FROM SmallA WHERE substr(cast(SmallA.IntKey AS varchar(100)),1,2) = '1' ORDER BY 1"; 
+        String output = "SELECT SmallA.IntKey FROM SmallA WHERE substr(cast(SmallA.IntKey AS varchar(4000)), 1, 2) = '1' ORDER BY 1"; 
         TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, input, output, TRANSLATOR);    	
     }     
     
@@ -108,7 +108,7 @@
     
     @Test public void testLocate() throws Exception {
         String input = "SELECT INTKEY, BIGDECIMALVALUE FROM BQT1.SmallA WHERE LOCATE('-', BIGDECIMALVALUE) = 1 ORDER BY intkey"; 
-        String output = "SELECT SmallA.IntKey, SmallA.BigDecimalValue FROM SmallA WHERE position('-' in cast(SmallA.BigDecimalValue AS varchar(100))) = 1 ORDER BY 1"; 
+        String output = "SELECT SmallA.IntKey, SmallA.BigDecimalValue FROM SmallA WHERE position('-' in cast(SmallA.BigDecimalValue AS varchar(4000))) = 1 ORDER BY 1"; 
         TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, input, output, TRANSLATOR);    	
     }      
     
@@ -222,13 +222,13 @@
 	
 	@Test public void testRightFunction() throws Exception {
 		String input = "SELECT INTKEY, FLOATNUM FROM BQT1.SmallA WHERE right(FLOATNUM, 2) <> 0 ORDER BY INTKEY";
-		String out = "SELECT SmallA.IntKey, SmallA.FloatNum FROM SmallA WHERE substr(cast(SmallA.FloatNum AS varchar(100)),(character_length(cast(SmallA.FloatNum AS varchar(100)))-2+1)) <> '0' ORDER BY 1";
+		String out = "SELECT SmallA.IntKey, SmallA.FloatNum FROM SmallA WHERE substr(cast(SmallA.FloatNum AS varchar(4000)),(character_length(cast(SmallA.FloatNum AS varchar(4000)))-2+1)) <> '0' ORDER BY 1";
 		TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, null, input, out, TRANSLATOR);		
 	}
 	
 	@Test public void testLocateFunction() throws Exception {
 		String input = "SELECT INTKEY, STRINGKEY, SHORTVALUE FROM BQT1.SmallA WHERE (LOCATE(0, STRINGKEY) = 2) OR (LOCATE(2, SHORTVALUE, 4) = 6) ORDER BY intkey";
-		String out = "SELECT SmallA.IntKey, SmallA.StringKey, SmallA.ShortValue FROM SmallA WHERE position('0' in SmallA.StringKey) = 2 OR position('2' in substr(cast(SmallA.ShortValue AS varchar(100)),4)) = 6 ORDER BY 1";
+		String out = "SELECT SmallA.IntKey, SmallA.StringKey, SmallA.ShortValue FROM SmallA WHERE position('0' in SmallA.StringKey) = 2 OR position('2' in substr(cast(SmallA.ShortValue AS varchar(4000)),4)) = 6 ORDER BY 1";
 		TranslationHelper.helpTestVisitor(TranslationHelper.BQT_VDB, null, input, out, TRANSLATOR);		
 	}	
 }

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/FrameUtil.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/FrameUtil.java	2011-07-13 16:38:23 UTC (rev 3309)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/optimizer/relational/rules/FrameUtil.java	2011-07-13 19:58:48 UTC (rev 3310)
@@ -37,7 +37,6 @@
 import org.teiid.api.exception.query.QueryPlannerException;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.TeiidProcessingException;
-import org.teiid.core.TeiidRuntimeException;
 import org.teiid.core.util.Assertion;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.metadata.QueryMetadataInterface;
@@ -49,17 +48,21 @@
 import org.teiid.query.resolver.util.AccessPattern;
 import org.teiid.query.resolver.util.ResolverUtil;
 import org.teiid.query.rewriter.QueryRewriter;
+import org.teiid.query.sql.LanguageObject;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.CompoundCriteria;
 import org.teiid.query.sql.lang.Criteria;
 import org.teiid.query.sql.lang.GroupBy;
 import org.teiid.query.sql.lang.OrderBy;
+import org.teiid.query.sql.lang.OrderByItem;
 import org.teiid.query.sql.lang.QueryCommand;
 import org.teiid.query.sql.lang.Select;
 import org.teiid.query.sql.lang.StoredProcedure;
+import org.teiid.query.sql.symbol.AliasSymbol;
 import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
+import org.teiid.query.sql.symbol.ExpressionSymbol;
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.sql.symbol.SingleElementSymbol;
 import org.teiid.query.sql.util.SymbolMap;
@@ -124,15 +127,15 @@
 	}
     
     static boolean canConvertAccessPatterns(PlanNode sourceNode) {
-        List accessPatterns = (List)sourceNode.getProperty(NodeConstants.Info.ACCESS_PATTERNS);
+        List<AccessPattern> accessPatterns = (List)sourceNode.getProperty(NodeConstants.Info.ACCESS_PATTERNS);
         if (accessPatterns == null) {
             return true;
         }
         SymbolMap symbolMap = (SymbolMap)sourceNode.getProperty(NodeConstants.Info.SYMBOL_MAP);
-        for (Iterator i = accessPatterns.iterator(); i.hasNext();) {
-            AccessPattern ap = (AccessPattern)i.next();
-            for (Iterator elems = ap.getUnsatisfied().iterator(); elems.hasNext();) {
-                ElementSymbol symbol = (ElementSymbol)elems.next();
+        for (Iterator<AccessPattern> i = accessPatterns.iterator(); i.hasNext();) {
+            AccessPattern ap = i.next();
+            for (Iterator<ElementSymbol> elems = ap.getUnsatisfied().iterator(); elems.hasNext();) {
+                ElementSymbol symbol = elems.next();
                 Expression mapped = convertExpression(symbol, symbolMap.asMap());
                 if (ElementCollectorVisitor.getElements(mapped, true).isEmpty()) {
                     return false;
@@ -153,15 +156,15 @@
         if (accessPatterns != null) {
         	for (AccessPattern ap : accessPatterns) {
                 Set<ElementSymbol> newElements = new HashSet<ElementSymbol>();
-                for (Iterator elems = ap.getUnsatisfied().iterator(); elems.hasNext();) {
-                    ElementSymbol symbol = (ElementSymbol)elems.next();
+                for (Iterator<ElementSymbol> elems = ap.getUnsatisfied().iterator(); elems.hasNext();) {
+                    ElementSymbol symbol = elems.next();
                     Expression mapped = convertExpression(symbol, symbolMap);
                     newElements.addAll(ElementCollectorVisitor.getElements(mapped, true));
                 }
                 ap.setUnsatisfied(newElements);
                 Set<ElementSymbol> newHistory = new HashSet<ElementSymbol>();
-                for (Iterator elems = ap.getCurrentElements().iterator(); elems.hasNext();) {
-                    ElementSymbol symbol = (ElementSymbol)elems.next();
+                for (Iterator<ElementSymbol> elems = ap.getCurrentElements().iterator(); elems.hasNext();) {
+                    ElementSymbol symbol = elems.next();
                     Expression mapped = convertExpression(symbol, symbolMap);
                     newHistory.addAll(ElementCollectorVisitor.getElements(mapped, true));
                 }
@@ -228,6 +231,11 @@
             List<SingleElementSymbol> projectedSymbols = (List<SingleElementSymbol>)node.getProperty(NodeConstants.Info.PROJECT_COLS);
             Select select = new Select(projectedSymbols);
             ExpressionMappingVisitor.mapExpressions(select, symbolMap);
+            if (rewrite) {
+            	for (LanguageObject expr : select.getSymbols()) {
+					rewriteSingleElementSymbol(metadata, (SingleElementSymbol) expr);
+				}
+            }
             node.setProperty(NodeConstants.Info.PROJECT_COLS, select.getSymbols());
             if (!singleMapping) {
                 GroupsUsedByElementsVisitor.getGroups(select, groups);
@@ -252,6 +260,11 @@
         } else if(type == NodeConstants.Types.SORT) { 
         	OrderBy orderBy = (OrderBy)node.getProperty(NodeConstants.Info.SORT_ORDER);
             ExpressionMappingVisitor.mapExpressions(orderBy, symbolMap);
+            if (rewrite) {
+            	for (OrderByItem item : orderBy.getOrderByItems()) {
+            		rewriteSingleElementSymbol(metadata, item.getSymbol());
+            	}
+            }
             if (!singleMapping) {
                 GroupsUsedByElementsVisitor.getGroups(orderBy, groups);
             }
@@ -269,6 +282,25 @@
             convertAccessPatterns(symbolMap, node);
         }
     }
+
+	private static void rewriteSingleElementSymbol(
+			QueryMetadataInterface metadata, SingleElementSymbol ses) throws QueryPlannerException {
+		try {
+			if (ses instanceof AliasSymbol) {
+				ses = ((AliasSymbol)ses).getSymbol();
+			} 
+			if (ses instanceof ExpressionSymbol) {
+				ExpressionSymbol es = (ExpressionSymbol)ses;
+				if (es.getExpression() != null) {
+					es.setExpression(QueryRewriter.rewriteExpression(es.getExpression(), null, null, metadata));
+				}
+			}
+		} catch(TeiidProcessingException e) {
+		    throw new QueryPlannerException(e, QueryPlugin.Util.getString("ERR.015.004.0023", ses)); //$NON-NLS-1$
+		} catch (TeiidComponentException e) {
+			throw new QueryPlannerException(e, QueryPlugin.Util.getString("ERR.015.004.0023", ses)); //$NON-NLS-1$
+		}
+	}
     
     private static Expression convertExpression(Expression expression, Map symbolMap) {
         
@@ -303,7 +335,7 @@
         } catch(TeiidProcessingException e) {
             throw new QueryPlannerException(e, QueryPlugin.Util.getString("ERR.015.004.0023", criteria)); //$NON-NLS-1$
         } catch (TeiidComponentException e) {
-        	throw new TeiidRuntimeException(e);
+        	throw new QueryPlannerException(e, QueryPlugin.Util.getString("ERR.015.004.0023", criteria)); //$NON-NLS-1$
         }
     }
 

Modified: branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2011-07-13 16:38:23 UTC (rev 3309)
+++ branches/7.4.x/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2011-07-13 19:58:48 UTC (rev 3310)
@@ -52,6 +52,7 @@
 import org.teiid.core.TeiidProcessingException;
 import org.teiid.core.TeiidRuntimeException;
 import org.teiid.core.types.DataTypeManager;
+import org.teiid.core.types.Transform;
 import org.teiid.core.util.Assertion;
 import org.teiid.core.util.TimestampWithTimezone;
 import org.teiid.language.SQLConstants.NonReserved;
@@ -876,11 +877,11 @@
         try {
             PostOrderNavigator.doVisit(obj, visitor);
         } catch (TeiidRuntimeException err) {
-            if (err.getChild() instanceof TeiidComponentException) {
-                throw (TeiidComponentException)err.getChild();
+            if (err.getCause() instanceof TeiidComponentException) {
+                throw (TeiidComponentException)err.getCause();
             } 
-            if (err.getChild() instanceof TeiidProcessingException) {
-                throw (TeiidProcessingException)err.getChild();
+            if (err.getCause() instanceof TeiidProcessingException) {
+                throw (TeiidProcessingException)err.getCause();
             } 
             throw err;
         }
@@ -2514,17 +2515,44 @@
         }
         function.setArgs(newArgs);
 
-        if( FunctionLibrary.isConvert(function) &&
-            newArgs[1] instanceof Constant) {
-            
-            Class srcType = newArgs[0].getType();
-            String tgtTypeName = (String) ((Constant)newArgs[1]).getValue();
-            Class tgtType = DataTypeManager.getDataTypeClass(tgtTypeName);
+        if( FunctionLibrary.isConvert(function)) {
+            Class<?> srcType = newArgs[0].getType();
+            Class<?> tgtType = function.getType();
 
             if(srcType != null && tgtType != null && srcType.equals(tgtType)) {
-                return newArgs[0];
+                return newArgs[0]; //unnecessary conversion
             }
-
+            
+            if (!(newArgs[0] instanceof Function) || tgtType == DataTypeManager.DefaultDataClasses.OBJECT) {
+            	return function;
+            }
+        	Function nested = (Function) newArgs[0];
+        	if (!FunctionLibrary.isConvert(nested)) {
+        		return function;
+        	}
+    		Class<?> nestedType = nested.getArgs()[0].getType();
+    		
+            Transform t = DataTypeManager.getTransform(nestedType, nested.getType());
+            if (t.isExplicit()) {
+            	//explicit conversions are required
+            	return function;
+            }
+            if (DataTypeManager.getTransform(nestedType, tgtType) == null) {
+            	//no direct conversion exists
+            	return function;
+            }
+    		//can't remove a convert that would alter the lexical form
+    		if (tgtType == DataTypeManager.DefaultDataClasses.STRING &&
+    				(nestedType == DataTypeManager.DefaultDataClasses.BOOLEAN
+    				|| nestedType == DataTypeManager.DefaultDataClasses.DATE
+    				|| nestedType == DataTypeManager.DefaultDataClasses.TIME
+    				|| tgtType == DataTypeManager.DefaultDataClasses.BIG_DECIMAL
+    				|| tgtType == DataTypeManager.DefaultDataClasses.FLOAT
+    				|| (tgtType == DataTypeManager.DefaultDataClasses.DOUBLE && srcType != DataTypeManager.DefaultDataClasses.FLOAT))) {
+    			return function;
+    		}
+        	//nested implicit transform is not needed
+        	return rewriteExpressionDirect(ResolverUtil.getConversion(nested.getArgs()[0], DataTypeManager.getDataTypeName(nestedType), DataTypeManager.getDataTypeName(tgtType), false, funcLibrary));
         }
 
         //convert DECODESTRING function to CASE expression

Modified: branches/7.4.x/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- branches/7.4.x/engine/src/main/resources/org/teiid/query/i18n.properties	2011-07-13 16:38:23 UTC (rev 3309)
+++ branches/7.4.x/engine/src/main/resources/org/teiid/query/i18n.properties	2011-07-13 19:58:48 UTC (rev 3310)
@@ -232,7 +232,7 @@
 ERR.015.004.0010= Unknown group specified in OPTION MAKEDEP/MAKENOTDEP: {0}
 ERR.015.004.0012= Group has an access pattern which has not been met: group(s) {0}; access pattern(s) {1}
 ERR.015.004.0020= Error getting model for {0}
-ERR.015.004.0023= Error rewriting criteria: {0}
+ERR.015.004.0023= Error rewriting: {0}
 ERR.015.004.0024= Unable to create a query plan that sends a criteria to \"{0}\".  This connection factory requires criteria set to true indicating that a query against this model requires criteria.  
 ERR.015.004.0029= Could not resolve group symbol {0}
 ERR.015.004.0035= The criteria {0} has elements from the root staging table and the document nodes which is not allowed.

Modified: branches/7.4.x/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
===================================================================
--- branches/7.4.x/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java	2011-07-13 16:38:23 UTC (rev 3309)
+++ branches/7.4.x/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java	2011-07-13 19:58:48 UTC (rev 3310)
@@ -124,11 +124,11 @@
     }
     
     private Map<ElementSymbol, Integer> elements;
-    private List<List> tuples;
+    private List<List<? extends Object>> tuples;
     
     @Before public void setUp() {
     	elements = null;
-    	tuples = new ArrayList<List>();
+    	tuples = new ArrayList<List<? extends Object>>();
     }
 
     private Criteria helpTestRewriteCriteria(String original, Criteria expectedCrit, QueryMetadataInterface metadata) {
@@ -138,7 +138,7 @@
         // rewrite
         try { 
         	ArrayList<Boolean> booleanVals = new ArrayList<Boolean>(tuples.size());
-        	for (List<Object> tuple : tuples) {
+        	for (List<?> tuple : tuples) {
             	booleanVals.add(new Evaluator(elements, null, null).evaluate(origCrit, tuple));
 			}
             actual = QueryRewriter.rewriteCriteria(origCrit, null, null, metadata);
@@ -2448,5 +2448,16 @@
 		String sql = "parsedate_(pm1.g1.e1) = {d'2001-01-01'}";
         helpTestRewriteCriteria(sql, parseCriteria(sql, metadata), metadata);  		
 	} 
+	
+    @Test public void testRewriteNestedConvert() throws Exception {
+        helpTestRewriteExpression("cast(cast(pm1.g1.e3 as integer) as long)", "cast(pm1.g1.e3 as long)", RealMetadataFactory.example1Cached()); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+    
+    @Test public void testRewriteNestedConvert1() throws Exception {
+        helpTestRewriteExpression("cast(cast(pm1.g1.e3 as integer) as string)", "convert(convert(pm1.g1.e3, integer), string)", RealMetadataFactory.example1Cached()); //$NON-NLS-1$ //$NON-NLS-2$
+    }
 
+    @Test public void testRewriteNestedConvert2() throws Exception {
+        helpTestRewriteExpression("cast(cast(pm1.g1.e3 as string) as clob)", "convert(convert(pm1.g1.e3, string), clob)", RealMetadataFactory.example1Cached()); //$NON-NLS-1$ //$NON-NLS-2$
+    }
 }



More information about the teiid-commits mailing list