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 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; }
/** * Adds a foreign key to the given table. The referenced key may be automatically created if addUniqueConstraint is true. The column names should be in key order. * if reference table is is another schema, they will be resolved during validation. * @param name * @param columnNames * @param referencedColumnNames, may be null to indicate that the primary key should be used. * @param referenceTable - schema qualified reference table name, can be from another schema * @param table * @param addUniqueConstraint - if true, if the referenced table columns do not match with either PK, or FK then a UNIQUE index on reference table is created. * @return * @throws MetadataException */ public ForeignKey addForeignKey(String name, List<String> columnNames, List<String> referencedColumnNames, String referenceTable, Table table) { ForeignKey foreignKey = new ForeignKey(); foreignKey.setParent(table); foreignKey.setColumns(new ArrayList<Column>(columnNames.size())); assignColumns(columnNames, table, foreignKey); foreignKey.setReferenceTableName(referenceTable); foreignKey.setReferenceColumns(referencedColumnNames); foreignKey.setName(name); setUUID(foreignKey); table.getForeignKeys().add(foreignKey); return foreignKey; }
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; }
public static ForeignKey createForeignKey(String name, Table group, List<Column> elements, KeyRecord primaryKey) { ForeignKey key = new ForeignKey(); key.setName(name); for (Column column : elements) { key.addColumn(column); } key.setPrimaryKey(primaryKey); group.getForeignKeys().add(key); return key; }
String referenceTableName = fk.getReferenceTableName(); if (fk.getReferenceKey() == null) { if (referenceTableName == null){ metadataValidator.log(report, model, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31091, t.getFullName())); referenceTableName = fk.getReferenceKey().getParent().getFullName(); List<String> referenceColumns = fk.getReferenceColumns(); if (fk.getReferenceKey() != null) { List<Column> cols = fk.getReferenceKey().getColumns(); referenceColumns = new ArrayList<String>(); for (Column col : cols) { for (int i = 0; i < referenceColumns.size(); i++) { int keyIndex = keyNames.get(referenceColumns.get(i)); reorderedCols.put(keyIndex, fk.getColumns().get(i)); fk.setColumns(new ArrayList<Column>(reorderedCols.values())); fk.setReferenceKey(uniqueKey);
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()); }
navigaton.setNullable(false); } else { for (Column c : fk.getColumns()) { if (c.getNullType() == NullType.No_Nulls) { navigaton.setNullable(false); KeyRecord key = fk.getReferenceKey(); for (int i = 0; i < key.getColumns().size(); i++) { constraints.add(new CsdlReferentialConstraint().setReferencedProperty(key.getColumns().get(i).getName()) .setProperty(fk.getColumns().get(i).getName()));
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); } } } } }
String referenceTableName = fk.getReferenceTableName(); if (fk.getReferenceKey() == null) { if (referenceTableName == null){ metadataValidator.log(report, model, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31091, t.getFullName())); referenceTableName = fk.getReferenceKey().getParent().getFullName(); List<String> referenceColumns = fk.getReferenceColumns(); if (fk.getReferenceKey() != null) { List<Column> cols = fk.getReferenceKey().getColumns(); referenceColumns = new ArrayList<String>(); for (Column col : cols) { fk.setReferenceKey(uniqueKey);
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 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; }
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 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; }
@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 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; }
@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$ } }
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; }
update.setGroup(this.updateTable.getGroupSymbol()); List<String> columnNames = DocumentNode.getColumnNames(this.updateTable.getFk().getColumns()); for (int i = 0; i < columnNames.size(); i++) { Column column = this.updateTable.getFk().getColumns().get(i); String columnName = columnNames.get(i); ElementSymbol symbol = new ElementSymbol(columnName, this.updateTable.getGroupSymbol()); UriParameter parameter = getParameter(this.updateTable.getFk().getReferenceColumns().get(i), this.referenceTable.getKeyPredicates()); value = ODataTypeManager.parseLiteral(edmProperty, column.getJavaType(), parameter.getText());