[teiid-commits] teiid SVN: r4508 - in trunk: api/src/main/java/org/teiid/metadata and 8 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Wed Oct 3 09:10:22 EDT 2012


Author: shawkins
Date: 2012-10-03 09:10:21 -0400 (Wed, 03 Oct 2012)
New Revision: 4508

Modified:
   trunk/api/src/main/java/org/teiid/connector/DataPlugin.java
   trunk/api/src/main/java/org/teiid/metadata/MetadataFactory.java
   trunk/api/src/main/resources/org/teiid/connector/i18n.properties
   trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
   trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/Constants.java
   trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java
   trunk/engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java
   trunk/engine/src/main/java/org/teiid/query/metadata/SystemMetadata.java
   trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
   trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
   trunk/engine/src/test/java/org/teiid/query/metadata/TestDDLStringVisitor.java
Log:
TEIID-2235 refining namespace support

Modified: trunk/api/src/main/java/org/teiid/connector/DataPlugin.java
===================================================================
--- trunk/api/src/main/java/org/teiid/connector/DataPlugin.java	2012-10-03 02:25:48 UTC (rev 4507)
+++ trunk/api/src/main/java/org/teiid/connector/DataPlugin.java	2012-10-03 13:10:21 UTC (rev 4508)
@@ -46,6 +46,8 @@
 		TEIID60013,
 		TEIID60014,
 		TEIID60015, 
-		TEIID60016
+		TEIID60016, 
+		TEIID60017, 
+		TEIID60018
 	}
 }

Modified: trunk/api/src/main/java/org/teiid/metadata/MetadataFactory.java
===================================================================
--- trunk/api/src/main/java/org/teiid/metadata/MetadataFactory.java	2012-10-03 02:25:48 UTC (rev 4507)
+++ trunk/api/src/main/java/org/teiid/metadata/MetadataFactory.java	2012-10-03 13:10:21 UTC (rev 4508)
@@ -27,6 +27,7 @@
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -36,9 +37,9 @@
 import org.teiid.CommandContext;
 import org.teiid.connector.DataPlugin;
 import org.teiid.core.types.DataTypeManager;
+import org.teiid.core.util.StringUtil;
 import org.teiid.metadata.FunctionMethod.PushDown;
 import org.teiid.metadata.ProcedureParameter.Type;
-import org.teiid.translator.TranslatorException;
 import org.teiid.translator.TypeFacility;
 
 
