boolean isCompositeForeignKey(String columnName) { for (ForeignKey fk : this.table.getForeignKeys()) { for (Column column : fk.getColumns()) { if (column.getName().equals(columnName)) { return fk.getColumns().size() > 1; } } } return false; }
boolean isPartOfForeignKey(String columnName) { for (ForeignKey fk : this.table.getForeignKeys()) { for (Column column : fk.getColumns()) { if (column.getName().equals(columnName)) { return true; } } } return false; }
static boolean isPartOfForeignKey(Table table, String columnName) { for (ForeignKey fk : table.getForeignKeys()) { for (Column column : fk.getColumns()) { if (column.getName().equals(columnName)) { return true; } } } return false; }
static String getForeignKeyRefTable(Table table, String columnName) { for (ForeignKey fk : table.getForeignKeys()) { for (Column column : fk.getColumns()) { if (column.getName().equals(columnName)) { return fk.getReferenceTableName(); } } } return null; }
private boolean foreignKeyExists(List<String> keys, Table forignTable) { boolean fkExists = false; for (ForeignKey fk:forignTable.getForeignKeys()) { boolean allKeysFound = true; for (String key:keys) { boolean keyfound = false; for (Column col:fk.getColumns()) { if (col.getName().equals(key)) { keyfound = true; break; } } if (!keyfound) { allKeysFound = false; break; } } if (allKeysFound) { fkExists = true; break; } } return fkExists; }
private void removeParentKey(MongoDocument document, BasicDBObject row) throws TranslatorException { Table source = document.getTable(); Table target = document.getMergeTable(); for (ForeignKey fk:source.getForeignKeys()) { if (fk.getReferenceTableName().equals(target.getName())){ for (int i = 0; i < fk.getColumns().size(); i++) { if (row != null) { row.remove(fk.getColumns().get(i).getName()); } } } } }
static Column normalizePseudoColumn(RuntimeMetadata metadata, Column column) throws TranslatorException { if (ODataMetadataProcessor.isPseudo(column)) { Table table = (Table)column.getParent(); ForeignKey fk = table.getForeignKeys().get(0); for (int i = 0; i < fk.getColumns().size(); i++) { Column c = fk.getColumns().get(i); if (c.getName().equals(column.getName())) { String refColumn = fk.getReferenceColumns().get(i); String tableName = fk.getReferenceTableName(); if (tableName.indexOf('.') == -1) { tableName = fk.getReferenceKey().getParent().getFullName(); } Table refTable = metadata.getTable(tableName); return refTable.getColumnByName(refColumn); } } } return column; }
private void buildKeyColumns(Table parentTable, Table childTable, String columnName, Object value) { if(parentTable.equals(childTable)) { return; } for (ForeignKey fk:childTable.getForeignKeys()) { if (fk.getReferenceTableName().equals(parentTable.getName())) { List<Column> columns = fk.getColumns(); for (int i = 0; i < columns.size(); i++) { Column fkColumn = columns.get(i); if (fkColumn.getName().equals(columnName)) { this.keys.put(fk.getReferenceColumns().get(i), value); } } } } if (!this.expandTables.isEmpty()) { if (childTable.getPrimaryKey() != null) { for (Column column:childTable.getPrimaryKey().getColumns()) { if (!isPseudo(column)) { if (column.getName().equals(columnName)) { this.expandKeys.put(columnName, value); } } } } } }
private static CsdlNavigationProperty buildReverseNavigation(Table table, ForeignKey fk) { String refSchemaName = table.getParent().getName(); CsdlNavigationProperty navigaton = new CsdlNavigationProperty(); navigaton.setName(table.getName() + "_" + fk.getName()).setType( new FullQualifiedName(refSchemaName, table.getName())); ArrayList<CsdlReferentialConstraint> constrainsts = new ArrayList<CsdlReferentialConstraint>(); for (int i = 0; i < fk.getColumns().size(); i++) { Column c = fk.getColumns().get(i); String refColumn = fk.getReferenceColumns().get(i); CsdlReferentialConstraint constraint = new CsdlReferentialConstraint(); constraint.setProperty(refColumn); constraint.setReferencedProperty(c.getName()); } navigaton.setReferentialConstraints(constrainsts); return navigaton; }
private static CsdlNavigationProperty buildNavigation(ForeignKey fk) { String refSchemaName = fk.getReferenceKey().getParent().getParent().getName(); CsdlNavigationProperty navigaton = new CsdlNavigationProperty(); navigaton.setName(fk.getName()).setType(new FullQualifiedName(refSchemaName, fk.getReferenceTableName())); ArrayList<CsdlReferentialConstraint> constrainsts = new ArrayList<CsdlReferentialConstraint>(); for (int i = 0; i < fk.getColumns().size(); i++) { Column c = fk.getColumns().get(i); String refColumn = fk.getReferenceColumns().get(i); CsdlReferentialConstraint constraint = new CsdlReferentialConstraint(); constraint.setProperty(c.getName()); constraint.setReferencedProperty(refColumn); } navigaton.setReferentialConstraints(constrainsts); return navigaton; }
private void buildForeignKeyReferences() throws TranslatorException { for (ForeignKey fk:this.table.getForeignKeys()) { MergeDetails key = new MergeDetails(this); key.setParentTable(fk.getReferenceTableName()); key.setEmbeddedTable(this.table.getName()); key.setName(fk.getName()); key.setColumns(MongoDBSelectVisitor.getColumnNames(fk.getColumns())); key.setReferenceColumns(fk.getReferenceColumns()); this.foreignKeys.put(MongoDBSelectVisitor.getColumnNames(fk.getColumns()), key); } }
private static Criteria buildCriteria(DocumentNode from, DocumentNode to, ForeignKey fk) { List<String> fkColumns = DocumentNode.getColumnNames(fk.getColumns()); if (fkColumns == null) { fkColumns = DocumentNode.getColumnNames(getPKColumns(from.getTable())); } List<String> pkColumns = DocumentNode.getColumnNames(fk.getReferenceKey().getColumns()); Criteria criteria = DocumentNode.buildJoinCriteria( from.getGroupSymbol(), to.getGroupSymbol(), pkColumns, fkColumns); return criteria; }
@Test public void testFK() throws Exception { String ddl = "CREATE FOREIGN TABLE G1(g1e1 integer, g1e2 varchar, PRIMARY KEY(g1e1, g1e2));\n" + "CREATE FOREIGN TABLE G2( g2e1 integer, g2e2 varchar, " + "FOREIGN KEY (g2e1, g2e2) REFERENCES G1 (g1e1, g1e2) options (\"teiid_rel:allow-join\" true))"; Schema s = helpParse(ddl, "model").getSchema(); Map<String, Table> tableMap = s.getTables(); assertEquals(2, tableMap.size()); assertTrue("Table not found", tableMap.containsKey("G1")); assertTrue("Table not found", tableMap.containsKey("G2")); Table table = tableMap.get("G2"); ForeignKey fk = table.getForeignKeys().get(0); assertEquals(Boolean.TRUE.toString(), fk.getProperty(ForeignKey.ALLOW_JOIN, false)); assertEquals(fk.getColumns(), table.getColumns()); assertEquals("G1", fk.getReferenceTableName()); }
private void buildEmbeddedReferences() throws TranslatorException { for (ForeignKey fk:this.table.getForeignKeys()) { Table referenceTable = fk.getReferenceKey().getParent(); MongoDocument refereceDoc = new MongoDocument(referenceTable, this.metadata); if (refereceDoc.isEmbeddable()) { // if this table itself is merged into embedded; then skip it if (isMerged() && getMergeTable().getName().equals(referenceTable.getName())) { // avoid self inclusion continue; } MergeDetails key = new MergeDetails(this); key.setName(fk.getReferenceTableName()); key.setParentTable(this.table.getName()); key.setReferenceColumns(MongoDBSelectVisitor.getColumnNames(fk.getColumns())); key.setColumns(fk.getReferenceColumns()); key.setEmbeddedTable(fk.getReferenceTableName()); // if the primary is reference, then it needs to built as such during the fetch if (MongoDBSelectVisitor.isPartOfForeignKey(referenceTable, fk.getReferenceColumns().get(0))) { key.setIdReference(MongoDBSelectVisitor.getForeignKeyRefTable(referenceTable, fk.getReferenceColumns().get(0))); } this.embeddedKeys.add(key); } } }
private void buildEmbeddableIntoReferences() { // if this table is marked as "embeddable", figure out all the tables it is // copied in. if (isEmbeddable()) { for (Table t:this.table.getParent().getTables().values()) { for (ForeignKey fk:t.getForeignKeys()) { if (fk.getReferenceKey().getParent().equals(this.table)){ MergeDetails key = new MergeDetails(this); key.setName(this.table.getName()); key.setParentTable(t.getName()); key.setEmbeddedTable(this.table.getName()); key.setColumns(MongoDBSelectVisitor.getColumnNames(fk.getColumns())); key.setReferenceColumns(fk.getReferenceColumns()); key.setAssociation(Association.ONE); this.copyto.add(key); } } } } }
@Test public void testOptionalFKFail() throws Exception { String ddl = "CREATE FOREIGN TABLE G1(g1e1 integer, g1e2 varchar);\n" + "CREATE FOREIGN TABLE G2( g2e1 integer, g2e2 varchar, PRIMARY KEY(g2e1, g2e2)," + "FOREIGN KEY (g2e1, g2e2) REFERENCES G1)"; MetadataFactory s = helpParse(ddl, "model"); Map<String, Table> tableMap = s.getSchema().getTables(); assertEquals(2, tableMap.size()); assertTrue("Table not found", tableMap.containsKey("G1")); assertTrue("Table not found", tableMap.containsKey("G2")); Table table = tableMap.get("G2"); ForeignKey fk = table.getForeignKeys().get(0); assertEquals(fk.getColumns(), table.getColumns()); assertEquals("G1", fk.getReferenceTableName()); VDBMetaData vdb = new VDBMetaData(); vdb.setName("myVDB"); //$NON-NLS-1$ ModelMetaData modelOne = new ModelMetaData(); modelOne.setName("model"); //$NON-NLS-1$ vdb.addModel(modelOne); ValidatorReport report = new MetadataValidator().validate(vdb, s.asMetadataStore()); assertTrue(report.hasItems()); }
@Test public void testCrossReferenceFKReferenceOrder() throws Exception { String ddl = "CREATE FOREIGN TABLE G1(g1e1 integer, g1e2 integer, PRIMARY KEY(g1e1, g1e2));"; String ddl2 = "CREATE FOREIGN TABLE G2( g2e1 integer, g2e2 integer, PRIMARY KEY(g2e1, g2e2), FOREIGN KEY (g2e1, g2e2) REFERENCES pm1.G1(g1e2, g1e1))"; buildModel("pm1", true, this.vdb, this.store, ddl); buildModel("pm2", true, this.vdb, this.store, ddl2); buildTransformationMetadata(); ValidatorReport report = new ValidatorReport(); report = new MetadataValidator().validate(this.vdb, this.store); assertFalse(printError(report), report.hasItems()); assertNotNull(this.store.getSchema("pm2").getTable("G2").getForeignKeys().get(0).getReferenceKey()); assertEquals(2, this.store.getSchema("pm2").getTable("G2").getForeignKeys().get(0).getReferenceKey().getColumns().size()); assertEquals("g1e1", this.store.getSchema("pm2").getTable("G2").getForeignKeys().get(0).getReferenceKey().getColumns().get(0).getName()); assertEquals("g2e2", this.store.getSchema("pm2").getTable("G2").getForeignKeys().get(0).getColumns().get(0).getName()); }
@Test public void testOptionalFK() throws Exception { String ddl = "CREATE FOREIGN TABLE G1(g1e1 integer, g1e2 varchar, PRIMARY KEY(g1e1, g1e2));\n" + "CREATE FOREIGN TABLE G2( g2e1 integer, g2e2 varchar, PRIMARY KEY(g2e1, g2e2)," + "FOREIGN KEY (g2e1, g2e2) REFERENCES G1)"; MetadataFactory s = helpParse(ddl, "model"); Map<String, Table> tableMap = s.getSchema().getTables(); assertEquals(2, tableMap.size()); assertTrue("Table not found", tableMap.containsKey("G1")); assertTrue("Table not found", tableMap.containsKey("G2")); Table table = tableMap.get("G2"); ForeignKey fk = table.getForeignKeys().get(0); assertEquals(fk.getColumns(), table.getColumns()); assertEquals("G1", fk.getReferenceTableName()); VDBMetaData vdb = new VDBMetaData(); vdb.setName("myVDB"); //$NON-NLS-1$ ModelMetaData modelOne = new ModelMetaData(); modelOne.setName("model"); //$NON-NLS-1$ vdb.addModel(modelOne); ValidatorReport report = new MetadataValidator().validate(vdb, s.asMetadataStore()); assertFalse(report.hasItems()); assertEquals(fk.getReferenceKey().getColumns(), tableMap.get("G1").getColumns()); }
key.setName(this.table.getName()); key.setParentTable(mergeTable.getName()); key.setColumns(MongoDBSelectVisitor.getColumnNames(fk.getColumns())); key.setReferenceColumns(fk.getReferenceColumns()); key.setEmbeddedTable(this.table.getName()); if (this.table.getPrimaryKey() != null && sameKeys(MongoDBSelectVisitor.getColumnNames(fk.getColumns()), MongoDBSelectVisitor.getColumnNames(this.table.getPrimaryKey().getColumns()))) { key.setAssociation(Association.ONE);
assertEquals(fk.getColumns(), table.getColumns()); assertEquals("G1", fk.getReferenceTableName());