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 boolean isParentOf(NamedTable parent, NamedTable child) { String[] splits = child.getName().split("\\."); String correlation = splits[0]; String attrName = splits[1]; if (!parent.getCorrelationName().equals(correlation)) { return false; } for (ForeignKey fk:parent.getMetadataObject().getForeignKeys()){ if (fk.getReferenceKey().getParent().equals(child.getMetadataObject())) { return true; } } return false; }
private static CsdlNavigationPropertyBinding buildNavigationBinding(ForeignKey fk, SchemaResolver resolver) { CsdlNavigationPropertyBinding navigationBinding = new CsdlNavigationPropertyBinding(); navigationBinding.setPath(fk.getName()); if (!fk.getParent().getParent().equals(fk.getReferenceKey().getParent().getParent())) { ODataSchemaInfo schema = resolver.getSchemaInfo(fk.getReferenceKey().getParent().getParent().getName()); if (schema == null) { return null; } navigationBinding.setTarget(fk.getReferenceKey().getParent().getFullName()); } else { navigationBinding.setTarget(fk.getReferenceKey().getParent().getName()); } return navigationBinding; }
private boolean isKeyVisible(KeyRecord record, CommandContext cc) { if (record instanceof ForeignKey && !cc.getAuthorizationValidator().isAccessible(((ForeignKey)record).getReferenceKey(), cc)) { return false; } for (Column c : record.getColumns()) { if (!cc.getAuthorizationValidator().isAccessible(c, cc)) { return false; } } return true; }
private boolean isKeyVisible(KeyRecord record, CommandContext cc) { if (record instanceof ForeignKey && !cc.getAuthorizationValidator().isAccessible(((ForeignKey)record).getReferenceKey(), cc)) { return false; } for (Column c : record.getColumns()) { if (!cc.getAuthorizationValidator().isAccessible(c, cc)) { return false; } } return true; }
private boolean isKeyVisible(KeyRecord record, CommandContext cc) { if (record instanceof ForeignKey && !cc.getAuthorizationValidator().isAccessible(((ForeignKey)record).getReferenceKey(), cc)) { return false; } for (Column c : record.getColumns()) { if (!cc.getAuthorizationValidator().isAccessible(c, cc)) { return false; } } return true; }
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; }
static Criteria buildJoinCriteria(DocumentNode from, DocumentNode to) { for (ForeignKey fk:from.getTable().getForeignKeys()) { if (fk.getReferenceKey().getParent().equals(to.getTable())) { return buildCriteria(from, to, fk); } } return null; }
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 static CsdlNavigationPropertyBinding buildReverseNavigationBinding(Table table, ForeignKey fk, SchemaResolver resolver) { CsdlNavigationPropertyBinding navigationBinding = new CsdlNavigationPropertyBinding(); navigationBinding.setPath(table.getName()+"_"+fk.getName()); if (!table.getParent().equals(fk.getReferenceKey().getParent().getParent())) { ODataSchemaInfo schema = resolver.getSchemaInfo(fk.getReferenceKey().getParent().getParent().getName()); if (schema == null) { return null; } navigationBinding.setTarget(table.getFullName()); } else { navigationBinding.setTarget(table.getName()); } return navigationBinding; }
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; }
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 testCrossReferenceFKFromUniqueKey() throws Exception { String ddl = "CREATE FOREIGN TABLE G1(g1e1 integer, g1e2 varchar, UNIQUE(g1e2));"; String ddl2 = "CREATE FOREIGN TABLE G2(g2e1 integer, g2e2 varchar, FOREIGN KEY (g2e2) REFERENCES pm1.G1(g1e2))"; 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(1, this.store.getSchema("pm2").getTable("G2").getForeignKeys().get(0).getReferenceKey().getColumns().size()); assertEquals("g1e2", this.store.getSchema("pm2").getTable("G2").getForeignKeys().get(0).getReferenceKey().getColumns().get(0).getName()); }
@Test public void testCrossReferenceFK() throws Exception { String ddl = "CREATE FOREIGN TABLE G1(g1e1 integer, g1e2 varchar, PRIMARY KEY(g1e1, g1e2));"; String ddl2 = "CREATE FOREIGN TABLE G2( g2e1 integer, g2e2 varchar, PRIMARY KEY(g2e1, g2e2), FOREIGN KEY (g2e1, g2e2) REFERENCES pm1.G1(g1e1, g1e2))"; 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()); }
@Test public void testCrossReferenceResoveOptionalFK() throws Exception { String ddl = "CREATE FOREIGN TABLE G1(g1e1 integer, g1e2 varchar, PRIMARY KEY(g1e1, g1e2));"; String ddl2 = "CREATE FOREIGN TABLE G2( g2e1 integer, g2e2 varchar, FOREIGN KEY (g2e1, g2e2) REFERENCES pm1.G1)"; 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()); }
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 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()); }