[teiid-commits] teiid SVN: r1146 - in trunk/engine/src: test/java/com/metamatrix/query/optimizer and 4 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Fri Jul 17 10:44:22 EDT 2009


Author: shawkins
Date: 2009-07-17 10:44:22 -0400 (Fri, 17 Jul 2009)
New Revision: 1146

Modified:
   trunk/engine/src/main/java/com/metamatrix/query/resolver/util/ResolverUtil.java
   trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptimizer.java
   trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
   trunk/engine/src/test/java/com/metamatrix/query/resolver/TestFunctionResolving.java
   trunk/engine/src/test/java/com/metamatrix/query/rewriter/TestQueryRewriter.java
   trunk/engine/src/test/java/com/metamatrix/query/validator/TestValidator.java
Log:
TEIID-727 adding a conversion to ensure that the lookup search value matches the type of the key value.

Modified: trunk/engine/src/main/java/com/metamatrix/query/resolver/util/ResolverUtil.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/resolver/util/ResolverUtil.java	2009-07-17 14:43:11 UTC (rev 1145)
+++ trunk/engine/src/main/java/com/metamatrix/query/resolver/util/ResolverUtil.java	2009-07-17 14:44:22 UTC (rev 1146)
@@ -825,41 +825,42 @@
 		Expression[] args = lookup.getArgs();
 		ResolvedLookup result = new ResolvedLookup();
 	    // Special code to handle setting return type of the lookup function to match the type of the return element
-	    if( args[0] instanceof Constant && args[1] instanceof Constant && args[2] instanceof Constant) {
-	        // If code table name in lookup function refers to virtual group, throws exception
-			GroupSymbol groupSym = new GroupSymbol((String) ((Constant)args[0]).getValue());
-			try {
-				groupSym.setMetadataID(metadata.getGroupID((String) ((Constant)args[0]).getValue()));
-				if (groupSym.getMetadataID() instanceof TempMetadataID) {
-					throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0065, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0065, ((Constant)args[0]).getValue()));
-				}
-			} catch(QueryMetadataException e) {
-				throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0062, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0062, ((Constant)args[0]).getValue()));
+	    if( !(args[0] instanceof Constant) || !(args[1] instanceof Constant) || !(args[2] instanceof Constant)) {
+		    throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0063, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0063));
+	    }
+        // If code table name in lookup function refers to temp group throw exception
+		GroupSymbol groupSym = new GroupSymbol((String) ((Constant)args[0]).getValue());
+		try {
+			groupSym.setMetadataID(metadata.getGroupID((String) ((Constant)args[0]).getValue()));
+			if (groupSym.getMetadataID() instanceof TempMetadataID) {
+				throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0065, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0065, ((Constant)args[0]).getValue()));
 			}
