package liquibase.ext.spatial.sqlgenerator;
import liquibase.database.Database;
import liquibase.database.core.OracleDatabase;
import liquibase.exception.UnexpectedLiquibaseException;
import liquibase.exception.ValidationErrors;
import liquibase.ext.spatial.statement.DropSpatialIndexStatement;
import liquibase.snapshot.SnapshotGeneratorFactory;
import liquibase.sql.Sql;
import liquibase.sql.UnparsedSql;
import liquibase.sqlgenerator.SqlGeneratorChain;
import liquibase.sqlgenerator.core.AbstractSqlGenerator;
import liquibase.structure.core.Column;
import liquibase.structure.core.Index;
import liquibase.structure.core.Table;
import liquibase.structure.core.View;
/**
* <code>DropSpatialIndexGeneratorOracle</code> generates the SQL for cleaning up a spatial index in
* Oracle.
*/
public class DropSpatialIndexGeneratorOracle extends
AbstractSqlGenerator<DropSpatialIndexStatement> {
@Override
public boolean supports(final DropSpatialIndexStatement statement, final Database database) {
return database instanceof OracleDatabase;
}
/**
* Ensures that the index name is populated.
*/
@Override
public ValidationErrors validate(final DropSpatialIndexStatement statement,
final Database database, final SqlGeneratorChain sqlGeneratorChain) {
final ValidationErrors validationErrors = new ValidationErrors();
validationErrors.checkRequiredField("indexName", statement.getIndexName());
return validationErrors;
}
@Override
public Sql[] generateSql(final DropSpatialIndexStatement statement, final Database database,
final SqlGeneratorChain sqlGeneratorChain) {
final String indexName = statement.getIndexName();
final Index example = new Index().setName(indexName);
if (statement.getTableName() != null) {
example.setTable((Table) new Table().setName(statement.getTableName()).setSchema(
statement.getTableCatalogName(), statement.getTableSchemaName()));
}
Index index;
try {
index = SnapshotGeneratorFactory.getInstance().createSnapshot(example, database);
} catch (final Exception e) {
throw new UnexpectedLiquibaseException("Failed to create a snapshot of '" + indexName
+ "'", e);
}
final String tableName = index.getTable().getName();
final Column column = index.getColumns().get(0);
final StringBuilder sql = new StringBuilder();
sql.append("DELETE FROM user_sdo_geom_metadata ");
sql.append("WHERE table_name = '").append(database.correctObjectName(tableName, Table.class));
sql.append("' AND column_name = '").append(
database.correctObjectName(column.getName(), Column.class));
sql.append("'");
final UnparsedSql deleteMetadata = new UnparsedSql(sql.toString(),
new View().setName("user_sdo_geom_metadata"));
return new Sql[] { deleteMetadata };
}
}