diff --git a/pom.xml b/pom.xml index 71b96d3b1..9d9416609 100644 --- a/pom.xml +++ b/pom.xml @@ -118,7 +118,7 @@ io.ebean ebean-annotation - 6.2 + 6.3 diff --git a/src/main/java/io/ebean/config/DbConstraintNormalise.java b/src/main/java/io/ebean/config/DbConstraintNormalise.java index 44af6bccd..43e27166b 100644 --- a/src/main/java/io/ebean/config/DbConstraintNormalise.java +++ b/src/main/java/io/ebean/config/DbConstraintNormalise.java @@ -41,17 +41,20 @@ public class DbConstraintNormalise { } /** - * Normalise the column name by removing any quoted identifier characters. + * Normalise the column name by removing any quoted identifier characters and formula brackets. */ public String normaliseColumn(String columnName) { - - columnName = trimQuotes(columnName); + columnName = trimBrackets(trimQuotes(columnName)); if (lowerCaseColumns) { columnName = columnName.toLowerCase(); } return columnName; } + private String trimBrackets(String value) { + return value.replace("(","").replace(")",""); + } + /** * Lower case the table name checking for quoted identifiers. */ diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/BaseTableDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/BaseTableDdl.java index e0e9265a0..cdfc96feb 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/BaseTableDdl.java +++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/BaseTableDdl.java @@ -112,8 +112,8 @@ public class BaseTableDdl implements TableDdl { handleStrictError(tableName, columnName); } - before = getScriptsForPlatform(column.getBefore(), platformDdl.getPlatform().getName()); - after = getScriptsForPlatform(column.getAfter(), platformDdl.getPlatform().getName()); + before = getScriptsForPlatform(column.getBefore()); + after = getScriptsForPlatform(column.getAfter()); this.withHistory = withHistory; } @@ -136,9 +136,9 @@ public class BaseTableDdl implements TableDdl { } before = Collections.singletonList(platformDdl.getUpdateNullWithDefault()); } else { - before = getScriptsForPlatform(alter.getBefore(), platformDdl.getPlatform().getName()); + before = getScriptsForPlatform(alter.getBefore()); } - after = getScriptsForPlatform(alter.getAfter(), platformDdl.getPlatform().getName()); + after = getScriptsForPlatform(alter.getAfter()); } void writeBefore(DdlBuffer buffer) throws IOException { @@ -167,7 +167,8 @@ public class BaseTableDdl implements TableDdl { } } - private List getScriptsForPlatform(List scripts, String searchPlatform) { + private List getScriptsForPlatform(List scripts) { + String searchPlatform = platformDdl.getPlatform().getName(); List ret = Collections.emptyList(); for (DdlScript script : scripts) { if (script.getPlatforms() == null || script.getPlatforms().isEmpty()) { @@ -358,7 +359,6 @@ public class BaseTableDdl implements TableDdl { * For all other DB platforms these unique constraints are done inline as per normal. */ protected void writeUniqueOneToOneConstraints(DdlWrite write, CreateTable createTable) throws IOException { - String tableName = createTable.getName(); for (Column col : externalUnique) { String uqName = col.getUniqueOneToOne(); @@ -381,7 +381,6 @@ public class BaseTableDdl implements TableDdl { } protected void writeSequence(DdlWrite writer, CreateTable createTable, String pk) throws IOException { - // explicit sequence use or platform decides String explicitSequenceName = createTable.getSequenceName(); int initial = toInt(createTable.getSequenceInitial()); @@ -400,13 +399,11 @@ public class BaseTableDdl implements TableDdl { } protected void createWithHistory(DdlWrite writer, String name) throws IOException { - MTable table = writer.getTable(name); platformDdl.createWithHistory(writer, table); } protected void writeInlineForeignKeys(DdlWrite write, CreateTable createTable) throws IOException { - for (Column column : createTable.getColumn()) { String references = column.getReferences(); if (hasValue(references)) { @@ -417,13 +414,11 @@ public class BaseTableDdl implements TableDdl { } protected void writeInlineForeignKey(DdlWrite write, Column column) throws IOException { - String fkConstraint = platformDdl.tableInlineForeignKey(new WriteForeignKey(null, column)); write.apply().append(",").newLine().append(" ").append(fkConstraint); } protected void writeInlineCompoundForeignKeys(DdlWrite write, CreateTable createTable) throws IOException { - for (ForeignKey key : createTable.getForeignKey()) { String fkConstraint = platformDdl.tableInlineForeignKey(new WriteForeignKey(null, key)); write.apply().append(",").newLine().append(" ").append(fkConstraint); @@ -431,7 +426,6 @@ public class BaseTableDdl implements TableDdl { } protected void writeAddForeignKeys(DdlWrite write, CreateTable createTable) throws IOException { - for (Column column : createTable.getColumn()) { String references = column.getReferences(); if (hasValue(references)) { @@ -443,7 +437,6 @@ public class BaseTableDdl implements TableDdl { } protected void writeAddCompoundForeignKeys(DdlWrite write, CreateTable createTable) throws IOException { - for (ForeignKey key : createTable.getForeignKey()) { writeForeignKey(write, new WriteForeignKey(createTable.getName(), key)); } @@ -454,7 +447,6 @@ public class BaseTableDdl implements TableDdl { } protected void writeForeignKey(DdlWrite write, WriteForeignKey request) throws IOException { - DdlBuffer fkeyBuffer = write.applyForeignKeys(); String tableName = lowerTableName(request.table()); if (request.indexName() != null) { @@ -474,7 +466,6 @@ public class BaseTableDdl implements TableDdl { } protected void alterTableAddForeignKey(DdlOptions options, DdlBuffer buffer, WriteForeignKey request) throws IOException { - buffer.appendStatement(platformDdl.alterTableAddForeignKey(options, request)); } @@ -493,7 +484,6 @@ public class BaseTableDdl implements TableDdl { * Add 'drop table' statement to the buffer. */ protected void dropTable(DdlBuffer buffer, String tableName) throws IOException { - buffer.appendStatement(platformDdl.dropTable(tableName)); } @@ -501,26 +491,38 @@ public class BaseTableDdl implements TableDdl { * Add 'drop sequence' statement to the buffer. */ protected void dropSequence(DdlBuffer buffer, String sequenceName) throws IOException { - buffer.appendStatement(platformDdl.dropSequence(sequenceName)); } protected void writeCompoundUniqueConstraints(DdlBuffer apply, CreateTable createTable) throws IOException { - boolean inlineUniqueWhenNull = platformDdl.isInlineUniqueWhenNullable(); for (UniqueConstraint uniqueConstraint : createTable.getUniqueConstraint()) { - if (inlineUniqueWhenNull) { - String uqName = uniqueConstraint.getName(); - String[] columns = split(uniqueConstraint.getColumnNames()); - apply.append(",").newLine(); - apply.append(" constraint ").append(uqName).append(" unique"); - appendColumns(columns, apply); - } else { - externalCompoundUnique.add(uniqueConstraint); + if (platformInclude(uniqueConstraint.getPlatforms())) { + if (inlineUniqueWhenNull) { + String uqName = uniqueConstraint.getName(); + apply.append(",").newLine(); + apply.append(" constraint ").append(uqName).append(" unique"); + appendColumns(split(uniqueConstraint.getColumnNames()), apply); + } else { + externalCompoundUnique.add(uniqueConstraint); + } } } } + private boolean platformInclude(String platforms) { + if (platforms == null || platforms.isEmpty()) { + return true; + } + String currentPlatform = platformDdl.getPlatform().getPlatform().name(); + for (String name : StringHelper.splitNames(platforms)) { + if (currentPlatform.equalsIgnoreCase(name)) { + return true; + } + } + return false; + } + /** * Write the unique constraints inline with the create table statement. */ @@ -608,25 +610,30 @@ public class BaseTableDdl implements TableDdl { @Override public void generate(DdlWrite writer, CreateIndex createIndex) throws IOException { - writer.apply().appendStatement(platformDdl.createIndex(createIndex.getIndexName(), createIndex.getTableName(), split(createIndex.getColumns()))); - writer.dropAll().appendStatement(platformDdl.dropIndex(createIndex.getIndexName(), createIndex.getTableName())); + if (platformInclude(createIndex.getPlatforms())) { + writer.apply().appendStatement(platformDdl.createIndex(createIndex.getIndexName(), createIndex.getTableName(), split(createIndex.getColumns()))); + writer.dropAll().appendStatement(platformDdl.dropIndex(createIndex.getIndexName(), createIndex.getTableName())); + } } @Override public void generate(DdlWrite writer, DropIndex dropIndex) throws IOException { - writer.apply().appendStatement(platformDdl.dropIndex(dropIndex.getIndexName(), dropIndex.getTableName())); + if (platformInclude(dropIndex.getPlatforms())) { + writer.apply().appendStatement(platformDdl.dropIndex(dropIndex.getIndexName(), dropIndex.getTableName())); + } } @Override public void generate(DdlWrite writer, AddUniqueConstraint constraint) throws IOException { + if (platformInclude(constraint.getPlatforms())) { + if (DdlHelp.isDropConstraint(constraint.getColumnNames())) { + writer.apply().appendStatement(platformDdl.alterTableDropUniqueConstraint(constraint.getTableName(), constraint.getConstraintName())); - if (DdlHelp.isDropConstraint(constraint.getColumnNames())) { - writer.apply().appendStatement(platformDdl.alterTableDropUniqueConstraint(constraint.getTableName(), constraint.getConstraintName())); - - } else { - String[] cols = split(constraint.getColumnNames()); - String[] nullableColumns = split(constraint.getNullableColumns()); - writer.apply().appendStatement(platformDdl.alterTableAddUniqueConstraint(constraint.getTableName(), constraint.getConstraintName(), cols, nullableColumns)); + } else { + String[] cols = split(constraint.getColumnNames()); + String[] nullableColumns = split(constraint.getNullableColumns()); + writer.apply().appendStatement(platformDdl.alterTableAddUniqueConstraint(constraint.getTableName(), constraint.getConstraintName(), cols, nullableColumns)); + } } } diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SplitColumns.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SplitColumns.java index 6c906124e..eebbd6bf4 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SplitColumns.java +++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/SplitColumns.java @@ -12,4 +12,13 @@ public class SplitColumns { return columns.split(","); } + /** + * Split returning null when columns is null or empty. + */ + public static String[] splitWithNull(String columns) { + if (columns == null || columns.isEmpty()) { + return null; + } + return columns.split(","); + } } diff --git a/src/main/java/io/ebeaninternal/dbmigration/migration/AddUniqueConstraint.java b/src/main/java/io/ebeaninternal/dbmigration/migration/AddUniqueConstraint.java index 01dacaead..c98c28b59 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/migration/AddUniqueConstraint.java +++ b/src/main/java/io/ebeaninternal/dbmigration/migration/AddUniqueConstraint.java @@ -21,6 +21,7 @@ import javax.xml.bind.annotation.XmlType; * <attribute name="columnNames" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /> * <attribute name="oneToOne" type="{http://www.w3.org/2001/XMLSchema}boolean" /> * <attribute name="nullableColumns" type="{http://www.w3.org/2001/XMLSchema}string" /> + * <attribute name="platforms" type="{http://www.w3.org/2001/XMLSchema}string" /> * </restriction> * </complexContent> * </complexType> @@ -41,6 +42,8 @@ public class AddUniqueConstraint { protected Boolean oneToOne; @XmlAttribute(name = "nullableColumns") protected String nullableColumns; + @XmlAttribute(name = "platforms") + protected String platforms; /** * Gets the value of the constraintName property. @@ -142,4 +145,17 @@ public class AddUniqueConstraint { this.nullableColumns = value; } + /** + * Return the platforms. + */ + public String getPlatforms() { + return platforms; + } + + /** + * Set the platforms. + */ + public void setPlatforms(String platforms) { + this.platforms = platforms; + } } diff --git a/src/main/java/io/ebeaninternal/dbmigration/migration/CreateIndex.java b/src/main/java/io/ebeaninternal/dbmigration/migration/CreateIndex.java index 9e581d0c3..f47bc6997 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/migration/CreateIndex.java +++ b/src/main/java/io/ebeaninternal/dbmigration/migration/CreateIndex.java @@ -19,6 +19,7 @@ import javax.xml.bind.annotation.XmlType; * <attribute name="indexName" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /> * <attribute name="tableName" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /> * <attribute name="columns" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /> + * <attribute name="platforms" type="{http://www.w3.org/2001/XMLSchema}string" /> * </restriction> * </complexContent> * </complexType> @@ -35,6 +36,8 @@ public class CreateIndex { protected String tableName; @XmlAttribute(name = "columns", required = true) protected String columns; + @XmlAttribute(name = "platforms") + protected String platforms; /** * Gets the value of the indexName property. @@ -96,4 +99,17 @@ public class CreateIndex { this.columns = value; } + /** + * Return the platforms. + */ + public String getPlatforms() { + return platforms; + } + + /** + * Set the platforms. + */ + public void setPlatforms(String platforms) { + this.platforms = platforms; + } } diff --git a/src/main/java/io/ebeaninternal/dbmigration/migration/DropIndex.java b/src/main/java/io/ebeaninternal/dbmigration/migration/DropIndex.java index 5a70943a3..c05b92a78 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/migration/DropIndex.java +++ b/src/main/java/io/ebeaninternal/dbmigration/migration/DropIndex.java @@ -18,6 +18,7 @@ import javax.xml.bind.annotation.XmlType; * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <attribute name="indexName" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /> * <attribute name="tableName" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /> + * <attribute name="platforms" type="{http://www.w3.org/2001/XMLSchema}string" /> * </restriction> * </complexContent> * </complexType> @@ -32,6 +33,8 @@ public class DropIndex { protected String indexName; @XmlAttribute(name = "tableName", required = true) protected String tableName; + @XmlAttribute(name = "platforms") + protected String platforms; /** * Gets the value of the indexName property. @@ -73,4 +76,17 @@ public class DropIndex { this.tableName = value; } + /** + * Return the platforms. + */ + public String getPlatforms() { + return platforms; + } + + /** + * Set the platforms. + */ + public void setPlatforms(String platforms) { + this.platforms = platforms; + } } diff --git a/src/main/java/io/ebeaninternal/dbmigration/migration/UniqueConstraint.java b/src/main/java/io/ebeaninternal/dbmigration/migration/UniqueConstraint.java index 79a6f5e05..7f7de32f3 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/migration/UniqueConstraint.java +++ b/src/main/java/io/ebeaninternal/dbmigration/migration/UniqueConstraint.java @@ -20,6 +20,7 @@ import javax.xml.bind.annotation.XmlType; * <attribute name="columnNames" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /> * <attribute name="oneToOne" type="{http://www.w3.org/2001/XMLSchema}boolean" /> * <attribute name="nullableColumns" type="{http://www.w3.org/2001/XMLSchema}string" /> + * <attribute name="platforms" type="{http://www.w3.org/2001/XMLSchema}string" /> * </restriction> * </complexContent> * </complexType> @@ -38,6 +39,8 @@ public class UniqueConstraint { protected Boolean oneToOne; @XmlAttribute(name = "nullableColumns") protected String nullableColumns; + @XmlAttribute(name = "platforms") + protected String platforms; /** * Gets the value of the name property. @@ -119,4 +122,17 @@ public class UniqueConstraint { this.nullableColumns = value; } + /** + * Return the platforms. + */ + public String getPlatforms() { + return platforms; + } + + /** + * Set the platforms. + */ + public void setPlatforms(String platforms) { + this.platforms = platforms; + } } diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/MCompoundUniqueConstraint.java b/src/main/java/io/ebeaninternal/dbmigration/model/MCompoundUniqueConstraint.java index aee6f1963..62c2fdf89 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/model/MCompoundUniqueConstraint.java +++ b/src/main/java/io/ebeaninternal/dbmigration/model/MCompoundUniqueConstraint.java @@ -7,6 +7,9 @@ import io.ebeaninternal.dbmigration.migration.UniqueConstraint; import java.util.Arrays; import java.util.Objects; +import static io.ebeaninternal.dbmigration.ddlgeneration.platform.SplitColumns.split; +import static io.ebeaninternal.dbmigration.ddlgeneration.platform.SplitColumns.splitWithNull; + /** * A unique constraint for multiple columns. *

@@ -28,12 +31,41 @@ public class MCompoundUniqueConstraint { */ private final String[] columns; + private final String platforms; + private String[] nullableColumns; - public MCompoundUniqueConstraint(String[] columns, Boolean oneToOne, String name) { + /** + * Create for OneToOne. + */ + public MCompoundUniqueConstraint(String[] columns, String name) { this.name = name; this.columns = columns; - this.oneToOne = Boolean.TRUE.equals(oneToOne); + this.oneToOne = true; + this.platforms = null; + } + + public MCompoundUniqueConstraint(String[] columns, boolean oneToOne, String name, String platforms) { + this.name = name; + this.columns = columns; + this.oneToOne = oneToOne; + this.platforms = platforms; + } + + public MCompoundUniqueConstraint(AddUniqueConstraint change) { + this.name = change.getConstraintName(); + this.columns = split(change.getColumnNames()); + this.oneToOne = change.isOneToOne(); + this.platforms = change.getPlatforms(); + this.nullableColumns = splitWithNull(change.getNullableColumns()); + } + + public MCompoundUniqueConstraint(UniqueConstraint uq) { + this.name = uq.getName(); + this.columns = split(uq.getColumnNames()); + this.oneToOne = uq.isOneToOne(); + this.platforms = uq.getPlatforms(); + this.nullableColumns = splitWithNull(uq.getNullableColumns()); } /** @@ -44,7 +76,7 @@ public class MCompoundUniqueConstraint { } /** - * Return true if this unqiue constraint is specifically for OneToOne mapping. + * Return true if this unique constraint is specifically for OneToOne mapping. */ public boolean isOneToOne() { return oneToOne; @@ -57,12 +89,17 @@ public class MCompoundUniqueConstraint { return name; } + public String getPlatforms() { + return platforms; + } + public UniqueConstraint getUniqueConstraint() { UniqueConstraint uq = new UniqueConstraint(); uq.setName(getName()); uq.setColumnNames(join(columns)); uq.setNullableColumns(join(nullableColumns)); uq.setOneToOne(isOneToOne()); + uq.setPlatforms(platforms); return uq; } @@ -76,6 +113,7 @@ public class MCompoundUniqueConstraint { create.setColumnNames(join(columns)); create.setNullableColumns(join(nullableColumns)); create.setOneToOne(isOneToOne()); + create.setPlatforms(platforms); return create; } @@ -83,12 +121,13 @@ public class MCompoundUniqueConstraint { * Create a AddUniqueConstraint migration with 'DROP CONSTRAINT' set for this index. */ public AddUniqueConstraint dropUniqueConstraint(String tableName) { - AddUniqueConstraint dropUniqueConstraint = new AddUniqueConstraint(); - dropUniqueConstraint.setConstraintName(name); - dropUniqueConstraint.setTableName(tableName); - dropUniqueConstraint.setColumnNames(DdlHelp.DROP_CONSTRAINT); - dropUniqueConstraint.setNullableColumns(join(nullableColumns)); - return dropUniqueConstraint; + AddUniqueConstraint drop = new AddUniqueConstraint(); + drop.setConstraintName(name); + drop.setTableName(tableName); + drop.setColumnNames(DdlHelp.DROP_CONSTRAINT); + drop.setNullableColumns(join(nullableColumns)); + drop.setPlatforms(platforms); + return drop; } public void setNullableColumns(String[] nullableColumns) { @@ -127,9 +166,10 @@ public class MCompoundUniqueConstraint { return false; } MCompoundUniqueConstraint other = (MCompoundUniqueConstraint) obj; - return Arrays.equals(columns, other.columns) - && Arrays.equals(nullableColumns, other.nullableColumns) + // not including platforms in equals check + return oneToOne == other.oneToOne && Objects.equals(name, other.name) - && oneToOne == other.oneToOne; + && Arrays.equals(columns, other.columns) + && Arrays.equals(nullableColumns, other.nullableColumns); } } diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/MIndex.java b/src/main/java/io/ebeaninternal/dbmigration/model/MIndex.java index 6c5ae2271..e47a4e326 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/model/MIndex.java +++ b/src/main/java/io/ebeaninternal/dbmigration/model/MIndex.java @@ -16,6 +16,8 @@ public class MIndex { private String indexName; + private String platforms; + private List columns = new ArrayList<>(); /** @@ -27,6 +29,11 @@ public class MIndex { this.columns.add(columnName); } + public MIndex(String indexName, String tableName, String[] columnNames, String platforms) { + this(indexName, tableName, columnNames); + this.platforms = platforms; + } + /** * Create a multi column non unique index. */ @@ -40,6 +47,12 @@ public class MIndex { this.indexName = createIndex.getIndexName(); this.tableName = createIndex.getTableName(); this.columns = split(createIndex.getColumns()); + this.platforms = createIndex.getPlatforms(); + } + + public String getKey() { + // currently indexName should be unique (not indexName + platforms) + return indexName; } /** @@ -71,6 +84,7 @@ public class MIndex { create.setIndexName(indexName); create.setTableName(tableName); create.setColumns(join()); + create.setPlatforms(platforms); return create; } @@ -81,6 +95,7 @@ public class MIndex { DropIndex dropIndex = new DropIndex(); dropIndex.setIndexName(indexName); dropIndex.setTableName(tableName); + dropIndex.setPlatforms(platforms); return dropIndex; } @@ -88,7 +103,6 @@ public class MIndex { * Compare with an index of the same name. */ public void compare(ModelDiff modelDiff, MIndex newIndex) { - if (changed(newIndex)) { // drop and recreate the index modelDiff.addDropIndex(dropIndex()); diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/MTable.java b/src/main/java/io/ebeaninternal/dbmigration/model/MTable.java index 354f1824f..4f04ba0c4 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/model/MTable.java +++ b/src/main/java/io/ebeaninternal/dbmigration/model/MTable.java @@ -27,6 +27,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import static io.ebeaninternal.dbmigration.ddlgeneration.platform.SplitColumns.split; + /** * Holds the logical model for a given Table and everything associated to it. *

@@ -173,11 +175,8 @@ public class MTable { for (Column column : cols) { addColumn(column); } - List uqConstraints = createTable.getUniqueConstraint(); - for (UniqueConstraint uq : uqConstraints) { - MCompoundUniqueConstraint mUq = new MCompoundUniqueConstraint(SplitColumns.split(uq.getColumnNames()), uq.isOneToOne(), uq.getName()); - mUq.setNullableColumns(SplitColumns.split(uq.getNullableColumns())); - uniqueConstraints.add(mUq); + for (UniqueConstraint uq : createTable.getUniqueConstraint()) { + uniqueConstraints.add(new MCompoundUniqueConstraint(uq)); } for (ForeignKey fk : createTable.getForeignKey()) { @@ -189,11 +188,10 @@ public class MTable { } } - public void addForeignKey(String name, String refTableName, String indexName, String columnNames, String refColumnNames) { MCompoundForeignKey foreignKey = new MCompoundForeignKey(name, refTableName, indexName); - String[] cols = SplitColumns.split(columnNames); - String[] refCols = SplitColumns.split(refColumnNames); + String[] cols = split(columnNames); + String[] refCols = split(refColumnNames); for (int i = 0; i < cols.length && i < refCols.length; i++) { foreignKey.addColumnPair(cols[i], refCols[i]); } @@ -597,19 +595,8 @@ public class MTable { /** * Add a unique constraint. */ - public void addUniqueConstraint(String[] columns, boolean oneToOne, String constraintName) { - uniqueConstraints.add(new MCompoundUniqueConstraint(columns, oneToOne, constraintName)); - } - - /** - * Add a unique constraint. - */ - public void addUniqueConstraint(List columns, boolean oneToOne, String constraintName) { - String[] cols = new String[columns.size()]; - for (int i = 0; i < columns.size(); i++) { - cols[i] = columns.get(i).getName(); - } - addUniqueConstraint(cols, oneToOne, constraintName); + public void addUniqueConstraint(MCompoundUniqueConstraint uniqueConstraint) { + uniqueConstraints.add(uniqueConstraint); } /** diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/ModelContainer.java b/src/main/java/io/ebeaninternal/dbmigration/model/ModelContainer.java index 898fe8584..41b522a50 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/model/ModelContainer.java +++ b/src/main/java/io/ebeaninternal/dbmigration/model/ModelContainer.java @@ -2,7 +2,6 @@ package io.ebeaninternal.dbmigration.model; import io.ebean.migration.MigrationVersion; import io.ebeaninternal.dbmigration.ddlgeneration.platform.DdlHelp; -import io.ebeaninternal.dbmigration.ddlgeneration.platform.SplitColumns; import io.ebeaninternal.dbmigration.migration.AddColumn; import io.ebeaninternal.dbmigration.migration.AddHistoryTable; import io.ebeaninternal.dbmigration.migration.AddTableComment; @@ -21,6 +20,7 @@ import io.ebeaninternal.dbmigration.migration.Migration; import io.ebeaninternal.dbmigration.migration.Sql; import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -82,13 +82,6 @@ public class ModelContainer { return tables; } - /** - * Return the map of all the non unique non fk indexes. - */ - public Map getIndexes() { - return indexes; - } - /** * Return the table by name. */ @@ -97,10 +90,21 @@ public class ModelContainer { } /** - * Return the index by name. + * Lookup the matching index during DIFF migration processing. */ - public MIndex getIndex(String indexName) { - return indexes.get(indexName); + public MIndex getIndex(MIndex newIndex) { + return indexes.get(newIndex.getKey()); + } + + public Collection allIndexes() { + return indexes.values(); + } + + /** + * Return true if the index does not exist and should be dropped. + */ + public boolean dropIndex(MIndex existingIndex) { + return !indexes.containsKey(existingIndex.getKey()); } /** @@ -201,10 +205,7 @@ public class ModelContainer { if (DdlHelp.isDropConstraint(change.getColumnNames())) { table.getUniqueConstraints().removeIf(constraint -> constraint.getName().equals(change.getConstraintName())); } else { - MCompoundUniqueConstraint constraint = new MCompoundUniqueConstraint( - SplitColumns.split(change.getColumnNames()), change.isOneToOne(), change.getConstraintName()); - constraint.setNullableColumns(SplitColumns.split(change.getNullableColumns())); - table.getUniqueConstraints().add(constraint); + table.getUniqueConstraints().add(new MCompoundUniqueConstraint(change)); } } @@ -216,8 +217,7 @@ public class ModelContainer { if (DdlHelp.isDropForeignKey(change.getColumnNames())) { table.removeForeignKey(change.getName()); } else { - table.addForeignKey(change.getName(), change.getRefTableName(), change.getIndexName(), change.getColumnNames(), - change.getRefColumnNames()); + table.addForeignKey(change.getName(), change.getRefTableName(), change.getIndexName(), change.getColumnNames(), change.getRefColumnNames()); } } @@ -259,7 +259,8 @@ public class ModelContainer { if (indexes.containsKey(indexName)) { throw new IllegalStateException("Index [" + indexName + "] already exists in model?"); } - indexes.put(createIndex.getIndexName(), new MIndex(createIndex)); + MIndex index = new MIndex(createIndex); + indexes.put(index.getKey(), index); } /** @@ -321,7 +322,7 @@ public class ModelContainer { if (reusedElementCollection != null) { final MIndex index = reusedElementCollection.setReusedElementCollection(); if (index != null) { - indexes.put(index.getIndexName(), index); + indexes.put(index.getKey(), index); } } else { if (table.isPartitioned()) { @@ -332,17 +333,10 @@ public class ModelContainer { } /** - * Add a single column index. + * Add an index. */ - public void addIndex(String indexName, String tableName, String columnName) { - indexes.put(indexName, new MIndex(indexName, tableName, columnName)); - } - - /** - * Add a multi column index. - */ - public void addIndex(String indexName, String tableName, String[] columnNames) { - indexes.put(indexName, new MIndex(indexName, tableName, columnNames)); + public void addIndex(MIndex index) { + indexes.put(index.getKey(), index); } /** diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/ModelDiff.java b/src/main/java/io/ebeaninternal/dbmigration/model/ModelDiff.java index 6aa390e65..2babc7c6c 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/model/ModelDiff.java +++ b/src/main/java/io/ebeaninternal/dbmigration/model/ModelDiff.java @@ -140,9 +140,8 @@ public class ModelDiff { } } - Map newIndexes = newModel.getIndexes(); - for (MIndex newIndex : newIndexes.values()) { - MIndex currentIndex = baseModel.getIndex(newIndex.getIndexName()); + for (MIndex newIndex : newModel.allIndexes()) { + MIndex currentIndex = baseModel.getIndex(newIndex); if (currentIndex == null) { addCreateIndex(newIndex.createIndex()); } else { @@ -151,8 +150,8 @@ public class ModelDiff { } // search for indexes that are no longer used - for (MIndex existingIndex : baseModel.getIndexes().values()) { - if (!newIndexes.containsKey(existingIndex.getIndexName())) { + for (MIndex existingIndex : baseModel.allIndexes()) { + if (newModel.dropIndex(existingIndex)) { addDropIndex(existingIndex.dropIndex()); } } diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildContext.java b/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildContext.java index 69b28eb49..8c55e39ed 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildContext.java +++ b/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildContext.java @@ -7,6 +7,7 @@ import io.ebean.config.dbplatform.DbPlatformTypeMapping; import io.ebeaninternal.dbmigration.ddlgeneration.platform.DefaultConstraintMaxLength; import io.ebeaninternal.dbmigration.model.MColumn; import io.ebeaninternal.dbmigration.model.MCompoundForeignKey; +import io.ebeaninternal.dbmigration.model.MIndex; import io.ebeaninternal.dbmigration.model.MTable; import io.ebeaninternal.dbmigration.model.ModelContainer; import io.ebeaninternal.server.deploy.BeanDescriptor; @@ -125,12 +126,8 @@ public class ModelBuildContext { model.addTableElementCollection(table); } - public void addIndex(String indexName, String tableName, String columnName) { - model.addIndex(indexName, tableName, columnName); - } - - public void addIndex(String indexName, String tableName, String[] columnNames) { - model.addIndex(indexName, tableName, columnNames); + public void addIndex(MIndex index) { + model.addIndex(index); } /** diff --git a/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java b/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java index 338941122..5f5e5e18c 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java +++ b/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java @@ -1,8 +1,11 @@ package io.ebeaninternal.dbmigration.model.build; +import io.ebean.annotation.Platform; import io.ebeaninternal.dbmigration.ddlgeneration.platform.util.IndexSet; import io.ebeaninternal.dbmigration.model.MColumn; import io.ebeaninternal.dbmigration.model.MCompoundForeignKey; +import io.ebeaninternal.dbmigration.model.MCompoundUniqueConstraint; +import io.ebeaninternal.dbmigration.model.MIndex; import io.ebeaninternal.dbmigration.model.MTable; import io.ebeaninternal.dbmigration.model.visitor.BaseTablePropertyVisitor; import io.ebeaninternal.server.deploy.BeanDescriptor; @@ -20,6 +23,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; +import java.util.StringJoiner; /** * Used as part of ModelBuildBeanVisitor and generally adds the MColumn to the associated @@ -42,7 +46,6 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { private int countUnique; private int countCheck; - public ModelBuildPropertyVisitor(ModelBuildContext ctx, MTable table, BeanDescriptor beanDescriptor) { this.ctx = ctx; this.table = table; @@ -54,31 +57,55 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { * Add unique constraints defined via JPA UniqueConstraint annotations. */ private void addIndexes(IndexDefinition[] indexes) { - if (indexes != null) { for (IndexDefinition index : indexes) { String[] columns = index.getColumns(); indexSet.add(columns); - if (index.isUnique()) { - String uqName = index.getName(); - if (uqName == null || uqName.trim().isEmpty()) { - uqName = determineUniqueConstraintName(columns); - } - table.addUniqueConstraint(columns, false, uqName); - + table.addUniqueConstraint(createMUniqueConstraint(index, columns)); } else { // 'just' an index (not a unique constraint) - String idxName = index.getName(); - if (idxName == null || idxName.trim().isEmpty()) { - idxName = determineIndexName(columns); - } - ctx.addIndex(idxName, table.getName(), columns); + ctx.addIndex(createMIndex(indexName(index), table.getName(), index)); } } } } + private MCompoundUniqueConstraint createMUniqueConstraint(IndexDefinition index, String[] columns) { + return new MCompoundUniqueConstraint(columns, false, uniqueConstraintName(index), platforms(index.getPlatforms())); + } + + private String uniqueConstraintName(IndexDefinition index) { + String uqName = index.getName(); + if (uqName == null || uqName.trim().isEmpty()) { + return determineUniqueConstraintName(index.getColumns()); + } + return uqName; + } + + private String indexName(IndexDefinition index) { + String idxName = index.getName(); + if (idxName == null || idxName.trim().isEmpty()) { + idxName = determineIndexName(index.getColumns()); + } + return idxName; + } + + private MIndex createMIndex(String indexName, String tableName, IndexDefinition index) { + return new MIndex(indexName, tableName, index.getColumns(), platforms(index.getPlatforms())); + } + + private String platforms(Platform[] platforms) { + if (platforms == null || platforms.length == 0) { + return null; + } + StringJoiner joiner = new StringJoiner(","); + for (Platform platform : platforms) { + joiner.add(platform.name()); + } + return joiner.toString(); + } + @Override public void visitEnd() { @@ -105,7 +132,6 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { } addDraftTable(); - table.updateCompoundIndices(); } @@ -146,9 +172,8 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { @Override public void visitEmbeddedScalar(BeanProperty p, BeanPropertyAssocOne embedded) { - if (p instanceof BeanPropertyAssocOne) { - visitOneImported((BeanPropertyAssocOne)p); + visitOneImported((BeanPropertyAssocOne)p); } else { visitScalar(p); } @@ -222,13 +247,13 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { // for MsSqlServer we need different DDL to handle NULL values on this constraint if (modelColumns.size() == 1) { MColumn col = modelColumns.get(0); - col.setUniqueOneToOne(determineUniqueConstraintName(col.getName())); indexSetAdd(col.getName()); + col.setUniqueOneToOne(determineUniqueConstraintName(col.getName())); } else { + String[] cols = indexSetAdd(toColumnNames(modelColumns)); String uqName = determineUniqueConstraintName(p.getName()); - table.addUniqueConstraint(modelColumns, true, uqName); - indexSetAdd(modelColumns); + table.addUniqueConstraint(new MCompoundUniqueConstraint(cols, uqName)); } } } @@ -313,19 +338,23 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { indexSet.add(column); } - private void indexSetAdd(List modelColumns) { + private String[] indexSetAdd(String[] cols) { + indexSet.add(cols); + return cols; + } + + private String[] toColumnNames(List modelColumns) { String[] cols = new String[modelColumns.size()]; for (int i = 0; i < modelColumns.size(); i++) { cols[i] = modelColumns.get(i).getName(); } - indexSet.add(cols); + return cols; } /** * Return the primary key constraint name. */ protected String determinePrimaryKeyName() { - return ctx.primaryKeyName(table.getName()); } @@ -333,12 +362,10 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { * Return the foreign key constraint name given a single column foreign key. */ protected String determineForeignKeyConstraintName(String columnName) { - return ctx.foreignKeyConstraintName(table.getName(), columnName, ++countForeignKey); } protected String determineForeignKeyIndexName(String column) { - String[] cols = {column}; return determineForeignKeyIndexName(cols); } @@ -347,7 +374,6 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { * Return the foreign key constraint name given a single column foreign key. */ protected String determineForeignKeyIndexName(String[] columns) { - return ctx.foreignKeyIndexName(table.getName(), columns, ++countIndex); } @@ -355,7 +381,6 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { * Return the index name given a single column foreign key. */ protected String determineIndexName(String column) { - return ctx.indexName(table.getName(), column, ++countIndex); } @@ -363,7 +388,6 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { * Return the index name given multiple columns. */ protected String determineIndexName(String[] columns) { - return ctx.indexName(table.getName(), columns, ++countIndex); } @@ -371,7 +395,6 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { * Return the unique constraint name. */ protected String determineUniqueConstraintName(String columnName) { - return ctx.uniqueConstraintName(table.getName(), columnName, ++countUnique); } @@ -379,7 +402,6 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { * Return the unique constraint name. */ protected String determineUniqueConstraintName(String[] columnNames) { - return ctx.uniqueConstraintName(table.getName(), columnNames, ++countUnique); } @@ -387,11 +409,9 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { * Return the constraint name. */ protected String determineCheckConstraintName(String columnName) { - return ctx.checkConstraintName(table.getName(), columnName, ++countCheck); } - private boolean hasValue(String val) { return val != null && !val.isEmpty(); } diff --git a/src/main/java/io/ebeaninternal/server/deploy/IndexDefinition.java b/src/main/java/io/ebeaninternal/server/deploy/IndexDefinition.java index 3c9632bb8..b5fb5c757 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/IndexDefinition.java +++ b/src/main/java/io/ebeaninternal/server/deploy/IndexDefinition.java @@ -1,5 +1,7 @@ package io.ebeaninternal.server.deploy; +import io.ebean.annotation.Platform; + /** * Holds multiple column unique constraints defined for an entity. */ @@ -9,12 +11,18 @@ public class IndexDefinition { private final String name; + private final Platform[] platforms; + private final boolean unique; - public IndexDefinition(String[] columns, String name, boolean unique) { + /** + * Create from Index annotation. + */ + public IndexDefinition(String[] columns, String name, boolean unique, Platform[] platforms) { this.columns = columns; this.unique = unique; this.name = name; + this.platforms = platforms; } /** @@ -24,6 +32,7 @@ public class IndexDefinition { this.columns = columns; this.unique = true; this.name = null; + this.platforms = null; } /** @@ -47,4 +56,10 @@ public class IndexDefinition { return columns; } + /** + * Return the platforms this index applies to. + */ + public Platform[] getPlatforms() { + return platforms; + } } diff --git a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationClass.java b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationClass.java index 4982d25fd..3281b258a 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationClass.java +++ b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationClass.java @@ -134,7 +134,7 @@ public class AnnotationClass extends AnnotationParser { } for (Index index : findAnnotationsRecursive(cls, Index.class)) { - descriptor.addIndex(new IndexDefinition(convertColumnNames(index.columnNames()), index.name(), index.unique())); + descriptor.addIndex(new IndexDefinition(convertColumnNames(index.columnNames()), index.name(), index.unique(), index.platforms())); } UniqueConstraint uc = findAnnotationRecursive(cls, UniqueConstraint.class); diff --git a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java index 5711c342e..73e34f9df 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java +++ b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java @@ -416,7 +416,7 @@ public class AnnotationFields extends AnnotationParser { if (columnNames.length == 1 && hasRelationshipItem(prop)) { throw new RuntimeException("Can't use Index on foreign key relationships."); } - descriptor.addIndex(new IndexDefinition(columnNames, index.name(), index.unique())); + descriptor.addIndex(new IndexDefinition(columnNames, index.name(), index.unique(), index.platforms())); } private void readJsonAnnotations(DeployBeanProperty prop) { diff --git a/src/main/resources/ebean-dbmigration-1.0.xsd b/src/main/resources/ebean-dbmigration-1.0.xsd index 3066f38b1..02b496645 100644 --- a/src/main/resources/ebean-dbmigration-1.0.xsd +++ b/src/main/resources/ebean-dbmigration-1.0.xsd @@ -138,6 +138,7 @@ + @@ -148,6 +149,7 @@ + @@ -288,6 +290,7 @@ + @@ -295,6 +298,7 @@ + diff --git a/src/test/java/io/ebean/config/DbConstraintNamingTest.java b/src/test/java/io/ebean/config/DbConstraintNamingTest.java index 6edd88322..ca5dbb13f 100644 --- a/src/test/java/io/ebean/config/DbConstraintNamingTest.java +++ b/src/test/java/io/ebean/config/DbConstraintNamingTest.java @@ -9,35 +9,30 @@ public class DbConstraintNamingTest { DbConstraintNaming naming = new DbConstraintNaming(); @Test - public void testPrimaryKeyName() throws Exception { - + public void testPrimaryKeyName() { assertThat(naming.primaryKeyName("[cat].[sce].[foo_bar]")).isEqualTo("pk_foo_bar"); } @Test - public void testUniqueConstraintName() throws Exception { - + public void testUniqueConstraintName() { assertThat(naming.uniqueConstraintName("[foo_bar]", "[jim]")).isEqualTo("uq_foo_bar_jim"); } @Test - public void testCheckConstraintName() throws Exception { - + public void testCheckConstraintName() { assertThat(naming.checkConstraintName("[foo_bar]", "[jim]")).isEqualTo("ck_foo_bar_jim"); } @Test - public void testNormalise() throws Exception { - + public void testNormalise() { assertThat(naming.normaliseTable("cat.sch.foo_bar]")).isEqualTo("foo_bar"); assertThat(naming.normaliseTable("sch.foo_bar]")).isEqualTo("foo_bar"); assertThat(naming.normaliseTable("foo_bar]")).isEqualTo("foo_bar"); } @Test - public void testDefaultToLower() throws Exception { + public void testDefaultToLower() { assertThat(naming.normaliseTable("SCH.FOO_BAR]")).isEqualTo("foo_bar"); - assertThat(naming.lowerTableName("SCH.FOO_BAR]")).isEqualTo("SCH.FOO_BAR]"); assertThat(naming.lowerTableName("SCH.FOO_BAR")).isEqualTo("sch.foo_bar"); assertThat(naming.lowerColumnName("SCH.FOO_BAR]")).isEqualTo("SCH.FOO_BAR]"); @@ -45,8 +40,7 @@ public class DbConstraintNamingTest { } @Test - public void testNoLowerCaseTable() throws Exception { - + public void testNoLowerCaseTable() { DbConstraintNaming naming = new DbConstraintNaming(false, true); assertThat(naming.normaliseTable("SCH.FOO_BAR]")).isEqualTo("FOO_BAR"); assertThat(naming.normaliseColumn("SCH.FOO_BAR]")).isEqualTo("sch.foo_bar"); @@ -58,8 +52,7 @@ public class DbConstraintNamingTest { } @Test - public void testNoLowerCaseColumn() throws Exception { - + public void testNoLowerCaseColumn() { DbConstraintNaming naming = new DbConstraintNaming(true, false); assertThat(naming.normaliseTable("SCH.FOO_BAR]")).isEqualTo("foo_bar"); assertThat(naming.normaliseColumn("SCH.FOO_BAR]")).isEqualTo("SCH.FOO_BAR"); @@ -70,4 +63,8 @@ public class DbConstraintNamingTest { assertThat(naming.lowerColumnName("SCH.FOO_BAR")).isEqualTo("SCH.FOO_BAR"); } + @Test + public void normaliseColumn_withFormula() { + assertThat(naming.normaliseColumn("lower(name)")).isEqualTo("lowername"); + } } diff --git a/src/test/java/io/ebeaninternal/dbmigration/model/ModelContainerTest.java b/src/test/java/io/ebeaninternal/dbmigration/model/ModelContainerTest.java index e702964b1..25a2644ee 100644 --- a/src/test/java/io/ebeaninternal/dbmigration/model/ModelContainerTest.java +++ b/src/test/java/io/ebeaninternal/dbmigration/model/ModelContainerTest.java @@ -40,7 +40,7 @@ public class ModelContainerTest { assertThat(fkCol.getReferences()).isNull(); assertThat(fkCol.getForeignKeyName()).isNull(); - final MIndex index = container.getIndex("ix_ec_table"); + final MIndex index = container.getIndex(new MIndex("ix_ec_table", "ec_table", "foo")); assertThat(index.getTableName()).isEqualTo("ec_table"); assertThat(index.getColumns()).containsOnly("fk_col"); } diff --git a/src/test/java/misc/migration/v1_0/OtoChild.java b/src/test/java/misc/migration/v1_0/OtoChild.java index fceaf5eca..f6d23ca9e 100644 --- a/src/test/java/misc/migration/v1_0/OtoChild.java +++ b/src/test/java/misc/migration/v1_0/OtoChild.java @@ -1,9 +1,14 @@ package misc.migration.v1_0; +import io.ebean.annotation.Index; + import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; +import static io.ebean.annotation.Platform.POSTGRES; + +@Index(columnNames = "lower(name)", platforms = POSTGRES) @Entity @Table(name = "migtest_oto_child") public class OtoChild { diff --git a/src/test/java/misc/migration/v1_1/OtoChild.java b/src/test/java/misc/migration/v1_1/OtoChild.java index 1877b8f53..dd42d0771 100644 --- a/src/test/java/misc/migration/v1_1/OtoChild.java +++ b/src/test/java/misc/migration/v1_1/OtoChild.java @@ -1,10 +1,15 @@ package misc.migration.v1_1; +import io.ebean.annotation.Index; + import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; +import static io.ebean.annotation.Platform.POSTGRES; + +@Index(columnNames = "name", platforms = POSTGRES) @Entity @Table(name = "migtest_oto_child") public class OtoChild { diff --git a/src/test/java/misc/migration/v1_2/OtoChild.java b/src/test/java/misc/migration/v1_2/OtoChild.java index 4ca5e6b4b..c72e5fab6 100644 --- a/src/test/java/misc/migration/v1_2/OtoChild.java +++ b/src/test/java/misc/migration/v1_2/OtoChild.java @@ -1,9 +1,19 @@ package misc.migration.v1_2; +import io.ebean.annotation.Index; + import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; +import static io.ebean.annotation.Platform.MYSQL; +import static io.ebean.annotation.Platform.POSTGRES; + +@Index(name = "ix_m12_otoc71", columnNames = "foo(name)", platforms = {POSTGRES}) +@Index(name = "ix_m12_otoc72", columnNames = "bar(name)", platforms = {MYSQL}) +@Index(unique = true, name = "uq_m12_otoc71", columnNames = "uqFoo(name)", platforms = {POSTGRES}) +@Index(unique = true, name = "uq_m12_otoc72", columnNames = "uqBar(name)", platforms = {MYSQL}) +@Index(columnNames = "name", platforms = POSTGRES) @Entity @Table(name = "migtest_oto_child") public class OtoChild { diff --git a/src/test/java/misc/migration/v1_2/OtoMaster.java b/src/test/java/misc/migration/v1_2/OtoMaster.java index e33578ff9..956975a3a 100644 --- a/src/test/java/misc/migration/v1_2/OtoMaster.java +++ b/src/test/java/misc/migration/v1_2/OtoMaster.java @@ -1,9 +1,18 @@ package misc.migration.v1_2; +import io.ebean.annotation.Index; + import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; +import static io.ebean.annotation.Platform.MYSQL; +import static io.ebean.annotation.Platform.POSTGRES; + +@Index(columnNames = "foo(name)", platforms = {POSTGRES}) +@Index(columnNames = "bar(name)", platforms = {MYSQL}) +@Index(unique = true, columnNames = "foo(name)", platforms = {POSTGRES}) +@Index(unique = true, columnNames = "bar(name)", platforms = {MYSQL}) @Entity @Table(name = "migtest_oto_master") public class OtoMaster { diff --git a/src/test/resources/dbmigration/migrationtest/model/1.0__initial.model.xml b/src/test/resources/dbmigration/migrationtest/model/1.0__initial.model.xml index ce4f03b4b..15c6708fc 100644 --- a/src/test/resources/dbmigration/migrationtest/model/1.0__initial.model.xml +++ b/src/test/resources/dbmigration/migrationtest/model/1.0__initial.model.xml @@ -115,5 +115,6 @@ + \ No newline at end of file diff --git a/src/test/resources/dbmigration/migrationtest/model/1.1.model.xml b/src/test/resources/dbmigration/migrationtest/model/1.1.model.xml index d304daa7d..55116e4ec 100644 --- a/src/test/resources/dbmigration/migrationtest/model/1.1.model.xml +++ b/src/test/resources/dbmigration/migrationtest/model/1.1.model.xml @@ -86,8 +86,10 @@ + + diff --git a/src/test/resources/dbmigration/migrationtest/model/1.3.model.xml b/src/test/resources/dbmigration/migrationtest/model/1.3.model.xml index 91d0e6449..40a65505b 100644 --- a/src/test/resources/dbmigration/migrationtest/model/1.3.model.xml +++ b/src/test/resources/dbmigration/migrationtest/model/1.3.model.xml @@ -38,8 +38,16 @@ + + + + + + + + diff --git a/src/test/resources/dbmigration/migrationtest/mysql/1.3.sql b/src/test/resources/dbmigration/migrationtest/mysql/1.3.sql index 057cec8bd..e6136deca 100644 --- a/src/test/resources/dbmigration/migrationtest/mysql/1.3.sql +++ b/src/test/resources/dbmigration/migrationtest/mysql/1.3.sql @@ -58,8 +58,12 @@ alter table migtest_e_history6 modify test_number1 integer; update migtest_e_history6 set test_number2 = 7 where test_number2 is null; alter table migtest_e_history6 alter test_number2 set default 7; alter table migtest_e_history6 modify test_number2 integer not null; +alter table migtest_oto_child add constraint uq_m12_otoc72 unique (uqbar(name)); +alter table migtest_oto_master add constraint uq_migtest_oto_master_barname unique (bar(name)); create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1); create index ix_migtest_e_basic_indextest5 on migtest_e_basic (indextest5); +create index ix_m12_otoc72 on migtest_oto_child (bar(name)); +create index ix_migtest_oto_master_barname on migtest_oto_master (bar(name)); drop index ix_migtest_e_basic_indextest3 on migtest_e_basic; drop index ix_migtest_e_basic_indextest6 on migtest_e_basic; create index ix_migtest_e_basic_eref_id on migtest_e_basic (eref_id); diff --git a/src/test/resources/dbmigration/migrationtest/postgres/1.0__initial.sql b/src/test/resources/dbmigration/migrationtest/postgres/1.0__initial.sql index 2f06401e3..22f1bae2d 100644 --- a/src/test/resources/dbmigration/migrationtest/postgres/1.0__initial.sql +++ b/src/test/resources/dbmigration/migrationtest/postgres/1.0__initial.sql @@ -163,6 +163,7 @@ create table migtest_oto_master ( create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1); create index ix_migtest_e_basic_indextest5 on migtest_e_basic (indextest5); +create index ix_migtest_oto_child_lowername on migtest_oto_child (lower(name)); create index ix_migtest_fk_cascade_one_id on migtest_fk_cascade (one_id); alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id) on delete cascade on update cascade; diff --git a/src/test/resources/dbmigration/migrationtest/postgres/1.1.sql b/src/test/resources/dbmigration/migrationtest/postgres/1.1.sql index 6b3f14652..e6f801cf5 100644 --- a/src/test/resources/dbmigration/migrationtest/postgres/1.1.sql +++ b/src/test/resources/dbmigration/migrationtest/postgres/1.1.sql @@ -102,8 +102,10 @@ alter table migtest_oto_child add column master_id bigint; create index ix_migtest_e_basic_indextest3 on migtest_e_basic (indextest3); create index ix_migtest_e_basic_indextest6 on migtest_e_basic (indextest6); +create index ix_migtest_oto_child_name on migtest_oto_child (name); drop index if exists ix_migtest_e_basic_indextest1; drop index if exists ix_migtest_e_basic_indextest5; +drop index if exists ix_migtest_oto_child_lowername; create index ix_migtest_mtm_c_migtest_mtm_m_migtest_mtm_c on migtest_mtm_c_migtest_mtm_m (migtest_mtm_c_id); alter table migtest_mtm_c_migtest_mtm_m add constraint fk_migtest_mtm_c_migtest_mtm_m_migtest_mtm_c foreign key (migtest_mtm_c_id) references migtest_mtm_c (id) on delete restrict on update restrict; diff --git a/src/test/resources/dbmigration/migrationtest/postgres/1.3.sql b/src/test/resources/dbmigration/migrationtest/postgres/1.3.sql index 95904bfd3..492c619e3 100644 --- a/src/test/resources/dbmigration/migrationtest/postgres/1.3.sql +++ b/src/test/resources/dbmigration/migrationtest/postgres/1.3.sql @@ -66,8 +66,12 @@ alter table migtest_e_history6 alter column test_number1 drop not null; update migtest_e_history6 set test_number2 = 7 where test_number2 is null; alter table migtest_e_history6 alter column test_number2 set default 7; alter table migtest_e_history6 alter column test_number2 set not null; +alter table migtest_oto_child add constraint uq_m12_otoc71 unique (uqfoo(name)); +alter table migtest_oto_master add constraint uq_migtest_oto_master_fooname unique (foo(name)); create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1); create index ix_migtest_e_basic_indextest5 on migtest_e_basic (indextest5); +create index ix_m12_otoc71 on migtest_oto_child (foo(name)); +create index ix_migtest_oto_master_fooname on migtest_oto_master (foo(name)); drop index if exists ix_migtest_e_basic_indextest3; drop index if exists ix_migtest_e_basic_indextest6; create index ix_migtest_e_basic_eref_id on migtest_e_basic (eref_id); diff --git a/src/test/resources/dbmigration/myapp/v2.0.xml b/src/test/resources/dbmigration/myapp/v2.0.xml index e03676896..bd91d2e9a 100644 --- a/src/test/resources/dbmigration/myapp/v2.0.xml +++ b/src/test/resources/dbmigration/myapp/v2.0.xml @@ -26,7 +26,7 @@ - +