Author: rareddy
Date: 2012-05-07 14:26:07 -0400 (Mon, 07 May 2012)
New Revision: 4067
Modified:
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
trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java
Log:
TEIID-2032, TEIID-2033: Adding OPTIONS on KEYS
Modified: trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java 2012-05-07
18:23:09 UTC (rev 4066)
+++ trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java 2012-05-07
18:26:07 UTC (rev 4067)
@@ -359,19 +359,29 @@
setCommonProperties(c, props);
String v = props.remove("CASE_SENSITIVE"); //$NON-NLS-1$
- c.setCaseSensitive(isTrue(v));
+ if (v != null) {
+ c.setCaseSensitive(isTrue(v));
+ }
v = props.remove("SELECTABLE"); //$NON-NLS-1$
- c.setSelectable(isTrue(v));
+ if (v != null) {
+ c.setSelectable(isTrue(v));
+ }
v = props.remove("UPDATABLE"); //$NON-NLS-1$
- c.setUpdatable(isTrue(v));
+ if (v != null) {
+ c.setUpdatable(isTrue(v));
+ }
v = props.remove("SIGNED"); //$NON-NLS-1$
- c.setSigned(isTrue(v));
+ if (v != null) {
+ c.setSigned(isTrue(v));
+ }
v = props.remove("CURRENCY"); //$NON-NLS-1$
- c.setSigned(isTrue(v));
+ if (v != null) {
+ c.setSigned(isTrue(v));
+ }
v = props.remove("FIXED_LENGTH"); //$NON-NLS-1$
c.setFixedLength(isTrue(v));
@@ -382,10 +392,14 @@
}
v = props.remove("MIN_VALUE"); //$NON-NLS-1$
- c.setMinimumValue(v);
+ if (v != null) {
+ c.setMinimumValue(v);
+ }
v = props.remove("MAX_VALUE"); //$NON-NLS-1$
- c.setMaximumValue(v);
+ if (v != null) {
+ c.setMaximumValue(v);
+ }
v = props.remove("CHAR_OCTET_LENGTH"); //$NON-NLS-1$
if (v != null) {
@@ -393,7 +407,9 @@
}
v = props.remove("NATIVE_TYPE"); //$NON-NLS-1$
- c.setNativeType(v);
+ if (v != null) {
+ c.setNativeType(v);
+ }
v = props.remove("RADIX"); //$NON-NLS-1$
if (v != null) {
@@ -411,15 +427,21 @@
}
}
- private void setCommonProperties(AbstractMetadataRecord c, Map<String, String>
props) {
+ void setCommonProperties(AbstractMetadataRecord c, Map<String, String> props) {
String v = props.remove("UUID"); //$NON-NLS-1$
- c.setUUID(v);
+ if (v != null) {
+ c.setUUID(v);
+ }
v = props.remove("ANNOTATION"); //$NON-NLS-1$
- c.setAnnotation(v);
+ if (v != null) {
+ c.setAnnotation(v);
+ }
v = props.remove("NAMEINSOURCE"); //$NON-NLS-1$
- c.setNameInSource(v);
+ if (v != null) {
+ c.setNameInSource(v);
+ }
}
void setTableOptions(Table table) {
@@ -427,7 +449,9 @@
setCommonProperties(table, props);
String value = props.remove("MATERIALIZED"); //$NON-NLS-1$
- table.setMaterialized(isTrue(value));
+ if (value != null) {
+ table.setMaterialized(isTrue(value));
+ }
value = props.remove("MATERIALIZED_TABLE"); //$NON-NLS-1$
if (value != null) {
@@ -437,7 +461,9 @@
}
value = props.remove("UPDATABLE"); //$NON-NLS-1$
- table.setSupportsUpdate(isTrue(value));
+ if (value != null) {
+ table.setSupportsUpdate(isTrue(value));
+ }
value = props.remove("CARDINALITY"); //$NON-NLS-1$
if (value != null) {
Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2012-05-07 18:23:09
UTC (rev 4066)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2012-05-07 18:26:07
UTC (rev 4067)
@@ -4271,6 +4271,7 @@
KeyRecord pk = null;
Column column = null;
List<String> pkColumnNames = null;
+ KeyRecord key = null;
}
{
<FOREIGN> nonReserved("KEY")
@@ -4285,17 +4286,23 @@
[pkColumnNames = getColumnNames()]
{
try{
- factory.addForiegnKey("FK"+table.getForeignKeys().size(), columnNames,
pkColumnNames, viewName, table);
+ key = factory.addForiegnKey("FK"+table.getForeignKeys().size(),
columnNames, pkColumnNames, viewName, table);
} catch (TranslatorException e){
throw new ParseException(e.getMessage());
}
}
+ [optionsClause(key, factory)
+ {
+ setCommonProperties(key, key.getProperties());
+ }
+ ]
}
void primaryKeys(MetadataFactory factory, Table table) :
{
List<String> columnNames = null;
Column column = null;
+ KeyRecord key = null;
}
{
<PRIMARY> nonReserved("KEY")
@@ -4308,11 +4315,16 @@
throw new
ParseException(QueryPlugin.Util.getString("SQLParser.pk_exists",
table.getName()));
}
try{
- factory.addPrimaryKey("PK", columnNames, table);
+ key = factory.addPrimaryKey("PK", columnNames, table);
} catch(TranslatorException e){
throw new ParseException(e.getMessage());
}
}
+ [optionsClause(key, factory)
+ {
+ setCommonProperties(key, key.getProperties());
+ }
+ ]
}
void constraints(MetadataFactory factory, Table table) :
@@ -4321,6 +4333,7 @@
Column column = null;
List<String> columnNames = null;
String type = null;
+ KeyRecord key = null;
}
{
( <UNIQUE> { type = "UNIQUE"; } | type =
nonReserved("INDEX","ACCESSPATTERN"))
@@ -4331,18 +4344,23 @@
}
try{
if (type.equalsIgnoreCase("INDEX")) {
- factory.addIndex("INDEX"+table.getIndexes().size(), true, columnNames,
table);
+ key = factory.addIndex("INDEX"+table.getIndexes().size(), true,
columnNames, table);
}
if (type.equalsIgnoreCase("UNIQUE")) {
- factory.addIndex("UNIQUE"+table.getUniqueKeys().size(), false,
columnNames, table);
+ key = factory.addIndex("UNIQUE"+table.getUniqueKeys().size(), false,
columnNames, table);
}
if (type.equalsIgnoreCase("ACCESSPATTERN")) {
- factory.addAccessPattern("AP"+table.getAccessPatterns().size(),
columnNames, table);
+ key = factory.addAccessPattern("AP"+table.getAccessPatterns().size(),
columnNames, table);
}
}catch(TranslatorException e){
throw new ParseException(e.getMessage());
}
}
+ [optionsClause(key, factory)
+ {
+ setCommonProperties(key, key.getProperties());
+ }
+ ]
}
ArrayList<String> getColumnNames() :
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java 2012-05-07
18:23:09 UTC (rev 4066)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java 2012-05-07
18:26:07 UTC (rev 4067)
@@ -22,6 +22,8 @@
*/
import static org.junit.Assert.*;
+import java.io.File;
+import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -31,8 +33,9 @@
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.core.types.DataTypeManager;
+import org.teiid.core.util.ObjectConverterUtil;
+import org.teiid.metadata.BaseColumn.NullType;
import org.teiid.metadata.*;
-import org.teiid.metadata.BaseColumn.NullType;
import org.teiid.query.metadata.MetadataValidator;
import org.teiid.query.validator.ValidatorReport;
@@ -140,6 +143,18 @@
}
@Test
+ public void testOptionsKey() throws Exception {
+ String ddl = "CREATE FOREIGN TABLE G1( e1 integer, e2 varchar, e3 date CONSTRAINT
UNIQUE (e1) OPTIONS (CUSTOM_PROP 'VALUE'))";
+ Schema s = helpParse(ddl, "model");
+ Map<String, Table> tableMap = s.getTables();
+
+ assertTrue("Table not found", tableMap.containsKey("G1"));
+ Table table = tableMap.get("G1");
+ KeyRecord record = table.getAllKeys().iterator().next();
+ assertEquals("VALUE", record.getProperty("CUSTOM_PROP", false));
+ }
+
+ @Test
public void testConstraints() throws Exception {
String ddl = "CREATE FOREIGN TABLE G1( e1 integer, e2 varchar, e3 date " +
" CONSTRAINT PRIMARY KEY (e1, e2), INDEX(e2, e3), ACCESSPATTERN(e1),
UNIQUE(e1)," +
@@ -604,6 +619,12 @@
return mf;
}
+ public MetadataFactory buildMetadataFactory(File ddlFile, String model) throws
IOException, ParseException {
+ MetadataFactory mf = new MetadataFactory(null, 1, model, getDataTypes(), new
Properties(), null);
+ parser.parseDDL(mf, ObjectConverterUtil.convertFileToString(ddlFile));
+ return mf;
+ }
+
//TODO: could elevate type logic out of metadata
public static Map<String, Datatype> getDataTypes() {
Map<String, Datatype> datatypes = new HashMap<String, Datatype>();
Modified: trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java 2012-05-07
18:23:09 UTC (rev 4066)
+++
trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java 2012-05-07
18:26:07 UTC (rev 4067)
@@ -22,6 +22,7 @@
package org.teiid.query.unittest;
+import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -41,8 +42,8 @@
import org.teiid.core.types.DataTypeManager.DefaultDataClasses;
import org.teiid.core.types.DataTypeManager.DefaultDataTypes;
import org.teiid.dqp.internal.process.DQPWorkContext;
-import org.teiid.metadata.*;
import org.teiid.metadata.BaseColumn.NullType;
+import org.teiid.metadata.*;
import org.teiid.metadata.Column.SearchType;
import org.teiid.metadata.ProcedureParameter.Type;
import org.teiid.metadata.Table.TriggerEvent;
@@ -50,18 +51,12 @@
import org.teiid.query.function.SystemFunctionManager;
import org.teiid.query.function.UDFSource;
import org.teiid.query.mapping.relational.QueryNode;
-import org.teiid.query.mapping.xml.MappingAttribute;
-import org.teiid.query.mapping.xml.MappingDocument;
-import org.teiid.query.mapping.xml.MappingElement;
-import org.teiid.query.mapping.xml.MappingNode;
-import org.teiid.query.mapping.xml.MappingOutputter;
-import org.teiid.query.mapping.xml.MappingSequenceNode;
-import org.teiid.query.mapping.xml.MappingVisitor;
-import org.teiid.query.mapping.xml.Navigator;
+import org.teiid.query.mapping.xml.*;
import org.teiid.query.metadata.CompositeMetadataStore;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.metadata.TransformationMetadata;
import org.teiid.query.optimizer.FakeFunctionMetadataSource;
+import org.teiid.query.parser.TestDDLParser;
import org.teiid.query.sql.lang.SPParameter;
@SuppressWarnings("nls")
@@ -2651,5 +2646,9 @@
return createTransformationMetadata(metadataStore, "example4");
}
-
+
+ public static TransformationMetadata fromDDL(File ddlFile, String vdbName, String
modelName) throws Exception {
+ MetadataFactory mf = new TestDDLParser().buildMetadataFactory(ddlFile, modelName);
+ return createTransformationMetadata(mf.asMetadataStore(), vdbName);
+ }
}