| 1 |  |  package liquibase.sqlgenerator.core; | 
  | 2 |  |   | 
  | 3 |  |  import java.util.Arrays; | 
  | 4 |  |  import java.util.Iterator; | 
  | 5 |  |  import java.util.List; | 
  | 6 |  |   | 
  | 7 |  |  import liquibase.database.Database; | 
  | 8 |  |  import liquibase.database.core.DB2Database; | 
  | 9 |  |  import liquibase.database.core.InformixDatabase; | 
  | 10 |  |  import liquibase.database.core.MSSQLDatabase; | 
  | 11 |  |  import liquibase.database.core.OracleDatabase; | 
  | 12 |  |  import liquibase.database.core.SybaseASADatabase; | 
  | 13 |  |  import liquibase.database.structure.Index; | 
  | 14 |  |  import liquibase.exception.ValidationErrors; | 
  | 15 |  |  import liquibase.sql.Sql; | 
  | 16 |  |  import liquibase.sql.UnparsedSql; | 
  | 17 |  |  import liquibase.sqlgenerator.SqlGeneratorChain; | 
  | 18 |  |  import liquibase.statement.core.CreateIndexStatement; | 
  | 19 |  |  import liquibase.util.StringUtils; | 
  | 20 |  |   | 
  | 21 | 25 |  public class CreateIndexGenerator extends AbstractSqlGenerator<CreateIndexStatement> { | 
  | 22 |  |   | 
  | 23 |  |      @Override | 
  | 24 |  |      public ValidationErrors validate(CreateIndexStatement createIndexStatement, Database database, | 
  | 25 |  |              SqlGeneratorChain sqlGeneratorChain) { | 
  | 26 | 15 |          ValidationErrors validationErrors = new ValidationErrors(); | 
  | 27 | 15 |          validationErrors.checkRequiredField("tableName", createIndexStatement.getTableName()); | 
  | 28 | 15 |          validationErrors.checkRequiredField("columns", createIndexStatement.getColumns()); | 
  | 29 | 15 |          return validationErrors; | 
  | 30 |  |      } | 
  | 31 |  |   | 
  | 32 |  |      @Override | 
  | 33 |  |      public Sql[] generateSql(CreateIndexStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { | 
  | 34 |  |   | 
  | 35 | 0 |          if (database instanceof OracleDatabase) { | 
  | 36 |  |               | 
  | 37 |  |               | 
  | 38 | 0 |              List<String> associatedWith = StringUtils.splitAndTrim(statement.getAssociatedWith(), ","); | 
  | 39 | 0 |              if (associatedWith != null | 
  | 40 |  |                      && (associatedWith.contains(Index.MARK_PRIMARY_KEY) || associatedWith | 
  | 41 |  |                              .contains(Index.MARK_UNIQUE_CONSTRAINT))) { | 
  | 42 | 0 |                  return new Sql[0]; | 
  | 43 |  |              } | 
  | 44 | 0 |          } else { | 
  | 45 |  |               | 
  | 46 |  |               | 
  | 47 | 0 |              List<String> associatedWith = StringUtils.splitAndTrim(statement.getAssociatedWith(), ","); | 
  | 48 | 0 |              if (associatedWith != null | 
  | 49 |  |                      && (associatedWith.contains(Index.MARK_PRIMARY_KEY) | 
  | 50 |  |                              || associatedWith.contains(Index.MARK_UNIQUE_CONSTRAINT) || associatedWith | 
  | 51 |  |                                  .contains(Index.MARK_FOREIGN_KEY))) { | 
  | 52 | 0 |                  return new Sql[0]; | 
  | 53 |  |              } | 
  | 54 |  |          } | 
  | 55 |  |   | 
  | 56 | 0 |          StringBuffer buffer = new StringBuffer(); | 
  | 57 |  |   | 
  | 58 | 0 |          buffer.append("CREATE "); | 
  | 59 | 0 |          if (statement.isUnique() != null && statement.isUnique()) { | 
  | 60 | 0 |              buffer.append("UNIQUE "); | 
  | 61 |  |          } | 
  | 62 | 0 |          buffer.append("INDEX "); | 
  | 63 |  |   | 
  | 64 | 0 |          if (statement.getIndexName() != null) { | 
  | 65 | 0 |              String indexSchema = statement.getTableSchemaName(); | 
  | 66 | 0 |              buffer.append(database.escapeIndexName(indexSchema, statement.getIndexName())).append(" "); | 
  | 67 |  |          } | 
  | 68 | 0 |          buffer.append("ON "); | 
  | 69 | 0 |          buffer.append(database.escapeTableName(statement.getTableSchemaName(), statement.getTableName())).append("("); | 
  | 70 | 0 |          Iterator<String> iterator = Arrays.asList(statement.getColumns()).iterator(); | 
  | 71 | 0 |          while (iterator.hasNext()) { | 
  | 72 | 0 |              String column = iterator.next(); | 
  | 73 | 0 |              buffer.append(database.escapeColumnName(statement.getTableSchemaName(), statement.getTableName(), column)); | 
  | 74 | 0 |              if (iterator.hasNext()) { | 
  | 75 | 0 |                  buffer.append(", "); | 
  | 76 |  |              } | 
  | 77 | 0 |          } | 
  | 78 | 0 |          buffer.append(")"); | 
  | 79 |  |   | 
  | 80 | 0 |          if (StringUtils.trimToNull(statement.getTablespace()) != null && database.supportsTablespaces()) { | 
  | 81 | 0 |              if (database instanceof MSSQLDatabase || database instanceof SybaseASADatabase) { | 
  | 82 | 0 |                  buffer.append(" ON ").append(statement.getTablespace()); | 
  | 83 | 0 |              } else if (database instanceof DB2Database || database instanceof InformixDatabase) { | 
  | 84 | 0 |                  buffer.append(" IN ").append(statement.getTablespace()); | 
  | 85 |  |              } else { | 
  | 86 | 0 |                  buffer.append(" TABLESPACE ").append(statement.getTablespace()); | 
  | 87 |  |              } | 
  | 88 |  |          } | 
  | 89 |  |   | 
  | 90 | 0 |          return new Sql[] { new UnparsedSql(buffer.toString()) }; | 
  | 91 |  |      } | 
  | 92 |  |  } |