From 122027d7323bfbb041f298fff8be39c3eac8f9b6 Mon Sep 17 00:00:00 2001 From: Mark Drilling Date: Mon, 15 Jul 2013 12:51:11 -0500 Subject: [PATCH] TEIIDDES-1783 Import of Oracle DDL with indexes does not create them --- .../ddl/importer/node/OracleImporter.java | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) 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 198dab925b..e88c670525 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 @@ -7,19 +7,23 @@ */ package org.teiid.designer.ddl.importer.node; +import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; 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.relational.model.RelationalColumn; import org.teiid.designer.relational.model.RelationalIndex; import org.teiid.designer.relational.model.RelationalModel; import org.teiid.designer.relational.model.RelationalParameter; import org.teiid.designer.relational.model.RelationalProcedure; import org.teiid.designer.relational.model.RelationalReference; import org.teiid.designer.relational.model.RelationalSchema; +import org.teiid.designer.relational.model.RelationalTable; /** * @@ -85,14 +89,15 @@ protected RelationalProcedure createProcedure(AstNode procedureNode, RelationalM protected Map createObject(AstNode node, RelationalModel model, RelationalSchema schema) throws Exception { Map deferredMap = new HashMap(); - if (is(node, OracleDdlLexicon.TYPE_CREATE_INDEX_STATEMENT)) { + if (is(node, OracleDdlLexicon.TYPE_CREATE_TABLE_INDEX_STATEMENT)) { deferredMap.put(node, null); } else if (is(node, OracleDdlLexicon.TYPE_CREATE_PROCEDURE_STATEMENT)) { createProcedure(node, model); } else if (is(node, OracleDdlLexicon.TYPE_CREATE_FUNCTION_STATEMENT)) { createProcedure(node, model).setFunction(true); - } else + } else { return super.createObject(node, model, schema); + } return deferredMap; } @@ -105,10 +110,11 @@ 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) { - if (is(node, OracleDdlLexicon.TYPE_CREATE_INDEX_STATEMENT)) { + if (is(node, OracleDdlLexicon.TYPE_CREATE_TABLE_INDEX_STATEMENT)) { RelationalIndex index = getFactory().createIndex(); Info info = createInfo(node, model); if (info.getSchema() == null) @@ -119,8 +125,28 @@ protected void createDeferredObjects(Map deferredNo initialize(index, node, info.getName()); Object prop = node.getProperty(OracleDdlLexicon.UNIQUE_INDEX); - if (prop != null) - index.setUnique((Boolean)prop); + if (prop != null) index.setUnique((Boolean)prop); + + // Get Table referenced + String tableName = (String)node.getProperty(OracleDdlLexicon.TABLE_NAME); + RelationalTable table = find(RelationalTable.class, tableName, node, null, allRefs); + + // Get columns referenced and add them to the index + if(table!=null) { + List childNodes = node.getChildren(); + for(AstNode child : childNodes) { + if(is(child, StandardDdlLexicon.TYPE_COLUMN_REFERENCE)) { + try { + RelationalColumn col = find(RelationalColumn.class, child, table, allRefs); + if(col!=null) { + index.getColumns().add(col); + } + } catch (EntityNotFoundException error) { + addProgressMessage(error.getMessage()); + } + } + } + } } } }