-			result.setGroup(groupSym);
-			
-			List<GroupSymbol> groups = Arrays.asList(groupSym);
-			
-			String returnElementName = (String) ((Constant)args[0]).getValue() + "." + (String) ((Constant)args[1]).getValue(); //$NON-NLS-1$
-			ElementSymbol returnElement = new ElementSymbol(returnElementName);
-	        try {
-	            ResolverVisitor.resolveLanguageObject(returnElement, groups, metadata);
-	        } catch(QueryMetadataException e) {
-	            throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0062, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0062, returnElementName));
-	        }
-			result.setReturnElement(returnElement);
-	        
-	        String keyElementName = (String) ((Constant)args[0]).getValue() + "." + (String) ((Constant)args[2]).getValue(); //$NON-NLS-1$
-	        ElementSymbol keyElement = new ElementSymbol(keyElementName);
-	        try {
-	            ResolverVisitor.resolveLanguageObject(keyElement, groups, metadata);
-	        } catch(QueryMetadataException e) {
-	            throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0062, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0062, keyElementName));
-	        }
-			result.setKeyElement(keyElement);
-			return result;
-	    } 
-	    throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0063, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0063));
+		} catch(QueryMetadataException e) {
+			throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0062, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0062, ((Constant)args[0]).getValue()));
+		}
+		result.setGroup(groupSym);
+		
+		List<GroupSymbol> groups = Arrays.asList(groupSym);
+		
+		String returnElementName = (String) ((Constant)args[0]).getValue() + "." + (String) ((Constant)args[1]).getValue(); //$NON-NLS-1$
+		ElementSymbol returnElement = new ElementSymbol(returnElementName);
+        try {
+            ResolverVisitor.resolveLanguageObject(returnElement, groups, metadata);
+        } catch(QueryMetadataException e) {
+            throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0062, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0062, returnElementName));
+        }
+		result.setReturnElement(returnElement);
+        
+        String keyElementName = (String) ((Constant)args[0]).getValue() + "." + (String) ((Constant)args[2]).getValue(); //$NON-NLS-1$
+        ElementSymbol keyElement = new ElementSymbol(keyElementName);
+        try {
+            ResolverVisitor.resolveLanguageObject(keyElement, groups, metadata);
+        } catch(QueryMetadataException e) {
+            throw new QueryResolverException(ErrorMessageKeys.RESOLVER_0062, QueryPlugin.Util.getString(ErrorMessageKeys.RESOLVER_0062, keyElementName));
+        }
+		result.setKeyElement(keyElement);
+		args[3] = convertExpression(args[3], DataTypeManager.getDataTypeName(keyElement.getType()));
+		return result;
 	}
 
 	private static QueryResolverException handleUnresolvedGroup(GroupSymbol symbol, String description) {

Modified: trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptimizer.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptimizer.java	2009-07-17 14:43:11 UTC (rev 1145)
+++ trunk/engine/src/test/java/com/metamatrix/query/optimizer/TestOptimizer.java	2009-07-17 14:44:22 UTC (rev 1146)
@@ -3557,21 +3557,21 @@
         });                                    
     }
     
-    /** defect 11630 - note that the lookup function is pushed down, it will actually be evaluated before being sent to the connector */
+    /** defect 11630 - note that the lookup function is not pushed down, it will actually be evaluated before being sent to the connector */
     public void testLookupFunction() {
 
-        ProcessorPlan plan = helpPlan("SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1','e1', 'e2', 'value') IS NULL", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
-            new String[] { "SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1', 'e1', 'e2', 'value') IS NULL"  }); //$NON-NLS-1$
+        ProcessorPlan plan = helpPlan("SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1','e1', 'e2', 1) IS NULL", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
+            new String[] { "SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1', 'e1', 'e2', 1) IS NULL"  }); //$NON-NLS-1$
 
         checkNodeTypes(plan, FULL_PUSHDOWN); 
 
     }
     
     /** case 5213 - note here that the lookup cannot be pushed down since it is dependent upon an element symbol*/
