Search in sources :

Example 41 with Column

use of liquibase.structure.core.Column in project liquibase by liquibase.

the class ForeignKeyComparator method isSameObject.

@Override
public boolean isSameObject(DatabaseObject databaseObject1, DatabaseObject databaseObject2, Database accordingTo, DatabaseObjectComparatorChain chain) {
    if (!((databaseObject1 instanceof ForeignKey) && (databaseObject2 instanceof ForeignKey))) {
        return false;
    }
    ForeignKey thisForeignKey = (ForeignKey) databaseObject1;
    ForeignKey otherForeignKey = (ForeignKey) databaseObject2;
    if ((thisForeignKey.getPrimaryKeyTable() == null) || (thisForeignKey.getForeignKeyTable() == null) || (otherForeignKey.getPrimaryKeyTable() == null) || (otherForeignKey.getForeignKeyTable() == null)) {
        if (thisForeignKey.getForeignKeyTable() != null && otherForeignKey.getForeignKeyTable() != null) {
            // FK names are not necessarily unique across all tables, so first check if FK tables are different
            if (!chain.isSameObject(thisForeignKey.getForeignKeyTable(), otherForeignKey.getForeignKeyTable(), accordingTo)) {
                return false;
            }
        }
        if ((thisForeignKey.getName() != null) && (otherForeignKey.getName() != null)) {
            if (accordingTo.isCaseSensitive()) {
                return thisForeignKey.getName().equals(otherForeignKey.getName());
            } else {
                return thisForeignKey.getName().equalsIgnoreCase(otherForeignKey.getName());
            }
        } else {
            return false;
        }
    }
    if ((thisForeignKey.getForeignKeyColumns() != null) && (thisForeignKey.getPrimaryKeyColumns() != null) && (otherForeignKey.getForeignKeyColumns() != null) && (otherForeignKey.getPrimaryKeyColumns() != null)) {
        boolean columnsTheSame;
        StringUtil.StringUtilFormatter<Column> formatter = obj -> obj.toString(false);
        if (accordingTo.isCaseSensitive()) {
            columnsTheSame = StringUtil.join(thisForeignKey.getForeignKeyColumns(), ",", formatter).equals(StringUtil.join(otherForeignKey.getForeignKeyColumns(), ",", formatter)) && StringUtil.join(thisForeignKey.getPrimaryKeyColumns(), ",", formatter).equals(StringUtil.join(otherForeignKey.getPrimaryKeyColumns(), ",", formatter));
        } else {
            columnsTheSame = StringUtil.join(thisForeignKey.getForeignKeyColumns(), ",", formatter).equalsIgnoreCase(StringUtil.join(otherForeignKey.getForeignKeyColumns(), ",", formatter)) && StringUtil.join(thisForeignKey.getPrimaryKeyColumns(), ",", formatter).equalsIgnoreCase(StringUtil.join(otherForeignKey.getPrimaryKeyColumns(), ",", formatter));
        }
        return columnsTheSame && DatabaseObjectComparatorFactory.getInstance().isSameObject(thisForeignKey.getForeignKeyTable(), otherForeignKey.getForeignKeyTable(), chain.getSchemaComparisons(), accordingTo) && DatabaseObjectComparatorFactory.getInstance().isSameObject(thisForeignKey.getPrimaryKeyTable(), otherForeignKey.getPrimaryKeyTable(), chain.getSchemaComparisons(), accordingTo);
    }
    return false;
}
Also used : DatabaseObjectComparator(liquibase.diff.compare.DatabaseObjectComparator) DatabaseObjectComparatorFactory(liquibase.diff.compare.DatabaseObjectComparatorFactory) DatabaseObjectComparatorChain(liquibase.diff.compare.DatabaseObjectComparatorChain) DatabaseObject(liquibase.structure.DatabaseObject) Column(liquibase.structure.core.Column) CompareControl(liquibase.diff.compare.CompareControl) ForeignKey(liquibase.structure.core.ForeignKey) Set(java.util.Set) Database(liquibase.database.Database) ObjectDifferences(liquibase.diff.ObjectDifferences) StringUtil(liquibase.util.StringUtil) Table(liquibase.structure.core.Table) Column(liquibase.structure.core.Column) ForeignKey(liquibase.structure.core.ForeignKey) StringUtil(liquibase.util.StringUtil)

