diff --git a/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/DerbyImporter.java b/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/DerbyImporter.java index e79261cbb9..021c14ce39 100644 --- a/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/DerbyImporter.java +++ b/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/DerbyImporter.java @@ -104,10 +104,25 @@ protected Map createObject(AstNode node, Relational */ @Override protected void createDeferredObjects(Map deferredNodes, RelationalModel model) throws Exception { - Collection allRefs = model.getAllReferences(); - - Set astNodes = deferredNodes.keySet(); - for(AstNode node:astNodes) { + Collection allRefs = model.getAllReferences(); + + // Make first pass to create the PKs + Set astNodes = deferredNodes.keySet(); + for(AstNode node:astNodes) { + if (is(node, StandardDdlLexicon.TYPE_TABLE_CONSTRAINT)) { + RelationalTable table = (RelationalTable)deferredNodes.get(node); + createPrimaryKey(node, table, allRefs); + } else if (is(node, StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT)) { + RelationalTable table = find(RelationalTable.class, node, null, allRefs); + for (AstNode node1 : node) { + if (is(node1, StandardDdlLexicon.TYPE_ADD_TABLE_CONSTRAINT_DEFINITION)) + createPrimaryKey(node1, table, allRefs); + } + } + } + + // Second pass create other constraints + for(AstNode node:astNodes) { if (is(node, DerbyDdlLexicon.TYPE_CREATE_INDEX_STATEMENT)) { RelationalIndex index = getFactory().createIndex(); Info info = createInfo(node, model); @@ -140,8 +155,19 @@ protected void createDeferredObjects(Map deferredNo } catch (EntityNotFoundException error) { addProgressMessage(error.getMessage()); } - } - } + } else if (is(node, StandardDdlLexicon.TYPE_TABLE_CONSTRAINT)) { + RelationalTable table = (RelationalTable)deferredNodes.get(node); + createConstraint(node, table, allRefs); + } else if (is(node, StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT)) { + RelationalTable table = find(RelationalTable.class, node, null, allRefs); + for (AstNode node1 : node) { + if (is(node1, StandardDdlLexicon.TYPE_ADD_TABLE_CONSTRAINT_DEFINITION)) + createConstraint(node1, table, allRefs); + else if (is(node1, StandardDdlLexicon.TYPE_ADD_COLUMN_DEFINITION)) + createColumn(node1, table); + } + } + } } } diff --git a/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/MySQLImporter.java b/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/MySQLImporter.java index ed592c6df9..d1cdf9c396 100644 --- a/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/MySQLImporter.java +++ b/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/MySQLImporter.java @@ -7,16 +7,19 @@ */ package org.teiid.designer.ddl.importer.node; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; +import org.modeshape.sequencer.ddl.StandardDdlLexicon; import org.modeshape.sequencer.ddl.dialect.mysql.MySqlDdlLexicon; import org.modeshape.sequencer.ddl.node.AstNode; import org.teiid.designer.relational.model.RelationalIndex; import org.teiid.designer.relational.model.RelationalModel; import org.teiid.designer.relational.model.RelationalReference; import org.teiid.designer.relational.model.RelationalSchema; +import org.teiid.designer.relational.model.RelationalTable; /** * @@ -54,9 +57,25 @@ protected Map createObject(AstNode node, Relational */ @Override protected void createDeferredObjects(Map deferredNodes, RelationalModel model) throws Exception { + Collection allRefs = model.getAllReferences(); - Set astNodes = deferredNodes.keySet(); - for(AstNode node:astNodes) { + // Make first pass to create the PKs + Set astNodes = deferredNodes.keySet(); + for(AstNode node:astNodes) { + if (is(node, StandardDdlLexicon.TYPE_TABLE_CONSTRAINT)) { + RelationalTable table = (RelationalTable)deferredNodes.get(node); + createPrimaryKey(node, table, allRefs); + } else if (is(node, StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT)) { + RelationalTable table = find(RelationalTable.class, node, null, allRefs); + for (AstNode node1 : node) { + if (is(node1, StandardDdlLexicon.TYPE_ADD_TABLE_CONSTRAINT_DEFINITION)) + createPrimaryKey(node1, table, allRefs); + } + } + } + + // Second pass create other constraints + for(AstNode node:astNodes) { if (is(node, MySqlDdlLexicon.TYPE_CREATE_INDEX_STATEMENT)) { RelationalIndex index = getFactory().createIndex(); Info info = createInfo(node, model); @@ -66,8 +85,19 @@ protected void createDeferredObjects(Map deferredNo info.getSchema().getIndexes().add(index); initialize(index, node, info.getName()); - } - } + } else if (is(node, StandardDdlLexicon.TYPE_TABLE_CONSTRAINT)) { + RelationalTable table = (RelationalTable)deferredNodes.get(node); + createConstraint(node, table, allRefs); + } else if (is(node, StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT)) { + RelationalTable table = find(RelationalTable.class, node, null, allRefs); + for (AstNode node1 : node) { + if (is(node1, StandardDdlLexicon.TYPE_ADD_TABLE_CONSTRAINT_DEFINITION)) + createConstraint(node1, table, allRefs); + else if (is(node1, StandardDdlLexicon.TYPE_ADD_COLUMN_DEFINITION)) + createColumn(node1, table); + } + } + } } } diff --git a/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/OracleImporter.java b/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/OracleImporter.java index e88c670525..8e226ce7dd 100644 --- a/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/OracleImporter.java +++ b/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/OracleImporter.java @@ -13,9 +13,11 @@ import java.util.Map; import java.util.Set; +import org.eclipse.emf.ecore.EObject; import org.modeshape.sequencer.ddl.StandardDdlLexicon; import org.modeshape.sequencer.ddl.dialect.oracle.OracleDdlLexicon; import org.modeshape.sequencer.ddl.node.AstNode; +import org.teiid.designer.metamodels.relational.util.RelationalTypeMapping; import org.teiid.designer.relational.model.RelationalColumn; import org.teiid.designer.relational.model.RelationalIndex; import org.teiid.designer.relational.model.RelationalModel; @@ -29,7 +31,11 @@ * */ public class OracleImporter extends StandardImporter { - + + private static final String VARCHAR2_TYPE_NAME = "VARCHAR2"; //$NON-NLS-1$ + private static final String NVARCHAR2_TYPE_NAME = "NVARCHAR2"; //$NON-NLS-1$ + private static final String NUMBER_TYPE_NAME = "NUMBER"; //$NON-NLS-1$ + @Override protected RelationalProcedure createProcedure(AstNode procedureNode, RelationalModel model) throws Exception { RelationalProcedure procedure = super.createProcedure(procedureNode, model); @@ -112,7 +118,22 @@ protected Map createObject(AstNode node, Relational protected void createDeferredObjects(Map deferredNodes, RelationalModel model) throws Exception { Collection allRefs = model.getAllReferences(); - Set astNodes = deferredNodes.keySet(); + // Make first pass to create the PKs + Set astNodes = deferredNodes.keySet(); + for(AstNode node:astNodes) { + if (is(node, StandardDdlLexicon.TYPE_TABLE_CONSTRAINT)) { + RelationalTable table = (RelationalTable)deferredNodes.get(node); + createPrimaryKey(node, table, allRefs); + } else if (is(node, StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT)) { + RelationalTable table = find(RelationalTable.class, node, null, allRefs); + for (AstNode node1 : node) { + if (is(node1, StandardDdlLexicon.TYPE_ADD_TABLE_CONSTRAINT_DEFINITION)) + createPrimaryKey(node1, table, allRefs); + } + } + } + + // Second pass create other constraints for(AstNode node:astNodes) { if (is(node, OracleDdlLexicon.TYPE_CREATE_TABLE_INDEX_STATEMENT)) { RelationalIndex index = getFactory().createIndex(); @@ -147,8 +168,40 @@ protected void createDeferredObjects(Map deferredNo } } } - } + } else if (is(node, StandardDdlLexicon.TYPE_TABLE_CONSTRAINT)) { + RelationalTable table = (RelationalTable)deferredNodes.get(node); + createConstraint(node, table, allRefs); + } else if (is(node, StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT)) { + RelationalTable table = find(RelationalTable.class, node, null, allRefs); + for (AstNode node1 : node) { + if (is(node1, StandardDdlLexicon.TYPE_ADD_TABLE_CONSTRAINT_DEFINITION)) + createConstraint(node1, table, allRefs); + else if (is(node1, StandardDdlLexicon.TYPE_ADD_COLUMN_DEFINITION)) + createColumn(node1, table); + } + } + } } + + /** + * @param jdbcTypeName + * + * @return {@link EObject} represented by the given data type id + * @throws Exception + */ + @Override + protected String getTeiidDataTypeName(String jdbcTypeName) throws Exception { + String standardName = jdbcTypeName; + if (VARCHAR2_TYPE_NAME.equalsIgnoreCase(jdbcTypeName) || NVARCHAR2_TYPE_NAME.equalsIgnoreCase(jdbcTypeName)) { + standardName = RelationalTypeMapping.SQL_TYPE_NAMES.VARCHAR; + } + + if (NUMBER_TYPE_NAME.equalsIgnoreCase(jdbcTypeName)) { + standardName = RelationalTypeMapping.SQL_TYPE_NAMES.NUMERIC; + } + + return super.getTeiidDataTypeName(standardName); + } } diff --git a/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/PostgresImporter.java b/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/PostgresImporter.java index ad0d5683e4..bc004e6423 100644 --- a/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/PostgresImporter.java +++ b/plugins/org.teiid.designer.ddl.importer/src/org/teiid/designer/ddl/importer/node/PostgresImporter.java @@ -7,22 +7,30 @@ */ package org.teiid.designer.ddl.importer.node; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; +import org.eclipse.emf.ecore.EObject; +import org.modeshape.sequencer.ddl.StandardDdlLexicon; import org.modeshape.sequencer.ddl.dialect.postgres.PostgresDdlLexicon; import org.modeshape.sequencer.ddl.node.AstNode; +import org.teiid.designer.metamodels.relational.util.RelationalTypeMapping; import org.teiid.designer.relational.model.RelationalIndex; import org.teiid.designer.relational.model.RelationalModel; import org.teiid.designer.relational.model.RelationalReference; import org.teiid.designer.relational.model.RelationalSchema; +import org.teiid.designer.relational.model.RelationalTable; /** * */ public class PostgresImporter extends StandardImporter { + private static final String TEXT_TYPE_NAME = "TEXT"; //$NON-NLS-1$ + private static final String IMAGE_TYPE_NAME = "IMAGE"; //$NON-NLS-1$ + /** * Create RelationalReference objects * @param node the provided AstNode @@ -53,9 +61,25 @@ protected Map createObject(AstNode node, Relational */ @Override protected void createDeferredObjects(Map deferredNodes, RelationalModel model) throws Exception { - - Set astNodes = deferredNodes.keySet(); - for(AstNode node:astNodes) { + Collection allRefs = model.getAllReferences(); + + // Make first pass to create the PKs + Set astNodes = deferredNodes.keySet(); + for(AstNode node:astNodes) { + if (is(node, StandardDdlLexicon.TYPE_TABLE_CONSTRAINT)) { + RelationalTable table = (RelationalTable)deferredNodes.get(node); + createPrimaryKey(node, table, allRefs); + } else if (is(node, StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT)) { + RelationalTable table = find(RelationalTable.class, node, null, allRefs); + for (AstNode node1 : node) { + if (is(node1, StandardDdlLexicon.TYPE_ADD_TABLE_CONSTRAINT_DEFINITION)) + createPrimaryKey(node1, table, allRefs); + } + } + } + + // Second pass create other constraints + for(AstNode node:astNodes) { if (is(node, PostgresDdlLexicon.TYPE_CREATE_INDEX_STATEMENT)) { RelationalIndex index = getFactory().createIndex(); Info info = createInfo(node, model); @@ -65,8 +89,40 @@ protected void createDeferredObjects(Map deferredNo info.getSchema().getIndexes().add(index); initialize(index, node, info.getName()); - } - } + } else if (is(node, StandardDdlLexicon.TYPE_TABLE_CONSTRAINT)) { + RelationalTable table = (RelationalTable)deferredNodes.get(node); + createConstraint(node, table, allRefs); + } else if (is(node, StandardDdlLexicon.TYPE_ALTER_TABLE_STATEMENT)) { + RelationalTable table = find(RelationalTable.class, node, null, allRefs); + for (AstNode node1 : node) { + if (is(node1, StandardDdlLexicon.TYPE_ADD_TABLE_CONSTRAINT_DEFINITION)) + createConstraint(node1, table, allRefs); + else if (is(node1, StandardDdlLexicon.TYPE_ADD_COLUMN_DEFINITION)) + createColumn(node1, table); + } + } + } + } + /** + * @param jdbcTypeName + * + * @return {@link EObject} represented by the given data type id + * @throws Exception + */ + @Override + protected String getTeiidDataTypeName(String jdbcTypeName) throws Exception { + String standardName = jdbcTypeName; + if (TEXT_TYPE_NAME.equalsIgnoreCase(jdbcTypeName)) { + standardName = RelationalTypeMapping.SQL_TYPE_NAMES.CLOB; + } + + if (IMAGE_TYPE_NAME.equalsIgnoreCase(jdbcTypeName)) { + standardName = RelationalTypeMapping.SQL_TYPE_NAMES.BLOB; + } + + return super.getTeiidDataTypeName(standardName); + } + }