@@ -49,6 +50,10 @@
  * TODO: add support for unique constraints
  */
 public class MetadataFactory implements Serializable {
+	private static final String TEIID_RESERVED = "teiid_"; //$NON-NLS-1$
+	private static final String TEIID_SF = "teiid_sf"; //$NON-NLS-1$
+	private static final String TEIID_RELATIONAL = "teiid_rel"; //$NON-NLS-1$
+
 	private static final long serialVersionUID = 8590341087771685630L;
 	
 	private String vdbName;
@@ -56,7 +61,7 @@
 	private Map<String, Datatype> dataTypes;
 	private Map<String, Datatype> builtinDataTypes;
 	private boolean autoCorrectColumnNames = true;
-	private Map<String, String> namespaces = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
+	private Map<String, String> namespaces;
 	private String rawMetadata;
 	private Properties importProperties;
 	private Schema schema = new Schema();
@@ -64,6 +69,16 @@
 	private int count;
 	private transient Parser parser;
 	
+	public static final String SF_URI = "{http://www.teiid.org/translator/salesforce/2012}"; //$NON-NLS-1$
+	
+	public static final Map<String, String> BUILTIN_NAMESPACES;
+	static {
+		Map<String, String> map = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
+		map.put(TEIID_RELATIONAL, AbstractMetadataRecord.RELATIONAL_URI.substring(1, AbstractMetadataRecord.RELATIONAL_URI.length()-1));
+		map.put(TEIID_SF, SF_URI.substring(1, SF_URI.length()-1));
+		BUILTIN_NAMESPACES = Collections.unmodifiableMap(map);
+	}
+	
 	public MetadataFactory(String vdbName, int vdbVersion, String schemaName, Map<String, Datatype> runtimeTypes, Properties importProperties, String rawMetadata) {
 		this.vdbName = vdbName;
 		this.vdbVersion = vdbVersion;
@@ -124,9 +139,9 @@
 	 * Add a table with the given name to the model.  
 	 * @param name
 	 * @return
-	 * @throws TranslatorException 
+	 * @throws MetadataException 
 	 */
-	public Table addTable(String name) throws TranslatorException {
+	public Table addTable(String name) {
 		Table table = new Table();
 		table.setTableType(Table.Type.Table);
 		table.setName(name);
@@ -141,14 +156,14 @@
 	 * @param type should be one of {@link TypeFacility.RUNTIME_NAMES}
 	 * @param table
 	 * @return
-	 * @throws TranslatorException
+	 * @throws MetadataException
 	 */
-	public Column addColumn(String name, String type, ColumnSet<?> table) throws TranslatorException {
+	public Column addColumn(String name, String type, ColumnSet<?> table) {
 		if (autoCorrectColumnNames) {
 			name.replace(AbstractMetadataRecord.NAME_DELIM_CHAR, '_');
 		} else if (name.indexOf(AbstractMetadataRecord.NAME_DELIM_CHAR) != -1) {
 			//TODO: for now this is not used
-			 throw new TranslatorException(DataPlugin.Event.TEIID60008, DataPlugin.Util.gs(DataPlugin.Event.TEIID60008, name));
+			throw new MetadataException(DataPlugin.Event.TEIID60008, DataPlugin.Util.gs(DataPlugin.Event.TEIID60008, name));
 		}
 		if (table.getColumnByName(name) != null) {
 			throw new DuplicateRecordException(DataPlugin.Event.TEIID60016, DataPlugin.Util.gs(DataPlugin.Event.TEIID60016, table.getFullName() + AbstractMetadataRecord.NAME_DELIM_CHAR + name));
@@ -164,10 +179,10 @@
 	}
 
 	private Datatype setColumnType(String type,
-			BaseColumn column) throws TranslatorException {
+			BaseColumn column) {
 		Datatype datatype = dataTypes.get(type);
 		if (datatype == null) {
-			 throw new TranslatorException(DataPlugin.Event.TEIID60009, DataPlugin.Util.gs(DataPlugin.Event.TEIID60009, type));
+			 throw new MetadataException(DataPlugin.Event.TEIID60009, DataPlugin.Util.gs(DataPlugin.Event.TEIID60009, type));
 		}
 		column.setDatatype(datatype, true);
 		return datatype;
@@ -179,9 +194,9 @@
 	 * @param columnNames
 	 * @param table
 	 * @return
-	 * @throws TranslatorException
+	 * @throws MetadataException
 	 */
-	public KeyRecord addPrimaryKey(String name, List<String> columnNames, Table table) throws TranslatorException {
+	public KeyRecord addPrimaryKey(String name, List<String> columnNames, Table table) {
 		KeyRecord primaryKey = new KeyRecord(KeyRecord.Type.Primary);
 		primaryKey.setParent(table);
 		primaryKey.setColumns(new ArrayList<Column>(columnNames.size()));
@@ -198,9 +213,9 @@
 	 * @param columnNames
 	 * @param table
 	 * @return
-	 * @throws TranslatorException
+	 * @throws MetadataException
 	 */
-	public KeyRecord addAccessPattern(String name, List<String> columnNames, Table table) throws TranslatorException {
+	public KeyRecord addAccessPattern(String name, List<String> columnNames, Table table) {
 		KeyRecord ap = new KeyRecord(KeyRecord.Type.AccessPattern);
 		ap.setParent(table);
 		ap.setColumns(new ArrayList<Column>(columnNames.size()));
@@ -218,9 +233,9 @@
 	 * @param columnNames
 	 * @param table
 	 * @return
-	 * @throws TranslatorException
+	 * @throws MetadataException
 	 */
-	public KeyRecord addIndex(String name, boolean nonUnique, List<String> columnNames, Table table) throws TranslatorException {
+	public KeyRecord addIndex(String name, boolean nonUnique, List<String> columnNames, Table table) {
 		KeyRecord index = new KeyRecord(nonUnique?KeyRecord.Type.Index:KeyRecord.Type.Unique);
 		index.setParent(table);
 		index.setColumns(new ArrayList<Column>(columnNames.size()));
@@ -243,9 +258,9 @@
 	 * @param nonColumnExpressions a Boolean list indicating when expressions are non-column expressions
 	 * @param table
 	 * @return
-	 * @throws TranslatorException
+	 * @throws MetadataException
 	 */
-	public KeyRecord addFunctionBasedIndex(String name, List<String> expressions, List<Boolean> nonColumnExpressions, Table table) throws TranslatorException {
+	public KeyRecord addFunctionBasedIndex(String name, List<String> expressions, List<Boolean> nonColumnExpressions, Table table) {
 		KeyRecord index = new KeyRecord(KeyRecord.Type.Index);
 		index.setParent(table);
 		index.setColumns(new ArrayList<Column>(expressions.size()));
@@ -291,9 +306,9 @@
 	 * @param referenceTable - schema qualified reference table name
 	 * @param table
 	 * @return
-	 * @throws TranslatorException
+	 * @throws MetadataException
 	 */
-	public ForeignKey addForiegnKey(String name, List<String> columnNames, String referenceTable, Table table) throws TranslatorException {
+	public ForeignKey addForiegnKey(String name, List<String> columnNames, String referenceTable, Table table) {
 		return addForiegnKey(name, columnNames, null, referenceTable, table);
 	}
 
@@ -307,9 +322,9 @@
 	 * @param table
 	 * @param addUniqueConstraint - if true, if the referenced table columns do not match with either PK, or FK then a UNIQUE index on reference table is created.
 	 * @return
-	 * @throws TranslatorException
+	 * @throws MetadataException
 	 */	
-	public ForeignKey addForiegnKey(String name, List<String> columnNames, List<String> referencedColumnNames, String referenceTable, Table table) throws TranslatorException {
+	public ForeignKey addForiegnKey(String name, List<String> columnNames, List<String> referencedColumnNames, String referenceTable, Table table) {
 		ForeignKey foreignKey = new ForeignKey();
 		foreignKey.setParent(table);
 		foreignKey.setColumns(new ArrayList<Column>(columnNames.size()));
@@ -326,9 +341,9 @@
 	 * Add a procedure with the given name to the model.  
 	 * @param name
 	 * @return
-	 * @throws TranslatorException 
+	 * @throws MetadataException 
 	 */
-	public Procedure addProcedure(String name) throws TranslatorException {
+	public Procedure addProcedure(String name) {
 		Procedure procedure = new Procedure();
 		procedure.setName(name);
 		setUUID(procedure);
@@ -344,9 +359,9 @@
 	 * @param parameterType should be one of {@link ProcedureParameter.Type}
 	 * @param procedure
 	 * @return
-	 * @throws TranslatorException 
+	 * @throws MetadataException 
 	 */
-	public ProcedureParameter addProcedureParameter(String name, String type, ProcedureParameter.Type parameterType, Procedure procedure) throws TranslatorException {
+	public ProcedureParameter addProcedureParameter(String name, String type, ProcedureParameter.Type parameterType, Procedure procedure) {
 		ProcedureParameter param = new ProcedureParameter();
 		param.setName(name);
 		setUUID(param);
@@ -371,9 +386,9 @@
 	 * @param type should be one of {@link TypeFacility.RUNTIME_NAMES}
 	 * @param procedure
 	 * @return
-	 * @throws TranslatorException 
+	 * @throws MetadataException 
 	 */
-	public Column addProcedureResultSetColumn(String name, String type, Procedure procedure) throws TranslatorException {
+	public Column addProcedureResultSetColumn(String name, String type, Procedure procedure) {
 		if (procedure.getResultSet() == null) {
 			ColumnSet<Procedure> resultSet = new ColumnSet<Procedure>();
 			resultSet.setParent(procedure);
@@ -395,9 +410,9 @@
 	 * Add a function with the given name to the model.  
 	 * @param name
 	 * @return
-	 * @throws TranslatorException 
+	 * @throws MetadataException 
 	 */
-	public FunctionMethod addFunction(String name) throws TranslatorException {
+	public FunctionMethod addFunction(String name) {
 		FunctionMethod function = new FunctionMethod();
 		function.setName(name);
 		setUUID(function);
@@ -410,9 +425,9 @@
 	 * @param name
 	 * @param method
 	 * @return
-	 * @throws TranslatorException
+	 * @throws MetadataException
 	 */
-	public FunctionMethod addFunction(String name, Method method) throws TranslatorException {
+	public FunctionMethod addFunction(String name, Method method) {
 		String returnType = DataTypeManager.getDataTypeName(method.getReturnType());
 		Class<?>[] params = method.getParameterTypes();
 		String[] paramTypes = new String[params.length];
@@ -456,6 +471,15 @@
 	}
 	
 	public void addNamespace(String prefix, String uri) {
+		if (StringUtil.startsWithIgnoreCase(prefix, TEIID_RESERVED)) { 
+			throw new MetadataException(DataPlugin.Event.TEIID60017, DataPlugin.Util.gs(DataPlugin.Event.TEIID60017, prefix));
+		}
+		if (uri == null || uri.indexOf('}') != -1) {
+			throw new MetadataException(DataPlugin.Event.TEIID60018, DataPlugin.Util.gs(DataPlugin.Event.TEIID60018, uri));
+		}
+		if (this.namespaces == null) {
+			 this.namespaces = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
+		}
 		this.namespaces.put(prefix, uri);
 	}
 	
@@ -540,7 +564,15 @@
 		return vdbVersion;
 	}	
 	
+	/**
+	 * Get the namespace map.  Will be an unmodifiable empty map if {@link #addNamespace(String, String)}
+	 * has not been called successfully.
+	 * @return
+	 */
 	public Map<String, String> getNamespaces() {
+		if (this.namespaces == null) {
+			return Collections.emptyMap();
+		}
 		return namespaces;
 	}
 	

Modified: trunk/api/src/main/resources/org/teiid/connector/i18n.properties
===================================================================
--- trunk/api/src/main/resources/org/teiid/connector/i18n.properties	2012-10-03 02:25:48 UTC (rev 4507)
+++ trunk/api/src/main/resources/org/teiid/connector/i18n.properties	2012-10-03 13:10:21 UTC (rev 4508)
@@ -26,6 +26,8 @@
 TEIID60014=Duplicate Procedure {0}
 TEIID60015=Duplicate Function {0}
 TEIID60016=Duplicate Column {0}
+TEIID60017=Invalid prefix {0}, teiid_ is reserved for Teiid use.
+TEIID60018=Invalid uri {0}, uris must be non null and not contain curly braces.
 
 TEIID60009=Unknown datatype {0}
 TEIID60011=No column found with name {0}

Modified: trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html	2012-10-03 02:25:48 UTC (rev 4507)
+++ trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html	2012-10-03 13:10:21 UTC (rev 4508)
@@ -61,7 +61,8 @@
   to the integer suffix of the teiidCode if possible.
   <li>TEIID-2226 All statements that return result sets that are executed as command statements in a procedure are validated against the expected resultset columns of the procedure.
       If the statement is not intended to be returnable, WITHOUT RETURN can be added to the end of the statement.
-  <li>TEIID-2235 The MetadataRepository.setNext was removed.  Also if an instance of a DefaultMetadataRepository is used, it will only affect metadata already loaded in the repository chain. 
+  <li>TEIID-2235 The MetadataRepository.setNext was removed.  Also if an instance of a DefaultMetadataRepository is used, it will only affect metadata already loaded in the repository chain.
+   <li>TEIID-2237 teiid_ is a reserved DDL namespace prefix and the MetadataFactory class no longer throws TranslatorExceptions, instead the unchecked MetadataException is thrown.
 </ul>
 
 <h4>from 8.0</h4>

Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/Constants.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/Constants.java	2012-10-03 02:25:48 UTC (rev 4507)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/Constants.java	2012-10-03 13:10:21 UTC (rev 4508)
@@ -1,5 +1,7 @@
 package org.teiid.translator.salesforce;
 
+import org.teiid.metadata.MetadataFactory;
+
 public interface Constants {
 
 	public static final String PICKLIST_TYPE = "picklist"; //$NON-NLS-1$
@@ -40,14 +42,12 @@
 
 	public static final String EMAIL_TYPE = "email"; //$NON-NLS-1$
 
-	public static final String EXTENSION_URI = "{http://www.teiid.org/translator/salesforce/2012}"; //$NON-NLS-1$
-
 	public static final String RESTRICTED_PICKLIST_TYPE = "restrictedpicklist"; //$NON-NLS-1$
 	
 	public static final String RESTRICTED_MULTISELECT_PICKLIST_TYPE = "restrictedmultiselectpicklist"; //$NON-NLS-1$
 
-	public static final String SUPPORTS_QUERY = EXTENSION_URI +"Supports Query";//$NON-NLS-1$
+	public static final String SUPPORTS_QUERY = MetadataFactory.SF_URI +"Supports Query";//$NON-NLS-1$
 	
-	public static final String SUPPORTS_RETRIEVE = EXTENSION_URI +"Supports Retrieve";//$NON-NLS-1$
+	public static final String SUPPORTS_RETRIEVE = MetadataFactory.SF_URI +"Supports Retrieve";//$NON-NLS-1$
 
 }

Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java	2012-10-03 02:25:48 UTC (rev 4507)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java	2012-10-03 13:10:21 UTC (rev 4508)
@@ -29,7 +29,6 @@
 import java.util.Map;
 
 import org.teiid.language.*;
-import org.teiid.metadata.AbstractMetadataRecord;
 import org.teiid.metadata.Column;
 import org.teiid.metadata.RuntimeMetadata;
 import org.teiid.translator.TranslatorException;
@@ -38,7 +37,6 @@
 
 
 public class SelectVisitor extends CriteriaVisitor implements IQueryProvidingVisitor {
-	public static final String TEIID_NATIVE_QUERY = AbstractMetadataRecord.RELATIONAL_URI + "native-query"; //$NON-NLS-1$
 	public static final String AGG_PREFIX = "expr"; //$NON-NLS-1$
 	private Map<Integer, Expression> selectSymbolIndexToElement = new HashMap<Integer, Expression>();
 	private Map<String, Integer> selectSymbolNameToIndex = new HashMap<String, Integer>();

Modified: trunk/engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java	2012-10-03 02:25:48 UTC (rev 4507)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java	2012-10-03 13:10:21 UTC (rev 4508)
@@ -28,7 +28,9 @@
 
 import java.util.Arrays;
 import java.util.EnumSet;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
@@ -42,6 +44,7 @@
 import org.teiid.metadata.BaseColumn.NullType;
 import org.teiid.metadata.FunctionMethod.Determinism;
 import org.teiid.metadata.ProcedureParameter.Type;
+import org.teiid.query.sql.symbol.Constant;
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.sql.visitor.SQLStringVisitor;
 
@@ -68,7 +71,15 @@
 	private boolean includeProcedures = true;
 	private boolean includeFunctions = true;
 	private Pattern filter;
+	private Map<String, String> prefixMap;
 	
+	private final static Map<String, String> BUILTIN_PREFIXES = new HashMap<String, String>();
+	static {
+		for (Map.Entry<String, String> entry : MetadataFactory.BUILTIN_NAMESPACES.entrySet()) {
+			BUILTIN_PREFIXES.put(entry.getValue(), entry.getKey());
+		}
+	}
+	
     public static String getDDLString(Schema schema, EnumSet<SchemaObjectType> types, String regexPattern) {
     	DDLStringVisitor visitor = new DDLStringVisitor(types, regexPattern);
         visitor.visit(schema);
@@ -466,9 +477,31 @@
 		if (sb.length() != 0) {
 			sb.append(COMMA).append(SPACE);
 		}
-		if (value instanceof String) {
-			value = TICK + StringUtil.replaceAll((String)value, TICK, TICK + TICK) + TICK;
+		if (value != null) {
+			value = new Constant(value);
+		} else {
+			value = Constant.NULL_CONSTANT;
 		}
+		if (key != null && key.length() > 2 && key.charAt(0) == '{') { 
+			int index = key.indexOf('}');
+			if (index > 1) {
+				String uri = key.substring(1, index);
+				key = key.substring(index + 1, key.length());
+				String prefix = BUILTIN_PREFIXES.get(uri);
+				if (prefix == null) {
+					if (prefixMap == null) {
+						prefixMap = new LinkedHashMap<String, String>();
+					} else {
+						prefix = this.prefixMap.get(uri);
+					}
+					if (prefix == null) {
+						prefix = "n"+this.prefixMap.size(); //$NON-NLS-1$
+						this.prefixMap.put(uri, prefix); 
+					}
+				}
+				key = prefix + ":" + key; //$NON-NLS-1$
+			}
+		}
 		sb.append(SQLStringVisitor.escapeSinglePart(key)).append(SPACE).append(value);
 	}
 	
@@ -644,6 +677,14 @@
 	}
 
     public String toString() {
+    	if (this.prefixMap != null) {
+    		StringBuilder sb = new StringBuilder();
+    		for (Map.Entry<String, String> entry : this.prefixMap.entrySet()) {
+    			sb.append("SET NAMESPACE '").append(StringUtil.replaceAll(entry.getKey(), "'", "''")).append('\'') //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+    			.append(" AS " ).append(SQLStringVisitor.escapeSinglePart(entry.getValue())).append(";\n"); //$NON-NLS-1$  //$NON-NLS-2$
+    		}
+    		return sb.append("\n").toString() + buffer.toString(); //$NON-NLS-1$
+    	}
         return buffer.toString();
     }
 }

Modified: trunk/engine/src/main/java/org/teiid/query/metadata/SystemMetadata.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/SystemMetadata.java	2012-10-03 02:25:48 UTC (rev 4507)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/SystemMetadata.java	2012-10-03 13:10:21 UTC (rev 4508)
@@ -45,7 +45,6 @@
 import org.teiid.metadata.Table;
 import org.teiid.query.parser.QueryParser;
 import org.teiid.query.validator.ValidatorReport;
-import org.teiid.translator.TranslatorException;
 
 public class SystemMetadata {
 	
@@ -123,15 +122,11 @@
 		vdb.addModel(mmd);
 		InputStream is = SystemMetadata.class.getClassLoader().getResourceAsStream("org/teiid/metadata/"+name+".sql"); //$NON-NLS-1$ //$NON-NLS-2$
 		try {
-			MetadataFactory factory = new MetadataFactory(vdb.getName(), vdb.getVersion(), name, typeMap, p, null) {
-				@Override
-				public Table addTable(String name) throws TranslatorException {
-					Table t = super.addTable(name);
-					t.setSystem(true);
-					return t;
-				}
-			};
+			MetadataFactory factory = new MetadataFactory(vdb.getName(), vdb.getVersion(), name, typeMap, p, null);
 			QueryParser.getQueryParser().parseDDL(factory, new InputStreamReader(is, Charset.forName("UTF-8"))); //$NON-NLS-1$
+			for (Table t : factory.getSchema().getTables().values()) {
+				t.setSystem(true);
+			}
 			return factory;
 		} finally {
 			try {

Modified: trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2012-10-03 02:25:48 UTC (rev 4507)
+++ trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java	2012-10-03 13:10:21 UTC (rev 4508)
@@ -48,7 +48,6 @@
 import org.teiid.query.sql.symbol.ElementSymbol;
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.GroupSymbol;
-import org.teiid.translator.TranslatorException;
 
 public class SQLParserUtil {
 	
@@ -554,29 +553,25 @@
 	}
 	
 	BaseColumn addProcColumn(MetadataFactory factory, Procedure proc, String name, ParsedDataType type, boolean rs) throws MetadataException {
-		try {
-			BaseColumn column = null;
-			if (rs) {
-				column = factory.addProcedureResultSetColumn(name, type.type, proc);
-			} else {
-				boolean added = false;
-				for (ProcedureParameter pp : proc.getParameters()) {
-					if (pp.getType() == Type.ReturnValue) {
-						added = true;
-						if (pp.getDatatype() != factory.getDataTypes().get(type.type)) {
-							throw new MetadataException(QueryPlugin.Util.getString("SQLParser.proc_type_conflict", proc.getName(), pp.getDatatype(), type.type)); //$NON-NLS-1$
-						}
+		BaseColumn column = null;
+		if (rs) {
+			column = factory.addProcedureResultSetColumn(name, type.type, proc);
+		} else {
+			boolean added = false;
+			for (ProcedureParameter pp : proc.getParameters()) {
+				if (pp.getType() == Type.ReturnValue) {
+					added = true;
+					if (pp.getDatatype() != factory.getDataTypes().get(type.type)) {
+						throw new MetadataException(QueryPlugin.Util.getString("SQLParser.proc_type_conflict", proc.getName(), pp.getDatatype(), type.type)); //$NON-NLS-1$
 					}
 				}
-				if (!added) {
-					column = factory.addProcedureParameter(name, type.type, ProcedureParameter.Type.ReturnValue, proc);
-				}
 			}
-			setTypeInfo(type, column);
-			return column;
-		} catch (TranslatorException e){
-			throw new MetadataException(e.getMessage());
-		}	
+			if (!added) {
+				column = factory.addProcedureParameter(name, type.type, ProcedureParameter.Type.ReturnValue, proc);
+			}
+		}
+		setTypeInfo(type, column);
+		return column;
 	}
 
 	void setTypeInfo(ParsedDataType type, BaseColumn column) {
@@ -595,7 +590,10 @@
 	 	int index = key.indexOf(':');
 	 	if (index > 0 && index < key.length() - 1) {
 	 		String prefix = key.substring(0, index);
-	 		String uri = factory.getNamespaces().get(prefix);
+	 		String uri = MetadataFactory.BUILTIN_NAMESPACES.get(prefix);
+	 		if (uri == null) {
+	 			uri = factory.getNamespaces().get(prefix);
+	 		}
 	 		if (uri != null) {
 	 			key = '{' +uri + '}' + key.substring(index + 1, key.length());
 	 		}
@@ -619,12 +617,8 @@
 				fbi = true;
 			}
 		}
-		try{
-			table.addAttchment(MetadataFactory.class, factory);
-	    	return factory.addFunctionBasedIndex(name != null?name:(SQLConstants.NonReserved.INDEX+(fbi?table.getFunctionBasedIndexes().size():table.getIndexes().size())), columnNames, nonColumnExpressions, table);
-	    }catch(TranslatorException e){
-			throw new MetadataException(e.getMessage());
-		}
+		table.addAttchment(MetadataFactory.class, factory);
+    	return factory.addFunctionBasedIndex(name != null?name:(SQLConstants.NonReserved.INDEX+(fbi?table.getFunctionBasedIndexes().size():table.getIndexes().size())), columnNames, nonColumnExpressions, table);
 	}
 	
 	static class  ParsedDataType{

Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2012-10-03 02:25:48 UTC (rev 4507)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj	2012-10-03 13:10:21 UTC (rev 4508)
@@ -4592,11 +4592,7 @@
 	//the below is optional beacuse to allow the designer based metadata
 	(	procName = id(null)
 		{
-			try {
-				proc = factory.addProcedure(procName);
-			} catch(TranslatorException e){
-				throw new MetadataException(e);
-			}		
+			proc = factory.addProcedure(procName);
 		}
 	
 		<LPAREN>
@@ -4670,18 +4666,14 @@
 	  }
 	]
 	{
-		try {
-			param = factory.addProcedureParameter(name, type.type, ppType, proc);
-			setTypeInfo(type, param);
-			if (notNull) {
-				param.setNullType(Column.NullType.No_Nulls);
-			}
-			if (vararg) {
-				param.setVarArg(vararg);
-			}			
-		} catch (TranslatorException e){
-			throw new MetadataException(e);
+		param = factory.addProcedureParameter(name, type.type, ppType, proc);
+		setTypeInfo(type, param);
+		if (notNull) {
+			param.setNullType(Column.NullType.No_Nulls);
 		}
+		if (vararg) {
+			param.setVarArg(vararg);
+		}			
 	}
 	[<DEFAULT_KEYWORD> defaultValue = stringVal() {param.setDefaultValue(defaultValue);}]
 	[optionsClause(param, factory)
@@ -4736,12 +4728,8 @@
 	<CREATE> (<FOREIGN> <TABLE> | [<VIRTUAL>] <VIEW> {view = true;}) 
 	tableName = id(null)
 	{
-		try{
-		    table = factory.addTable(tableName);
-		    table.setVirtual(view);
-	    } catch(TranslatorException e){
-	    	throw new MetadataException(e);
-	    }
+	    table = factory.addTable(tableName);
+	    table.setVirtual(view);
 	}
 	[<LPAREN>
     createColumn(factory, table)
@@ -4801,11 +4789,7 @@
     viewName = id(null)
     [pkColumnNames = columnList(true, false)]
     {
-	    try{
-		    return factory.addForiegnKey(name != null?name:("FK"+table.getForeignKeys().size()), columnNames, pkColumnNames, viewName, table);   
-	    } catch (TranslatorException e){
-	    	throw new MetadataException(e);
-	    }
+	    return factory.addForiegnKey(name != null?name:("FK"+table.getForeignKeys().size()), columnNames, pkColumnNames, viewName, table);   
     }
 }
 
@@ -4827,11 +4811,7 @@
 	    if (table.getPrimaryKey() != null){
 	    	throw new MetadataException(QueryPlugin.Util.getString("SQLParser.pk_exists", table.getName()));
 	 	}
-	 	try{
-	 		return factory.addPrimaryKey(name!=null?name:"PK", columnNames, table);
-	 	} catch(TranslatorException e){
-	 		throw new MetadataException(e);
-	 	}
+ 		return factory.addPrimaryKey(name!=null?name:"PK", columnNames, table);
     }
 }
 
@@ -4853,15 +4833,11 @@
 	(( type = <UNIQUE> | type = <ACCESSPATTERN>)
 	columnNames = columnList(true, false)	    
 	{
-	    try{
-			if (type.image.equalsIgnoreCase("UNIQUE")) { 
-	    		return factory.addIndex(name != null?name:("UNIQUE"+table.getUniqueKeys().size()), false, columnNames, table);
-	    	} else if (type.image.equalsIgnoreCase("ACCESSPATTERN")) { 
-	    		return factory.addAccessPattern(name != null?name:("AP"+table.getAccessPatterns().size()), columnNames, table);
-	    	}
-    	}catch(TranslatorException e){
-    		throw new MetadataException(e);
-    	}	    
+		if (type.image.equalsIgnoreCase("UNIQUE")) { 
+    		return factory.addIndex(name != null?name:("UNIQUE"+table.getUniqueKeys().size()), false, columnNames, table);
+    	} else if (type.image.equalsIgnoreCase("ACCESSPATTERN")) { 
+    		return factory.addAccessPattern(name != null?name:("AP"+table.getAccessPatterns().size()), columnNames, table);
+    	}
     }) | (
     type = <INDEX>
     <LPAREN>
@@ -4932,14 +4908,10 @@
 	 (
 	  type = parseDataType()
 	  {
-	  	try{
-    		column = factory.addColumn(element, type.type, table);
-    		column.setUpdatable(true);
-		    setTypeInfo(type, column);		    	
-    		columnName.add(element);
-    	}catch(TranslatorException e){
-    		throw new MetadataException(e);
-    	}
+		column = factory.addColumn(element, type.type, table);
+		column.setUpdatable(true);
+	    setTypeInfo(type, column);		    	
+		columnName.add(element);
 	  }
 	 )
 	 [<NOT> <NULL> { column.setNullType(Column.NullType.No_Nulls); }]
@@ -4957,20 +4929,16 @@
 	   }
 	 ]
 	 {
-	 	try{
-		    if (index){
-		 		factory.addIndex("INDEX"+table.getIndexes().size(), true, columnName, table);
-		 	} else if (unique){
-		 		factory.addIndex("UNIQUE"+table.getIndexes().size(), false, columnName, table);
-		 	} else if (pk) {
-		    	if (table.getPrimaryKey() != null) {
-		    		throw new MetadataException(QueryPlugin.Util.getString("SQLParser.pk_exists", table.getName()));
-		    	}
-		 		factory.addPrimaryKey("PK", columnName, table);
-		 	}
-    	}catch(TranslatorException e){
-    		throw new MetadataException(e);
-    	}	 	
+	    if (index){
+	 		factory.addIndex("INDEX"+table.getIndexes().size(), true, columnName, table);
+	 	} else if (unique){
+	 		factory.addIndex("UNIQUE"+table.getIndexes().size(), false, columnName, table);
+	 	} else if (pk) {
+	    	if (table.getPrimaryKey() != null) {
+	    		throw new MetadataException(QueryPlugin.Util.getString("SQLParser.pk_exists", table.getName()));
+	    	}
+	 		factory.addPrimaryKey("PK", columnName, table);
+	 	}
 	     	 	
 	    column.setAutoIncremented(autoIncrement);
 	 }

Modified: trunk/engine/src/test/java/org/teiid/query/metadata/TestDDLStringVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/metadata/TestDDLStringVisitor.java	2012-10-03 02:25:48 UTC (rev 4507)
+++ trunk/engine/src/test/java/org/teiid/query/metadata/TestDDLStringVisitor.java	2012-10-03 13:10:21 UTC (rev 4508)
@@ -29,7 +29,6 @@
 import java.util.Properties;
 
 import org.junit.Test;
-import org.teiid.api.exception.query.QueryParserException;
 import org.teiid.metadata.Column;
 import org.teiid.metadata.MetadataFactory;
 import org.teiid.metadata.Schema;
@@ -48,7 +47,7 @@
 				"	e2 string(10),\n" + 
 				"	e3 date NOT NULL,\n" + 
 				"	e4 bigdecimal(12,3),\n" + 
-				"	e5 integer AUTO_INCREMENT OPTIONS (UUID 'uuid', NAMEINSOURCE 'nis', SELECTABLE false),\n" + 
+				"	e5 integer AUTO_INCREMENT OPTIONS (UUID 'uuid', NAMEINSOURCE 'nis', SELECTABLE FALSE),\n" + 
 				"	e6 string DEFAULT 'hello',\n" +
 				"	PRIMARY KEY(e1),\n" +
 				"	UNIQUE(e2),\n" +
@@ -243,7 +242,7 @@
 		helpTest(ddl, expected);
 	}
 
-	private void helpTest(String ddl, String expected) throws QueryParserException {
+	private void helpTest(String ddl, String expected) {
 		Schema s = TestDDLParser.helpParse(ddl, "model").getSchema();
 		String metadataDDL = DDLStringVisitor.getDDLString(s, null, null);
 		assertEquals(expected, metadataDDL);
@@ -263,4 +262,10 @@
 		String expected = "CREATE VIEW G1 (\n	\"a e1\" integer,\n	\"a e2\" string,\n	INDEX(\"a e1\", upper(\"a e2\"))\n)\nAS\nSELECT e1, e2 FROM foo.bar;";
 		helpTest(ddl, expected);
 	}
+	
+	@Test public void testNamespaces() throws Exception {
+		String ddl = "set namespace 'some long thing' as x; CREATE View G1(a integer, b varchar) options (\"teiid_rel:x\" false, \"x:z\" 'stringval') AS select e1, e2 from foo.bar";
+		String expected = "SET NAMESPACE 'some long thing' AS n0;\n\nCREATE VIEW G1 (\n	a integer,\n	b string\n) OPTIONS (\"teiid_rel:x\" 'false', \"n0:z\" 'stringval')\nAS\nSELECT e1, e2 FROM foo.bar;";
+		helpTest(ddl, expected);
+	}
 }



More information about the teiid-commits mailing list