[teiid-commits] teiid SVN: r2786 - in trunk/engine/src: test/java/org/teiid/query/optimizer and 1 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Fri Dec 17 16:22:55 EST 2010


Author: shawkins
Date: 2010-12-17 16:22:54 -0500 (Fri, 17 Dec 2010)
New Revision: 2786

Modified:
   trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
   trunk/engine/src/test/java/org/teiid/query/optimizer/FakeFunctionMetadataSource.java
   trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
Log:
TEIID-1401 fixing parse/format rewrite logic

Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2010-12-17 17:48:17 UTC (rev 2785)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2010-12-17 21:22:54 UTC (rev 2786)
@@ -185,6 +185,11 @@
     	ALIASED_FUNCTIONS.put("chr", SourceSystemFunctions.CHAR); //$NON-NLS-1$
     }
     
+    private static final Set<String> PARSE_FORMAT_TYPES = new HashSet<String>(Arrays.asList(DataTypeManager.DefaultDataTypes.TIME, 
+    		DataTypeManager.DefaultDataTypes.DATE, DataTypeManager.DefaultDataTypes.TIMESTAMP, DataTypeManager.DefaultDataTypes.BIG_DECIMAL, 
+    		DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.INTEGER, DataTypeManager.DefaultDataTypes.LONG, 
+    		DataTypeManager.DefaultDataTypes.FLOAT, DataTypeManager.DefaultDataTypes.DOUBLE));
+    
     private QueryMetadataInterface metadata;
     private CommandContext context;
     private CreateUpdateProcedureCommand procCommand;
@@ -1779,9 +1784,15 @@
         String inverseFunction = null;
         if(funcName.startsWith("parse")) { //$NON-NLS-1$
             String type = funcName.substring(5);
+            if (!PARSE_FORMAT_TYPES.contains(type)) {
+                return crit;
+            }
             inverseFunction = "format" + type; //$NON-NLS-1$
         } else if(funcName.startsWith("format")) { //$NON-NLS-1$
             String type = funcName.substring(6);
+            if (!PARSE_FORMAT_TYPES.contains(type)) {
+                return crit;
+            }
             inverseFunction = "parse" + type; //$NON-NLS-1$
             isFormat = true;
         } else {

Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/FakeFunctionMetadataSource.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/FakeFunctionMetadataSource.java	2010-12-17 17:48:17 UTC (rev 2785)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/FakeFunctionMetadataSource.java	2010-12-17 21:22:54 UTC (rev 2786)
@@ -26,6 +26,8 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.teiid.core.types.DataTypeManager;
+import org.teiid.metadata.Datatype;
 import org.teiid.metadata.FunctionParameter;
 import org.teiid.metadata.FunctionMethod.PushDown;
 import org.teiid.query.function.FunctionMetadataSource;
@@ -34,8 +36,8 @@
 
 public class FakeFunctionMetadataSource implements FunctionMetadataSource {
 
-    public Collection getFunctionMethods() {
-        List methods = new ArrayList();
+    public Collection<org.teiid.metadata.FunctionMethod> getFunctionMethods() {
+        List<org.teiid.metadata.FunctionMethod> methods = new ArrayList<org.teiid.metadata.FunctionMethod>();
         methods.add(new FunctionMethod("xyz", "", "misc", PushDown.MUST_PUSHDOWN,  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
                                        FakeFunctionMetadataSource.class.getName(), "xyz", //$NON-NLS-1$
                                        new FunctionParameter[0],  
@@ -51,6 +53,10 @@
         FunctionMethod method2 = new FunctionMethod("misc.namespace.func", "", "", null, null, new FunctionParameter[] {p1}, result);  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
         method2.setPushdown(PushDown.MUST_PUSHDOWN);
         methods.add(method2);
+        
+        FunctionMethod method3 = new FunctionMethod("parsedate_", "", "", null, null, new FunctionParameter[] {p1}, new FunctionParameter("", DataTypeManager.DefaultDataTypes.DATE));  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+        method3.setPushdown(PushDown.MUST_PUSHDOWN);
+        methods.add(method3);
 
         return methods;
     }

Modified: trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java	2010-12-17 17:48:17 UTC (rev 2785)
+++ trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java	2010-12-17 21:22:54 UTC (rev 2786)
@@ -39,16 +39,19 @@
 import org.teiid.client.metadata.ParameterInfo;
 import org.teiid.common.buffer.BufferManagerFactory;
 import org.teiid.core.TeiidComponentException;
+import org.teiid.core.TeiidException;
 import org.teiid.core.TeiidProcessingException;
-import org.teiid.core.TeiidException;
 import org.teiid.core.TeiidRuntimeException;
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.util.TimestampWithTimezone;
+import org.teiid.query.function.FunctionLibrary;
+import org.teiid.query.function.FunctionTree;
+import org.teiid.query.function.UDFSource;
 import org.teiid.query.metadata.QueryMetadataInterface;
+import org.teiid.query.optimizer.FakeFunctionMetadataSource;
 import org.teiid.query.parser.QueryParser;
 import org.teiid.query.resolver.QueryResolver;
 import org.teiid.query.resolver.util.ResolverVisitor;
-import org.teiid.query.rewriter.QueryRewriter;
 import org.teiid.query.sql.lang.Command;
 import org.teiid.query.sql.lang.CompareCriteria;
 import org.teiid.query.sql.lang.CompoundCriteria;
@@ -2359,5 +2362,12 @@
     @Test public void testRewritePredicateOptimization7() throws Exception {
     	helpTestRewriteCriteria("pm1.g1.e2 > 5 and pm1.g1.e2 < 2", "1 = 0");
     }
+    
+	@Test public void testUDFParse() throws Exception {     
+        FunctionLibrary funcLibrary = new FunctionLibrary(FakeMetadataFactory.SFM.getSystemFunctions(), new FunctionTree(new UDFSource(new FakeFunctionMetadataSource().getFunctionMethods())));
+        FakeMetadataFacade metadata = new FakeMetadataFacade(FakeMetadataFactory.example1Cached().getStore(), funcLibrary);
+		String sql = "parsedate_(pm1.g1.e1) = {d'2001-01-01'}";
+        helpTestRewriteCriteria(sql, parseCriteria(sql, metadata), metadata);  		
+	} 
 
 }



More information about the teiid-commits mailing list