1 package liquibase.sqlgenerator.core;
2
3 import java.util.List;
4
5 import liquibase.database.Database;
6 import liquibase.database.core.MSSQLDatabase;
7 import liquibase.database.core.MySQLDatabase;
8 import liquibase.database.core.OracleDatabase;
9 import liquibase.database.structure.Index;
10 import liquibase.exception.ValidationErrors;
11 import liquibase.sql.Sql;
12 import liquibase.sql.UnparsedSql;
13 import liquibase.sqlgenerator.SqlGeneratorChain;
14 import liquibase.statement.core.DropIndexStatement;
15 import liquibase.util.StringUtils;
16
17 public class DropIndexGenerator extends AbstractSqlGenerator<DropIndexStatement> {
18
19 @Override
20 public ValidationErrors validate(DropIndexStatement statement, Database database,
21 SqlGeneratorChain sqlGeneratorChain) {
22 ValidationErrors validationErrors = new ValidationErrors();
23 validationErrors.checkRequiredField("indexName", statement.getIndexName());
24
25 if (database instanceof MySQLDatabase || database instanceof MSSQLDatabase) {
26 validationErrors.checkRequiredField("tableName", statement.getTableName());
27 }
28
29 return validationErrors;
30 }
31
32 @Override
33 public Sql[] generateSql(DropIndexStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
34 List<String> associatedWith = StringUtils.splitAndTrim(statement.getAssociatedWith(), ",");
35 if (associatedWith != null) {
36 if (associatedWith.contains(Index.MARK_PRIMARY_KEY)
37 || associatedWith.contains(Index.MARK_UNIQUE_CONSTRAINT)) {
38 return new Sql[0];
39 } else if (associatedWith.contains(Index.MARK_FOREIGN_KEY)) {
40 if (!(database instanceof OracleDatabase || database instanceof MSSQLDatabase)) {
41 return new Sql[0];
42 }
43 }
44 }
45
46 String schemaName = statement.getTableSchemaName();
47
48 if (database instanceof MySQLDatabase) {
49 return new Sql[] { new UnparsedSql("DROP INDEX " + database.escapeIndexName(null, statement.getIndexName())
50 + " ON " + database.escapeTableName(schemaName, statement.getTableName())) };
51 } else if (database instanceof MSSQLDatabase) {
52 return new Sql[] { new UnparsedSql("DROP INDEX "
53 + database.escapeTableName(schemaName, statement.getTableName()) + "."
54 + database.escapeIndexName(null, statement.getIndexName())) };
55 }
56
57 return new Sql[] { new UnparsedSql("DROP INDEX "
58 + database.escapeIndexName(schemaName, statement.getIndexName())) };
59 }
60 }