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);
+ }
}