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 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 Table getComplexTableParentTable(RuntimeMetadata metadata, Table table) throws TranslatorException { for (Column c : table.getColumns()) { if (ODataMetadataProcessor.isPseudo(c)) { ForeignKey fk = table.getForeignKeys().get(0); String tableName = fk.getReferenceTableName(); if (tableName.indexOf('.') == -1) { tableName = fk.getReferenceKey().getParent().getFullName(); } return (Table)metadata.getTable(tableName); } } return table; }
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); } } } } } }
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; }
String entityTypeName = fk.getReferenceTableName(); String entitySchema = fk.getReferenceKey().getParent().getParent().getName();
private static KeyInfo joinFK(Table currentTable, Table referenceTable, EdmNavigationProperty property) { for (ForeignKey fk : currentTable.getForeignKeys()) { String refSchemaName = fk.getReferenceKey().getParent().getParent().getName(); if (!referenceTable.getParent().getName().equals(refSchemaName) || !referenceTable.getName().equals(fk.getReferenceTableName())) { continue; } if (!property.isCollection() && property.getName().equals(fk.getName())) { return new KeyInfo(false, fk); } if (property.getName().equals(currentTable.getName() + "_" + fk.getName())) { //$NON-NLS-1$ return new KeyInfo(true, fk); } } return null; }
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 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 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); } }
@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()); }
@Test public void testReferenceTableName() { Table table = Mockito.mock(Table.class); Mockito.stub(table.getName()).toReturn("table"); //$NON-NLS-1$ KeyRecord pk = Mockito.mock(KeyRecord.class); Mockito.stub(pk.getParent()).toReturn(table); ForeignKey fk = new ForeignKey(); fk.setPrimaryKey(pk); assertEquals("table", fk.getReferenceTableName()); //$NON-NLS-1$ } }
EdmEntitySet.Builder refEntitySet = findEntitySet(edmSchemas, schema.getName(),fk.getReferenceTableName()); EdmEntityType.Builder entityType = findEntityType(edmSchemas, schema.getName(), getEntityTypeName(table, preserveEntityTypeName)); EdmEntityType.Builder refEntityType = findEntityType(edmSchemas, schema.getName(), getEntityTypeName(fk.getPrimaryKey().getParent(), preserveEntityTypeName)); .setRole(fk.getReferenceTableName()) .setType(refEntityType) .setMultiplicity(EdmMultiplicity.ZERO_TO_ONE); erc.setPrincipalRole(fk.getReferenceTableName()); erc.addPrincipalReferences(fk.getReferenceColumns()); erc.setDependentRole(table.getName()); if (!fk.getReferenceTableName().equalsIgnoreCase(table.getName())) { String navigationName = getNavigationName(entityType, fk.getReferenceTableName()); EdmNavigationProperty.Builder nav = EdmNavigationProperty.newBuilder(navigationName); nav.setRelationshipName(fk.getName()); nav.setFromToName(table.getName(), fk.getReferenceTableName()); nav.setRelationship(association); nav.setFromTo(endSelf, endRef); EdmNavigationProperty.Builder refNav = EdmNavigationProperty.newBuilder(navigationName); refNav.setRelationshipName(fk.getName()); refNav.setFromToName(fk.getReferenceTableName(), table.getName()); refNav.setRelationship(association); refNav.setFromTo(endRef, endSelf); .setRoleName(fk.getReferenceTableName()) .setRole(EdmAssociationEnd.newBuilder().setType(refEntityType).setRole(refEntityType.getName()));
@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()); }
String referenceTableName = fk.getReferenceTableName();
private void buildContraints(Table table) { addConstraints(table.getAccessPatterns(), "AP", ACCESSPATTERN); //$NON-NLS-1$ KeyRecord pk = table.getPrimaryKey(); if (pk != null) { addConstraint("PK", PRIMARY_KEY, pk, true); //$NON-NLS-1$ } addConstraints(table.getUniqueKeys(), UNIQUE, UNIQUE); addConstraints(table.getIndexes(), INDEX, INDEX); addConstraints(table.getFunctionBasedIndexes(), INDEX, INDEX); for (int i = 0; i < table.getForeignKeys().size(); i++) { ForeignKey key = table.getForeignKeys().get(i); addConstraint("FK" + i, FOREIGN_KEY, key, false); //$NON-NLS-1$ append(SPACE).append(REFERENCES); if (key.getReferenceKey() != null) { if (key.getReferenceKey().getParent().getParent().equals(key.getParent().getParent())) { append(SPACE).append(new GroupSymbol(key.getReferenceKey().getParent().getName())); } else { append(SPACE).append(new GroupSymbol(key.getReferenceKey().getParent().getFullName())); } } else if (key.getReferenceTableName() != null) { append(SPACE).append(new GroupSymbol(key.getReferenceTableName())); } append(SPACE); addNames(key.getReferenceColumns()); appendOptions(key); } }
private void buildContraints(Table table) { addConstraints(table.getAccessPatterns(), "AP", ACCESSPATTERN); //$NON-NLS-1$ KeyRecord pk = table.getPrimaryKey(); if (pk != null) { addConstraint("PK", PRIMARY_KEY, pk, true); //$NON-NLS-1$ } addConstraints(table.getUniqueKeys(), UNIQUE, UNIQUE); addConstraints(table.getIndexes(), INDEX, INDEX); addConstraints(table.getFunctionBasedIndexes(), INDEX, INDEX); for (int i = 0; i < table.getForeignKeys().size(); i++) { ForeignKey key = table.getForeignKeys().get(i); addConstraint("FK" + i, FOREIGN_KEY, key, false); //$NON-NLS-1$ append(SPACE).append(REFERENCES); if (key.getReferenceKey() != null) { if (key.getReferenceKey().getParent().getParent().equals(key.getParent().getParent())) { append(SPACE).append(new GroupSymbol(key.getReferenceKey().getParent().getName())); } else { append(SPACE).append(new GroupSymbol(key.getReferenceKey().getParent().getFullName())); } } else if (key.getReferenceTableName() != null) { append(SPACE).append(new GroupSymbol(key.getReferenceTableName())); } append(SPACE); addNames(key.getReferenceColumns()); appendOptions(key); } }
private void buildContraints(Table table) { addConstraints(table.getAccessPatterns(), "AP", ACCESSPATTERN); //$NON-NLS-1$ KeyRecord pk = table.getPrimaryKey(); if (pk != null) { addConstraint("PK", PRIMARY_KEY, pk, true); //$NON-NLS-1$ } addConstraints(table.getUniqueKeys(), UNIQUE, UNIQUE); addConstraints(table.getIndexes(), INDEX, INDEX); addConstraints(table.getFunctionBasedIndexes(), INDEX, INDEX); for (int i = 0; i < table.getForeignKeys().size(); i++) { ForeignKey key = table.getForeignKeys().get(i); addConstraint("FK" + i, FOREIGN_KEY, key, false); //$NON-NLS-1$ append(SPACE).append(REFERENCES); if (key.getReferenceKey() != null) { if (key.getReferenceKey().getParent().getParent().equals(key.getParent().getParent())) { append(SPACE).append(new GroupSymbol(key.getReferenceKey().getParent().getName())); } else { append(SPACE).append(new GroupSymbol(key.getReferenceKey().getParent().getFullName())); } } else if (key.getReferenceTableName() != null) { append(SPACE).append(new GroupSymbol(key.getReferenceTableName())); } append(SPACE); addNames(key.getReferenceColumns()); appendOptions(key); } }
@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()); }
ForeignKey fk = table.getForeignKeys().get(0); assertEquals(fk.getColumns(), table.getColumns()); assertEquals("G1", fk.getReferenceTableName());