[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