-    public void testLookupFunction2() {
+    public void testLookupFunction2() throws Exception {
 
-        ProcessorPlan plan = helpPlan("SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1','e1', 'e2', e1) IS NULL", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
-            new String[] { "SELECT e1 FROM pm1.g2"  }); //$NON-NLS-1$
+        ProcessorPlan plan = helpPlan("SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1','e1', 'e2', e2) IS NULL", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
+            new String[] { "SELECT g_0.e2, g_0.e1 FROM pm1.g2 AS g_0"  }, ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
 
         checkNodeTypes(plan, new int[] {
             1,      // Access
@@ -3594,7 +3594,7 @@
     
     /** defect 21965 */
     public void testLookupFunctionInSelect() {
-        ProcessorPlan plan = helpPlan("SELECT e1, LOOKUP('pm1.g1','e1', 'e2', 'value') FROM pm1.g2", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
+        ProcessorPlan plan = helpPlan("SELECT e1, LOOKUP('pm1.g1','e1', 'e2', 1) FROM pm1.g2", FakeMetadataFactory.example1Cached(), //$NON-NLS-1$
             new String[] { "SELECT e1 FROM pm1.g2"  }); //$NON-NLS-1$
 
         checkNodeTypes(plan, new int[] {

Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java	2009-07-17 14:43:11 UTC (rev 1145)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java	2009-07-17 14:44:22 UTC (rev 1146)
@@ -7029,7 +7029,7 @@
         capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
 
         // Plan query
-        String sql = "SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1','e1', 'e2', 'value') = e1";//$NON-NLS-1$
+        String sql = "SELECT e1 FROM pm1.g2 WHERE LOOKUP('pm1.g1','e1', 'e2', 1) = e1";//$NON-NLS-1$
         Command command = TestProcessor.helpParse(sql);   
         ProcessorPlan plan = helpGetPlan(command, FakeMetadataFactory.example1Cached(), capFinder);
         
@@ -7041,7 +7041,7 @@
         FakeDataManager dataManager = new FakeDataManager();
         sampleData1(dataManager);
         Map valueMap = new HashMap();
-        valueMap.put("value", "b"); //$NON-NLS-1$ //$NON-NLS-2$
+        valueMap.put(1, "b"); //$NON-NLS-1$ //$NON-NLS-2$
         dataManager.defineCodeTable("pm1.g1", "e2", "e1", valueMap); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
         dataManager.setThrowBlocked(true);
         

Modified: trunk/engine/src/test/java/com/metamatrix/query/resolver/TestFunctionResolving.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/resolver/TestFunctionResolving.java	2009-07-17 14:43:11 UTC (rev 1145)
+++ trunk/engine/src/test/java/com/metamatrix/query/resolver/TestFunctionResolving.java	2009-07-17 14:44:22 UTC (rev 1146)
@@ -121,10 +121,26 @@
 
 	private Function helpResolveFunction(String sql) throws QueryParserException,
 			QueryResolverException, MetaMatrixComponentException {
-		Function func = (Function)QueryParser.getQueryParser().parseExpression(sql);
-		ResolverVisitor.resolveLanguageObject(func, FakeMetadataFactory.example1Cached());
+		Function func = getFunction(sql);
     	assertEquals(DataTypeManager.DefaultDataClasses.STRING, func.getType());
     	return func;
 	}
+
+	private Function getFunction(String sql) throws QueryParserException,
+			MetaMatrixComponentException, QueryResolverException {
+		Function func = (Function)QueryParser.getQueryParser().parseExpression(sql);
+		ResolverVisitor.resolveLanguageObject(func, FakeMetadataFactory.example1Cached());
+		return func;
+	}
 	
+	/**
+	 * e1 is of type string, so 1 should be converted to string
+	 * @throws Exception
+	 */
+    @Test public void testLookupTypeConversion() throws Exception {
+    	String sql = "lookup('pm1.g1', 'e2', 'e1', 1)"; //$NON-NLS-1$
+    	Function f = getFunction(sql);
+    	assertEquals(DataTypeManager.DefaultDataClasses.STRING, f.getArg(3).getType());
+    }
+	
 }

Modified: trunk/engine/src/test/java/com/metamatrix/query/rewriter/TestQueryRewriter.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/rewriter/TestQueryRewriter.java	2009-07-17 14:43:11 UTC (rev 1145)
+++ trunk/engine/src/test/java/com/metamatrix/query/rewriter/TestQueryRewriter.java	2009-07-17 14:44:22 UTC (rev 1146)
@@ -1458,20 +1458,20 @@
     
     //base test.  no change is expected
     public void testRewriteLookupFunction1() {
-        String criteria = "lookup('pm1.g1','e1', 'e2', 'value') = 'ab'"; //$NON-NLS-1$
+        String criteria = "lookup('pm1.g1','e1', 'e2', 1) = 'ab'"; //$NON-NLS-1$
         CompareCriteria expected = (CompareCriteria)parseCriteria(criteria, FakeMetadataFactory.example1Cached()); 
         helpTestRewriteCriteria(criteria, expected, FakeMetadataFactory.example1Cached());
     }
     
     public void testRewriteLookupFunction1b() {
-        helpTestRewriteCriteria("lookup('pm1.g1','e1', 'e2', pm1.g1.e1) = 'ab'", "lookup('pm1.g1','e1', 'e2', pm1.g1.e1) = 'ab'"); //$NON-NLS-1$ //$NON-NLS-2$
+        helpTestRewriteCriteria("lookup('pm1.g1','e1', 'e2', pm1.g1.e2) = 'ab'", "lookup('pm1.g1','e1', 'e2', pm1.g1.e2) = 'ab'"); //$NON-NLS-1$ //$NON-NLS-2$
     }
 
     /** defect 11630 1 should still get rewritten as '1'*/
     public void testRewriteLookupFunctionCompoundCriteria() {
-        String criteria = "LOOKUP('pm1.g1','e1', 'e2', 'value') IS NULL AND pm1.g1.e1='1'"; //$NON-NLS-1$
+        String criteria = "LOOKUP('pm1.g1','e1', 'e2', 1) IS NULL AND pm1.g1.e1='1'"; //$NON-NLS-1$
         CompoundCriteria expected = (CompoundCriteria)parseCriteria(criteria, FakeMetadataFactory.example1Cached()); 
-        helpTestRewriteCriteria("LOOKUP('pm1.g1','e1', 'e2', 'value') IS NULL AND pm1.g1.e1=1", expected, FakeMetadataFactory.example1Cached()); //$NON-NLS-1$ 
+        helpTestRewriteCriteria("LOOKUP('pm1.g1','e1', 'e2', 1) IS NULL AND pm1.g1.e1=1", expected, FakeMetadataFactory.example1Cached()); //$NON-NLS-1$ 
     }
 
     public void testSelectWithNoFrom() {
@@ -1680,9 +1680,9 @@
     }
     
     public void testRewriteSearchedCaseExpr4() {
-        String criteria = "lookup('pm1.g1', 'e2', 'e1', null) = 0"; //$NON-NLS-1$
+        String criteria = "lookup('pm1.g1', 'e2', 'e1', '2') = 0"; //$NON-NLS-1$
         CompareCriteria expected = (CompareCriteria)parseCriteria(criteria, FakeMetadataFactory.example1Cached()); 
-        helpTestRewriteCriteria("lookup('pm1.g1', 'e2', 'e1', case 0 when 1 then pm1.g1.e1 end) = 0", expected, FakeMetadataFactory.example1Cached()); //$NON-NLS-1$
+        helpTestRewriteCriteria("lookup('pm1.g1', 'e2', 'e1', case 0 when 1 then pm1.g1.e1 else 2 end) = 0", expected, FakeMetadataFactory.example1Cached()); //$NON-NLS-1$
     }
 
     // First WHEN always false, so remove it

Modified: trunk/engine/src/test/java/com/metamatrix/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/validator/TestValidator.java	2009-07-17 14:43:11 UTC (rev 1145)
+++ trunk/engine/src/test/java/com/metamatrix/query/validator/TestValidator.java	2009-07-17 14:44:22 UTC (rev 1146)
@@ -1703,7 +1703,7 @@
     
     public void testLookupKeyElementComparable() throws Exception {
     	QueryMetadataInterface metadata = exampleMetadata2();
-        String sql = "SELECT lookup('test.group', 'e2', 'e3', e2) AS x FROM test.group"; //$NON-NLS-1$
+        String sql = "SELECT lookup('test.group', 'e2', 'e3', convert(e2, blob)) AS x FROM test.group"; //$NON-NLS-1$
         Command command = QueryParser.getQueryParser().parseCommand(sql);
     	QueryResolver.resolveCommand(command, metadata); 
         



More information about the teiid-commits mailing list