[teiid-commits] teiid SVN: r4295 - in trunk/engine/src: main/resources/org/teiid/query and 1 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Thu Aug 2 19:10:41 EDT 2012


Author: rareddy
Date: 2012-08-02 19:10:40 -0400 (Thu, 02 Aug 2012)
New Revision: 4295

Modified:
   trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
   trunk/engine/src/main/resources/org/teiid/query/i18n.properties
   trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java
Log:
TEIID-2083 - Adding the parser code to recognize the UDT option on the column. If this option is found then the datatype will be replaced with supported user defined designer's index type. Also the length, and precision and scale captured on the column

Modified: trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2012-08-02 20:42:06 UTC (rev 4294)
+++ trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2012-08-02 23:10:40 UTC (rev 4295)
@@ -34,20 +34,13 @@
 import org.teiid.core.util.PropertiesUtils;
 import org.teiid.core.util.StringUtil;
 import org.teiid.language.SQLConstants.Reserved;
-import org.teiid.metadata.AbstractMetadataRecord;
-import org.teiid.metadata.BaseColumn;
-import org.teiid.metadata.Column;
-import org.teiid.metadata.FunctionMethod;
-import org.teiid.metadata.FunctionParameter;
-import org.teiid.metadata.MetadataFactory;
-import org.teiid.metadata.Procedure;
-import org.teiid.metadata.ProcedureParameter;
-import org.teiid.metadata.Table;
+import org.teiid.metadata.*;
 import org.teiid.metadata.Column.SearchType;
 import org.teiid.metadata.ProcedureParameter.Type;
 import org.teiid.query.QueryPlugin;
 import org.teiid.query.function.FunctionMethods;
 import org.teiid.query.metadata.DDLConstants;
+import org.teiid.query.metadata.SystemMetadata;
 import org.teiid.query.sql.lang.*;
 import org.teiid.query.sql.lang.ExistsCriteria.SubqueryHint;
 import org.teiid.query.sql.proc.Block;
@@ -57,6 +50,8 @@
 
 public class SQLParserUtil {
 	
+    static Pattern udtPattern = Pattern.compile("(\\w+)\\s*\\(\\s*(\\d+),\\s*(\\d+),\\s*(\\d+)\\)"); //$NON-NLS-1$
+	
 	public static final boolean DECIMAL_AS_DOUBLE = PropertiesUtils.getBooleanProperty(System.getProperties(), "org.teiid.decimalAsDouble", false); //$NON-NLS-1$
 	
 	String matchesAny(String arg, String ... expected) {
@@ -357,7 +352,7 @@
     	return new Block(stmt);
     }
     
-    void setColumnOptions(BaseColumn c){
+    void setColumnOptions(BaseColumn c)  throws ParseException {
     	Map<String, String> props = c.getProperties();
 		setCommonProperties(c, props);
 		
@@ -371,7 +366,7 @@
     	}
     }
 
-	private void setColumnOptions(Column c, Map<String, String> props) {
+	private void setColumnOptions(Column c, Map<String, String> props) throws ParseException {
 		String v = props.remove(DDLConstants.CASE_SENSITIVE); 
         if (v != null) {
         	c.setCaseSensitive(isTrue(v));
@@ -436,6 +431,21 @@
     	if (v != null) {
     		c.setDistinctValues(Integer.parseInt(v));
     	}
+
+    	v = props.remove(DDLConstants.UDT); 
+    	if (v != null) {
+    		Matcher matcher = udtPattern.matcher(v);
+    		Map<String, Datatype> datatypes = SystemMetadata.getInstance().getSystemStore().getDatatypes();
+    		if (matcher.matches() && datatypes.get(matcher.group(1)) != null) {
+    			c.setDatatype(datatypes.get(matcher.group(1)));
+    			c.setLength(Integer.parseInt(matcher.group(2)));
+    			c.setPrecision(Integer.parseInt(matcher.group(3)));
+    			c.setScale(Integer.parseInt(matcher.group(4)));
+    		}
+    		else {
+    			throw new ParseException(QueryPlugin.Util.getString("udt_format_wrong", c.getName())); //$NON-NLS-1$
+    		}
+    	}
     }
 
 	void setCommonProperties(AbstractMetadataRecord c, Map<String, String> props) {

Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2012-08-02 20:42:06 UTC (rev 4294)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2012-08-02 23:10:40 UTC (rev 4295)
@@ -1026,4 +1026,5 @@
 TEIID31107=Procedure {0} can only have 1 RESULT/return value
 
 SQLParser.proc_type_conflict=Result type {1} conflicts with return type {2} for procedure {0}
-SQLParser.param_out=Procedure {0} RESULT param {1} must be of type OUT.
\ No newline at end of file
+SQLParser.param_out=Procedure {0} RESULT param {1} must be of type OUT.
+udt_format_wrong=UDT option mentioned on column "{0}" is wrong. It must be in the form UDT=name(length,precision,scale). Otherwise UDT data type specified is not a known data type to Teiid.
\ No newline at end of file

Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java	2012-08-02 20:42:06 UTC (rev 4294)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java	2012-08-02 23:10:40 UTC (rev 4295)
@@ -129,6 +129,22 @@
 	}
 	
 	@Test
+	public void testUDT() throws Exception {
+		String ddl = "CREATE FOREIGN TABLE G1( e1 integer, e2 varchar OPTIONS (UDT 'NMTOKENS(12,13,14)'))";
+
+		Schema s = helpParse(ddl, "model").getSchema();
+		Map<String, Table> tableMap = s.getTables();	
+		
+		assertTrue("Table not found", tableMap.containsKey("G1"));
+		Table table = tableMap.get("G1");
+		
+		assertEquals("NMTOKENS", table.getColumns().get(1).getDatatype().getName());
+		assertEquals(12, table.getColumns().get(1).getLength());
+		assertEquals(13, table.getColumns().get(1).getPrecision());
+		assertEquals(14, table.getColumns().get(1).getScale());		
+	}	
+	
+	@Test
 	public void testMultiKeyPK() throws Exception {
 		String ddl = "CREATE FOREIGN TABLE G1( e1 integer, e2 varchar, e3 date CONSTRAINT PRIMARY KEY (e1, e2))";
 



More information about the teiid-commits mailing list