Example 42 with Column

use of liquibase.structure.core.Column in project liquibase by liquibase.

the class AddUniqueConstraintGenerator method getAffectedUniqueConstraint.

protected UniqueConstraint getAffectedUniqueConstraint(AddUniqueConstraintStatement statement) {
    UniqueConstraint uniqueConstraint = new UniqueConstraint().setName(statement.getConstraintName()).setRelation((Table) new Table().setName(statement.getTableName()).setSchema(statement.getCatalogName(), statement.getSchemaName()));
    int i = 0;
    for (Column column : Column.listFromNames(statement.getColumnNames())) {
        uniqueConstraint.addColumn(i++, column);
    }
    return uniqueConstraint;
}
Also used : Table(liquibase.structure.core.Table) Column(liquibase.structure.core.Column) UniqueConstraint(liquibase.structure.core.UniqueConstraint) UniqueConstraint(liquibase.structure.core.UniqueConstraint)

Example 43 with Column

use of liquibase.structure.core.Column in project liquibase by liquibase.

the class UniqueConstraintSnapshotGenerator method snapshotObject.

@Override
protected DatabaseObject snapshotObject(DatabaseObject example, DatabaseSnapshot snapshot) throws DatabaseException {
    Database database = snapshot.getDatabase();
    UniqueConstraint exampleConstraint = (UniqueConstraint) example;
    Relation table = exampleConstraint.getRelation();
    List<Map<String, ?>> metadata = listColumns(exampleConstraint, database, snapshot);
    if (metadata.isEmpty()) {
        return null;
    }
    UniqueConstraint constraint = new UniqueConstraint();
    constraint.setRelation(table);
    constraint.setName(example.getName());
    constraint.setBackingIndex(exampleConstraint.getBackingIndex());
    constraint.setInitiallyDeferred(((UniqueConstraint) example).isInitiallyDeferred());
    constraint.setDeferrable(((UniqueConstraint) example).isDeferrable());
    constraint.setClustered(((UniqueConstraint) example).isClustered());
    for (Map<String, ?> col : metadata) {
        String ascOrDesc = (String) col.get("ASC_OR_DESC");
        Boolean descending = "D".equals(ascOrDesc) ? Boolean.TRUE : ("A".equals(ascOrDesc) ? Boolean.FALSE : null);
        if (database instanceof H2Database) {
            for (String columnName : StringUtil.splitAndTrim((String) col.get("COLUMN_NAME"), ",")) {
                constraint.getColumns().add(new Column(columnName).setDescending(descending).setRelation(table));
            }
        } else {
            constraint.getColumns().add(new Column((String) col.get("COLUMN_NAME")).setDescending(descending).setRelation(table));
        }
        setValidateOptionIfAvailable(database, constraint, col);
    }
    return constraint;
}
Also used : Relation(liquibase.structure.core.Relation) Column(liquibase.structure.core.Column) Database(liquibase.database.Database) UniqueConstraint(liquibase.structure.core.UniqueConstraint) HashMap(java.util.HashMap) Map(java.util.Map)

Aggregations

Column (liquibase.structure.core.Column)43 Table (liquibase.structure.core.Table)22 Change (liquibase.change.Change)8 SnapshotControl (liquibase.snapshot.SnapshotControl)8 Index (liquibase.structure.core.Index)8 DatabaseSnapshot (liquibase.snapshot.DatabaseSnapshot)7 DatabaseObject (liquibase.structure.DatabaseObject)6 Test (org.junit.Test)6 DatabaseException (liquibase.exception.DatabaseException)5 SqlStatement (liquibase.statement.SqlStatement)5 Schema (liquibase.structure.core.Schema)5 UniqueConstraint (liquibase.structure.core.UniqueConstraint)5 ArrayList (java.util.ArrayList)4 MSSQLDatabase (liquibase.database.core.MSSQLDatabase)4 UnexpectedLiquibaseException (liquibase.exception.UnexpectedLiquibaseException)4 CatalogAndSchema (liquibase.CatalogAndSchema)3 Liquibase (liquibase.Liquibase)3 AbstractIntegrationTest (liquibase.dbtest.AbstractIntegrationTest)3 RawSqlStatement (liquibase.statement.core.RawSqlStatement)3 PrimaryKey (liquibase.structure.core.PrimaryKey)3