private static Collection<List<String>> indexCoumnNames(final Table table, final boolean includeUniqueOnly) { final List<List<String>> allIndexCoumns = new ArrayList<>(); if (table instanceof PartialDatabaseObject) { return allIndexCoumns; } final PrimaryKey primaryKey = table.getPrimaryKey(); final List<String> pkColumns = columnNames(primaryKey); allIndexCoumns.add(pkColumns); for (final Index index: table.getIndexes()) { if (includeUniqueOnly && !index.isUnique()) { continue; } final List<String> indexColumns = columnNames(index); allIndexCoumns.add(indexColumns); } return allIndexCoumns; }
public static boolean isForeignKeyUnique(final BaseForeignKey<?> foreignKey) { if (foreignKey == null) { return false; } final ColumnReference columnRef0 = foreignKey.getColumnReferences().get(0); final Table fkTable = columnRef0.getForeignKeyColumn().getParent(); final Collection<List<String>> uniqueIndexCoumnNames = uniqueIndexCoumnNames(fkTable); final List<String> foreignKeyColumnNames = foreignKeyColumnNames(foreignKey); return uniqueIndexCoumnNames.contains(foreignKeyColumnNames); }
public static Collection<List<String>> allIndexCoumnNames(final Table table) { return indexCoumnNames(table, false); }
@Test public void fkUtilities(final TestContext testContext, final Connection connection) throws Exception { final SchemaCrawlerOptionsBuilder schemaCrawlerOptionsBuilder = SchemaCrawlerOptionsBuilder .builder().withSchemaInfoLevel(SchemaInfoLevelBuilder.maximum()); final SchemaCrawlerOptions schemaCrawlerOptions = schemaCrawlerOptionsBuilder .toOptions(); final Catalog catalog = getCatalog(connection, schemaCrawlerOptions); final Schema schema = catalog.lookupSchema("PUBLIC.BOOKS").get(); assertThat("BOOKS Schema not found", schema, notNullValue()); final Table table = catalog.lookupTable(schema, "BOOKS").get(); assertThat("BOOKS Table not found", table, notNullValue()); final ForeignKey fk = table.getForeignKeys().toArray(new ForeignKey[0])[0]; assertThat("Foreign key not found", fk, notNullValue()); final ColumnReference columnReference = fk.getColumnReferences() .toArray(new ColumnReference[0])[0]; assertThat("Column reference not found", columnReference, notNullValue()); assertThat(MetaDataUtility .constructForeignKeyName(columnReference.getForeignKeyColumn(), columnReference.getPrimaryKeyColumn()), is("SC_AA4376_AFD2BA21")); assertThat(MetaDataUtility.findForeignKeyCardinality(fk), is(ForeignKeyCardinality.zero_many)); assertThat(MetaDataUtility.foreignKeyColumnNames(fk), containsInAnyOrder("PUBLIC.BOOKS.BOOKAUTHORS.BOOKID")); }
@Test public void tableUtilities(final TestContext testContext, final Connection connection) throws Exception { final SchemaCrawlerOptionsBuilder schemaCrawlerOptionsBuilder = SchemaCrawlerOptionsBuilder .builder().withSchemaInfoLevel(SchemaInfoLevelBuilder.maximum()); final SchemaCrawlerOptions schemaCrawlerOptions = schemaCrawlerOptionsBuilder .toOptions(); final Catalog catalog = getCatalog(connection, schemaCrawlerOptions); final Schema schema = catalog.lookupSchema("PUBLIC.BOOKS").get(); assertThat("BOOKS Schema not found", schema, notNullValue()); final Table table = catalog.lookupTable(schema, "BOOKS").get(); assertThat("BOOKS Table not found", table, notNullValue()); assertThat(MetaDataUtility.allIndexCoumnNames(table).stream() .flatMap(List::stream).collect(Collectors.toSet()), containsInAnyOrder("PUBLIC.BOOKS.BOOKS.ID", "PUBLIC.BOOKS.BOOKS.PREVIOUSEDITIONID")); assertThat(MetaDataUtility.uniqueIndexCoumnNames(table).stream() .flatMap(List::stream).collect(Collectors.toSet()), containsInAnyOrder("PUBLIC.BOOKS.BOOKS.ID", "PUBLIC.BOOKS.BOOKS.PREVIOUSEDITIONID")); final Index index = table.getIndexes().toArray(new Index[0])[0]; assertThat("Index not found", index, notNullValue()); assertThat(MetaDataUtility.columnNames(index), containsInAnyOrder("PUBLIC.BOOKS.BOOKS.ID")); assertThat(MetaDataUtility.containsGeneratedColumns(index), is(false)); }
private void addWeakAssociation(final WeakAssociation weakAssociation) { final String weakFkName = MetaDataUtility .constructForeignKeyName(weakAssociation.getPrimaryKeyColumn(), weakAssociation.getForeignKeyColumn()); final WeakAssociationForeignKey weakFk = new WeakAssociationForeignKey(weakFkName); weakFk.add(weakAssociation); weakAssociations.add(weakFk); addWeakAssociationToTable(weakAssociation.getPrimaryKeyColumn().getParent(), weakFk); addWeakAssociationToTable(weakAssociation.getForeignKeyColumn().getParent(), weakFk); }
private void printForeignKeys(final Table table, final Collection<? extends BaseForeignKey<?>> foreignKeys) { for (final BaseForeignKey<? extends ColumnReference> foreignKey: foreignKeys) { final ForeignKeyCardinality fkCardinality = findForeignKeyCardinality(foreignKey); for (final ColumnReference columnRef: foreignKey) { final Table referencedTable = columnRef.getForeignKeyColumn() .getParent(); final boolean isForeignKeyFiltered = referencedTable .getAttribute("schemacrawler.table.no_grep_match", false); if (isForeignKeyFiltered) { continue; } final boolean isFkColumnFiltered = referencedTable .getAttribute("schemacrawler.table.filtered_out", false); if (table.equals(columnRef.getPrimaryKeyColumn().getParent())) { formattingHelper.append(printColumnReference(identifiers .quoteName(foreignKey.getName()), columnRef, fkCardinality, isFkColumnFiltered)); } } } }
public static ForeignKeyCardinality findForeignKeyCardinality(final BaseForeignKey<?> foreignKey) { if (foreignKey == null) { return ForeignKeyCardinality.unknown; } final boolean isForeignKeyUnique = isForeignKeyUnique(foreignKey); final ColumnReference columnRef0 = foreignKey.getColumnReferences().get(0); final Column fkColumn = columnRef0.getForeignKeyColumn(); final boolean isColumnReference = fkColumn instanceof PartialDatabaseObject; final ForeignKeyCardinality connectivity; if (isColumnReference) { connectivity = ForeignKeyCardinality.unknown; } else if (isForeignKeyUnique) { connectivity = ForeignKeyCardinality.zero_one; } else { connectivity = ForeignKeyCardinality.zero_many; } return connectivity; }
if (isBlank(foreignKeyName)) specificName = MetaDataUtility.constructForeignKeyName(pkColumn, fkColumn);
.findForeignKeyCardinality(foreignKey); for (final ColumnReference columnReference: foreignKey)
public static ForeignKeyCardinality findForeignKeyCardinality(final BaseForeignKey<?> foreignKey) { if (foreignKey == null) { return ForeignKeyCardinality.unknown; } final boolean isForeignKeyUnique = isForeignKeyUnique(foreignKey); final ColumnReference columnRef0 = foreignKey.getColumnReferences().get(0); final Column fkColumn = columnRef0.getForeignKeyColumn(); final boolean isColumnReference = fkColumn instanceof PartialDatabaseObject; final ForeignKeyCardinality connectivity; if (isColumnReference) { connectivity = ForeignKeyCardinality.unknown; } else if (isForeignKeyUnique) { connectivity = ForeignKeyCardinality.zero_one; } else { connectivity = ForeignKeyCardinality.zero_many; } return connectivity; }
public static boolean isForeignKeyUnique(final BaseForeignKey<?> foreignKey) { if (foreignKey == null) { return false; } final ColumnReference columnRef0 = foreignKey.getColumnReferences().get(0); final Table fkTable = columnRef0.getForeignKeyColumn().getParent(); final Collection<List<String>> uniqueIndexCoumnNames = uniqueIndexCoumnNames(fkTable); final List<String> foreignKeyColumnNames = foreignKeyColumnNames(foreignKey); return uniqueIndexCoumnNames.contains(foreignKeyColumnNames); }
if (isBlank(foreignKeyName)) specificName = MetaDataUtility.constructForeignKeyName(pkColumn, fkColumn);
private void printForeignKeys(final Table table, final Collection<? extends BaseForeignKey<?>> foreignKeys) { for (final BaseForeignKey<? extends ColumnReference> foreignKey: foreignKeys) { final ForeignKeyCardinality fkCardinality = findForeignKeyCardinality(foreignKey); for (final ColumnReference columnRef: foreignKey) { final Table referencedTable = columnRef.getForeignKeyColumn() .getParent(); final boolean isForeignKeyFiltered = referencedTable .getAttribute("schemacrawler.table.no_grep_match", false); if (isForeignKeyFiltered) { continue; } final boolean isFkColumnFiltered = referencedTable .getAttribute("schemacrawler.table.filtered_out", false); if (table.equals(columnRef.getPrimaryKeyColumn().getParent())) { formattingHelper.append(printColumnReference(identifiers .quoteName(foreignKey.getName()), columnRef, fkCardinality, isFkColumnFiltered)); } } } }
public static Collection<List<String>> uniqueIndexCoumnNames(final Table table) { return indexCoumnNames(table, true); }
private static Collection<List<String>> indexCoumnNames(final Table table, final boolean includeUniqueOnly) { final List<List<String>> allIndexCoumns = new ArrayList<>(); if (table instanceof PartialDatabaseObject) { return allIndexCoumns; } final PrimaryKey primaryKey = table.getPrimaryKey(); final List<String> pkColumns = columnNames(primaryKey); allIndexCoumns.add(pkColumns); for (final Index index: table.getIndexes()) { if (includeUniqueOnly && !index.isUnique()) { continue; } final List<String> indexColumns = columnNames(index); allIndexCoumns.add(indexColumns); } return allIndexCoumns; }
public static ForeignKeyCardinality findForeignKeyCardinality(final BaseForeignKey<?> foreignKey) { if (foreignKey == null) { return ForeignKeyCardinality.unknown; } final boolean isForeignKeyUnique = isForeignKeyUnique(foreignKey); final ColumnReference columnRef0 = foreignKey.getColumnReferences().get(0); final Column fkColumn = columnRef0.getForeignKeyColumn(); final boolean isColumnReference = fkColumn instanceof PartialDatabaseObject; final ForeignKeyCardinality connectivity; if (isColumnReference) { connectivity = ForeignKeyCardinality.unknown; } else if (isForeignKeyUnique) { connectivity = ForeignKeyCardinality.zero_one; } else { connectivity = ForeignKeyCardinality.zero_many; } return connectivity; }
public static boolean isForeignKeyUnique(final ForeignKey foreignKey, final Table table) { final Collection<List<String>> uniqueIndexCoumnNames = uniqueIndexCoumnNames(table); final List<String> foreignKeyColumnNames = foreignKeyColumnNames(foreignKey); return uniqueIndexCoumnNames.contains(foreignKeyColumnNames); }
private void addWeakAssociation(final WeakAssociation weakAssociation) { final String weakFkName = MetaDataUtility .constructForeignKeyName(weakAssociation.getPrimaryKeyColumn(), weakAssociation.getForeignKeyColumn()); final WeakAssociationForeignKey weakFk = new WeakAssociationForeignKey(weakFkName); weakFk.add(weakAssociation); weakAssociations.add(weakFk); addWeakAssociationToTable(weakAssociation.getPrimaryKeyColumn().getParent(), weakFk); addWeakAssociationToTable(weakAssociation.getForeignKeyColumn().getParent(), weakFk); }
private void printForeignKeys(final Table table, final Collection<? extends BaseForeignKey<?>> foreignKeys) { for (final BaseForeignKey<? extends ColumnReference> foreignKey: foreignKeys) { final ForeignKeyCardinality fkCardinality = findForeignKeyCardinality(foreignKey); for (final ColumnReference columnRef: foreignKey) { final Table referencedTable = columnRef.getForeignKeyColumn() .getParent(); final boolean isForeignKeyFiltered = referencedTable .getAttribute("schemacrawler.table.no_grep_match", false); if (isForeignKeyFiltered) { continue; } final boolean isFkColumnFiltered = referencedTable .getAttribute("schemacrawler.table.filtered_out", false); if (table.equals(columnRef.getPrimaryKeyColumn().getParent())) { formattingHelper.append(printColumnReference(identifiers .quoteName(foreignKey.getName()), columnRef, fkCardinality, isFkColumnFiltered)); } } } }