package liquibase.ext.spatial.sqlgenerator;
import liquibase.database.Database;
import liquibase.database.core.DerbyDatabase;
import liquibase.database.core.H2Database;
import liquibase.exception.UnexpectedLiquibaseException;
import liquibase.exception.ValidationErrors;
import liquibase.ext.spatial.preconditions.SpatialIndexExistsPrecondition;
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.DatabaseObject;
import liquibase.structure.core.Table;
/**
* <code>DropSpatialIndexGeneratorGeoDB</code> ...
*/
public class DropSpatialIndexGeneratorGeoDB
extends AbstractSqlGenerator<DropSpatialIndexStatement> {
/**
* @see liquibase.sqlgenerator.core.AbstractSqlGenerator#supports(liquibase.statement.SqlStatement,
* liquibase.database.Database)
*/
@Override
public boolean supports(final DropSpatialIndexStatement statement,
final Database database) {
return database instanceof DerbyDatabase || database instanceof H2Database;
}
/**
* Ensures that the table name is populated.
*/
@Override
public ValidationErrors validate(final DropSpatialIndexStatement statement,
final Database database, final SqlGeneratorChain sqlGeneratorChain) {
final ValidationErrors validationErrors = new ValidationErrors();
validationErrors.checkRequiredField("tableName", statement.getTableName());
return validationErrors;
}
@Override
public Sql[] generateSql(final DropSpatialIndexStatement statement,
final Database database, final SqlGeneratorChain sqlGeneratorChain) {
final String catalogName = statement.getTableCatalogName();
String schemaName = statement.getTableSchemaName();
if (schemaName == null) {
schemaName = database.getDefaultSchemaName();
}
final StringBuilder sql = new StringBuilder("CALL ");
sql.append(schemaName).append(".DropSpatialIndex(");
// Add the schema name parameter.
sql.append("'").append(database.escapeStringForDatabase(schemaName)).append("'");
sql.append(", ");
// Add the table name parameter.
final String tableName = statement.getTableName();
sql.append("'").append(database.escapeStringForDatabase(tableName)).append("'");
sql.append(')');
final Table hatboxTable = new Table().setName(tableName + "_HATBOX");
hatboxTable.setSchema(catalogName, schemaName);
final UnparsedSql spatialize = new UnparsedSql(sql.toString(), hatboxTable);
return new Sql[] { spatialize };
}
/**
* Generates the SQL statement to drop the spatial index if it exists.
*
* @param statement
* the drop spatial index statement.
* @param database
* the database.
* @return the drop spatial index statement, if the index exists.
*/
public Sql[] generateSqlIfExists(final DropSpatialIndexStatement statement,
final Database database) {
final String catalogName = statement.getTableCatalogName();
final String schemaName = statement.getTableSchemaName();
final String tableName = statement.getTableName();
final SpatialIndexExistsPrecondition precondition = new SpatialIndexExistsPrecondition();
precondition.setCatalogName(catalogName);
precondition.setSchemaName(schemaName);
precondition.setTableName(tableName);
final DatabaseObject example = precondition.getExample(database, tableName);
try {
// If a spatial index exists on the table, drop it.
if (SnapshotGeneratorFactory.getInstance().has(example, database)) {
return generateSql(statement, database, null);
}
} catch (final Exception e) {
throw new UnexpectedLiquibaseException(e);
}
return new Sql[0];
}
}