package liquibase.ext.spatial.change; import java.util.ArrayList; import java.util.Collection; import liquibase.change.AbstractChange; import liquibase.change.ChangeMetaData; import liquibase.change.DatabaseChange; import liquibase.change.DatabaseChangeProperty; import liquibase.database.Database; import liquibase.database.core.DerbyDatabase; import liquibase.database.core.H2Database; import liquibase.database.core.MySQLDatabase; import liquibase.database.core.PostgresDatabase; import liquibase.ext.spatial.statement.DropSpatialIndexStatement; import liquibase.ext.spatial.xml.XmlConstants; import liquibase.statement.SqlStatement; import liquibase.statement.core.DropIndexStatement; import liquibase.util.StringUtils; /** * @author Lonny Jacobson */ @DatabaseChange(name = "dropSpatialIndex", description = "Drops the spatial index on an existing column or set of columns.", priority = ChangeMetaData.PRIORITY_DEFAULT, appliesTo = "index") public class DropSpatialIndexChange extends AbstractChange { /** The name of the catalog. */ private String catalogName; /** The name of the schema. */ private String schemaName; /** The name of the indexed table. */ private String tableName; /** The name of the index to drop. */ private String indexName; @DatabaseChangeProperty(mustEqualExisting = "index.schema") public String getSchemaName() { return this.schemaName; } public void setSchemaName(final String schemaName) { this.schemaName = schemaName; } @DatabaseChangeProperty(mustEqualExisting = "index", description = "Name of the index to drop", requiredForDatabase = "mysql, oracle, postgresql") public String getIndexName() { return this.indexName; } public void setIndexName(final String indexName) { this.indexName = indexName; } @DatabaseChangeProperty(mustEqualExisting = "index.table", description = "Name fo the indexed table.", requiredForDatabase = "h2, derby") public String getTableName() { return this.tableName; } public void setTableName(final String tableName) { this.tableName = tableName; } @DatabaseChangeProperty(mustEqualExisting = "index.catalog") public String getCatalogName() { return this.catalogName; } public void setCatalogName(final String catalogName) { this.catalogName = catalogName; } @Override public String getSerializedObjectNamespace() { return XmlConstants.SPATIAL_CHANGELOG_NAMESPACE; } @Override public String getConfirmationMessage() { final StringBuilder message = new StringBuilder("Spatial index"); if (StringUtils.trimToNull(getIndexName()) != null) { message.append(' ').append(getIndexName().trim()); } message.append(" dropped"); if (StringUtils.trimToNull(getTableName()) != null) { message.append(" from ").append(getTableName().trim()); } return message.toString(); } /** * Generates a {@link DropSpatialIndexStatement} followed by a {@link DropIndexStatement}, if * applicable. The first statement allows extra clean-up when dropping an index. The second * statement leverages the normal <code>DROP INDEX</code> logic. */ @Override public SqlStatement[] generateStatements(final Database database) { final Collection<SqlStatement> statements = new ArrayList<SqlStatement>(); // MySQL and PostgreSQL only need the normal DROP INDEX statement. if (!(database instanceof MySQLDatabase) && !(database instanceof PostgresDatabase)) { final DropSpatialIndexStatement dropSpatialIndex = new DropSpatialIndexStatement( this.indexName, this.catalogName, this.schemaName, this.tableName); statements.add(dropSpatialIndex); } // GeoDB doesn't use a tradition index structure so don't issue the normal DROP INDEX // statement. if (!(database instanceof DerbyDatabase) && !(database instanceof H2Database)) { final DropIndexStatement dropIndex = new DropIndexStatement(this.indexName, this.catalogName, this.schemaName, this.tableName, null); statements.add(dropIndex); } return statements.toArray(new SqlStatement[statements.size()]); } }