Author: shawkins
Date: 2012-04-11 11:38:10 -0400 (Wed, 11 Apr 2012)
New Revision: 3992
Modified:
trunk/api/src/main/java/org/teiid/metadata/MetadataFactory.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/parser/TestDDLParser.java
Log:
TEIID-1280 adding namespace prefix resolution
Modified: trunk/api/src/main/java/org/teiid/metadata/MetadataFactory.java
===================================================================
--- trunk/api/src/main/java/org/teiid/metadata/MetadataFactory.java 2012-04-11 15:17:17
UTC (rev 3991)
+++ trunk/api/src/main/java/org/teiid/metadata/MetadataFactory.java 2012-04-11 15:38:10
UTC (rev 3992)
@@ -385,4 +385,8 @@
public int getVdbVersion() {
return vdbVersion;
}
+
+ public Map<String, String> getNamespaces() {
+ return namespaces;
+ }
}
Modified: trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java 2012-04-11
15:17:17 UTC (rev 3991)
+++ trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java 2012-04-11
15:38:10 UTC (rev 3992)
@@ -572,6 +572,19 @@
}
}
+ static String resolvePropertyKey(MetadataFactory factory, String key) {
+ int index = key.indexOf(':');
+ if (index > 0 && index < key.length() - 1) {
+ String prefix = key.substring(0, index);
+ String uri = factory.getNamespaces().get(prefix);
+ if (uri != null) {
+ key = '{' +uri + '}' + key.substring(index + 1, key.length());
+ }
+ //TODO warnings or errors if not resolvable
+ }
+ return key;
+ }
+
static class ParsedDataType{
String type;
Integer length;
Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2012-04-11 15:17:17
UTC (rev 3991)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2012-04-11 15:38:10
UTC (rev 3992)
@@ -3855,11 +3855,11 @@
}
{
<XMLNAMESPACES> <LPAREN>
- item = namespaceItem(info)
+ item = namespaceItem()
{
namespaces.add(item);
}
- (<COMMA> item = namespaceItem(info)
+ (<COMMA> item = namespaceItem()
{
namespaces.add(item);
}
@@ -3870,7 +3870,7 @@
}
}
-XMLNamespaces.NamespaceItem namespaceItem(ParseInfo info) :
+XMLNamespaces.NamespaceItem namespaceItem() :
{
String uri = null;
String prefix = null;
@@ -4094,13 +4094,12 @@
void createNameSpace(MetadataFactory factory) :
{
- String uri = null;
- String prefix = null;
+ XMLNamespaces.NamespaceItem item = null;
}
{
- <SET> nonReserved ("NAMESPACE") uri = stringVal() <AS> prefix =
stringVal()
+ <SET> nonReserved ("NAMESPACE") item = namespaceItem()
{
- factory.addNamespace(prefix, uri);
+ factory.addNamespace(item.getPrefix(), item.getUri());
}
}
@@ -4137,7 +4136,7 @@
<RETURNS> (readProcedureReturn(factory, proc) | returnDataType =
parseDataType())
- [ optionsClause(proc)
+ [ optionsClause(proc, factory)
{
setProcedureOptions(proc);
}
@@ -4259,7 +4258,7 @@
)*
]
<RPAREN>]
- [optionsClause(table)
+ [optionsClause(table, factory)
{
setTableOptions(table);
}
@@ -4434,7 +4433,7 @@
|(<PRIMARY> nonReserved("KEY") { pk = true; })
])
[<DEFAULT_KEYWORD> defalt = stringVal()]
- [optionsClause(column)
+ [optionsClause(column, factory)
{
setColumnOptions(column);
}
@@ -4467,16 +4466,16 @@
}
}
-void optionsClause(AbstractMetadataRecord record) :
+void optionsClause(AbstractMetadataRecord record, MetadataFactory factory) :
{
}
{
<OPTIONS> <LPAREN>
- readOption(record) (<COMMA> readOption(record))*
+ optionPair(record, factory) (<COMMA> optionPair(record, factory))*
<RPAREN>
}
-void readOption(AbstractMetadataRecord record) :
+void optionPair(AbstractMetadataRecord record, MetadataFactory factory) :
{
String value = null;
String key = null;
@@ -4493,6 +4492,7 @@
if (t != null) {
value = t.image;
}
+ key = resolvePropertyKey(factory, key);
record.setProperty(key, value);
}
}
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java 2012-04-11
15:17:17 UTC (rev 3991)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java 2012-04-11
15:38:10 UTC (rev 3992)
@@ -569,7 +569,7 @@
@Test
public void testNamespace() throws Exception {
- String ddl = "set namespace 'http://teiid.org' AS 'teiid'";
+ String ddl = "set namespace 'http://teiid.org' AS teiid";
MetadataStore mds = new MetadataStore();
MetadataFactory mf = new MetadataFactory(null, 1, "model", getDataTypes(),
new Properties(), null);
@@ -601,4 +601,11 @@
datatypes.put("decimal",
datatypes.get(DataTypeManager.DefaultDataTypes.BIG_DECIMAL));
return datatypes;
}
+
+ @Test public void testKeyResolve() {
+ MetadataFactory mf = new MetadataFactory(null, 1, "foo", getDataTypes(), new
Properties(), null);
+ mf.addNamespace("x", "http://x");
+ assertEquals("{http://x}z", SQLParserUtil.resolvePropertyKey(mf,
"x:z"));
+ assertEquals("y:z", SQLParserUtil.resolvePropertyKey(mf, "y:z"));
+ }
}