From eeacb87e6ba618a4fa41116c45823bd298df2e37 Mon Sep 17 00:00:00 2001 From: Matt Oliver Date: Thu, 25 Jun 2020 15:41:08 -0400 Subject: [PATCH 1/5] Change sort weights of table actions and test reversed migration --- .../slick/migration/api/TableMigration.scala | 40 +++++++++---------- .../scala/slick/migration/api/DbTest.scala | 32 ++++++++++++++- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/main/scala/slick/migration/api/TableMigration.scala b/src/main/scala/slick/migration/api/TableMigration.scala index de1a1d47..5fd393e2 100644 --- a/src/main/scala/slick/migration/api/TableMigration.scala +++ b/src/main/scala/slick/migration/api/TableMigration.scala @@ -10,27 +10,27 @@ object TableMigration { object Action { sealed abstract class Reversible(sort: Int) extends Action(sort) - case object DropTable extends Action(0) - case object CreateTable extends Reversible(1) - case class RenameTableTo(to: String) extends Reversible(2) - case class RenameTableFrom(from: String) extends Reversible(2) - case class AddColumn(info: ColumnInfo) extends Reversible(3) - case class AddColumnAndSetInitialValue(info: ColumnInfo, rawSqlExpr: String) extends Reversible(3) - case class DropColumn(info: ColumnInfo) extends Reversible(4) - case class DropColumnOfName(name: String) extends Action(4) - case class RenameColumnTo(originalInfo: ColumnInfo, to: String) extends Reversible(5) - case class RenameColumnFrom(currentInfo: ColumnInfo, from: String) extends Reversible(5) - case class AlterColumnType(info: ColumnInfo) extends Action(6) - case class AlterColumnDefault(info: ColumnInfo) extends Action(6) - case class AlterColumnNullable(info: ColumnInfo) extends Action(6) - case class DropPrimaryKey(info: PrimaryKeyInfo) extends Reversible(7) - case class DropForeignKey(fk: ForeignKey) extends Reversible(7) + case object CreateTable extends Reversible(0) + case class RenameTableTo(to: String) extends Reversible(1) + case class AddColumn(info: ColumnInfo) extends Reversible(2) + case class AddColumnAndSetInitialValue(info: ColumnInfo, rawSqlExpr: String) extends Reversible(2) + case class RenameColumnTo(originalInfo: ColumnInfo, to: String) extends Reversible(2) + case class AlterColumnType(info: ColumnInfo) extends Action(3) + case class AlterColumnDefault(info: ColumnInfo) extends Action(3) + case class AlterColumnNullable(info: ColumnInfo) extends Action(3) + case class AddPrimaryKey(info: PrimaryKeyInfo) extends Reversible(4) + case class AddForeignKey(fk: ForeignKey) extends Reversible(4) + case class CreateIndex(info: IndexInfo) extends Reversible(5) + case class RenameIndexTo(originalInfo: IndexInfo, to: String) extends Reversible(5) + case class DropPrimaryKey(info: PrimaryKeyInfo) extends Reversible(6) + case class DropForeignKey(fk: ForeignKey) extends Reversible(6) case class DropIndex(info: IndexInfo) extends Reversible(7) - case class AddPrimaryKey(info: PrimaryKeyInfo) extends Reversible(8) - case class AddForeignKey(fk: ForeignKey) extends Reversible(8) - case class CreateIndex(info: IndexInfo) extends Reversible(8) - case class RenameIndexTo(originalInfo: IndexInfo, to: String) extends Reversible(9) - case class RenameIndexFrom(currentInfo: IndexInfo, from: String) extends Reversible(9) + case class RenameColumnFrom(currentInfo: ColumnInfo, from: String) extends Reversible(8) + case class RenameIndexFrom(currentInfo: IndexInfo, from: String) extends Reversible(8) + case class RenameTableFrom(from: String) extends Reversible(8) + case class DropColumnOfName(name: String) extends Action(9) + case class DropColumn(info: ColumnInfo) extends Reversible(9) + case object DropTable extends Action(10) } sealed trait WithActions[A <: Action] { diff --git a/src/test/scala/slick/migration/api/DbTest.scala b/src/test/scala/slick/migration/api/DbTest.scala index 0fb4ae58..782592ad 100644 --- a/src/test/scala/slick/migration/api/DbTest.scala +++ b/src/test/scala/slick/migration/api/DbTest.scala @@ -7,7 +7,7 @@ import scala.concurrent.Await import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration.Duration import scala.util.control.NonFatal -import slick.jdbc.{HsqldbProfile, JdbcProfile, OracleProfile} +import slick.jdbc.{HsqldbProfile, JdbcProfile, OracleProfile, PostgresProfile} import slick.jdbc.meta._ import slick.lifted.AbstractTable import com.typesafe.slick.testkit.util.JdbcTestDB @@ -245,6 +245,36 @@ abstract class DbTest[P <: JdbcProfile](val tdb: JdbcTestDB {val profile: P}) runMigration(tm.drop) } } + + test("reverse") { + val tm = TableMigration(TestTable) + val createTable = tm.create.addColumns(_.id, _.strWithDefault) + + assert(createTable.sql.size === 1) + assert(createTable.sql.head.contains("create table")) + + runMigration(createTable) + + val reversed = createTable.reverse + + assert(reversed.sql.size === 3) + assert(reversed.sql.head.contains("ID")) + assert(reversed.sql(1).contains("STR_WITH_DEFAULT")) + assert(reversed.sql(2).contains("drop table")) + + try withBeforeAndAfter(reversed)(getTables) { (before, after) => + // Only postgres can remove all columns from a table + if (this.profile.isInstanceOf[PostgresProfile]) { + assert(before.contains("TEST_TABLE")) + assert(!after.contains("TEST_TABLE")) + } + } catch { + case _: Throwable => + if (!this.profile.isInstanceOf[PostgresProfile]) { + runMigration(tm.drop) + } + } + } } trait CompleteDbTest { this: DbTest[_ <: JdbcProfile] => From ce44dd6a99740f92b1b874db63f8f659053b98c3 Mon Sep 17 00:00:00 2001 From: Aaron Novstrup Date: Sat, 17 Dec 2022 17:03:16 -0800 Subject: [PATCH 2/5] omit DropColumn actions from a table migration that includes DropTable --- src/main/scala/slick/migration/api/Dialect.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/scala/slick/migration/api/Dialect.scala b/src/main/scala/slick/migration/api/Dialect.scala index 280a0eb4..1895120b 100644 --- a/src/main/scala/slick/migration/api/Dialect.scala +++ b/src/main/scala/slick/migration/api/Dialect.scala @@ -154,8 +154,10 @@ class Dialect[-P <: JdbcProfile] extends AstHelpers { case RenameTableFrom(from) :: rest => renameTable(table.copy(tableName = from), table.tableName) :: loop(rest) case AddColumn(info) :: rest => addColumn(table, info) :: loop(rest) case AddColumnAndSetInitialValue(info, expr) :: rest => addColumnWithInitialValue(table, info, expr) ::: loop(rest) - case DropColumn(info) :: rest => dropColumn(table, info.name) ::: loop(rest) - case DropColumnOfName(name) :: rest => dropColumn(table, name) ::: loop(rest) + case DropColumn(info) :: rest => + (if (rest contains DropTable) Nil else dropColumn(table, info.name)) ::: loop(rest) + case DropColumnOfName(name) :: rest => + (if (rest contains DropTable) Nil else dropColumn(table, name)) ::: loop(rest) case RenameColumnTo(originalInfo, to) :: rest => renameColumn(table, originalInfo, to) :: loop(rest) case RenameColumnFrom(currentInfo, from) :: rest => renameColumn(table, from, currentInfo.name) :: loop(rest) case AlterColumnDefault(info) :: rest => alterColumnDefault(table, info) :: loop(rest) From 766de8d6d26b646362a34d1e7ad15fa173969ddf Mon Sep 17 00:00:00 2001 From: Aaron Novstrup Date: Sat, 17 Dec 2022 17:05:11 -0800 Subject: [PATCH 3/5] remove postgres special case from `reverse` test --- src/test/scala/slick/migration/api/DbTest.scala | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/test/scala/slick/migration/api/DbTest.scala b/src/test/scala/slick/migration/api/DbTest.scala index 782592ad..2646c561 100644 --- a/src/test/scala/slick/migration/api/DbTest.scala +++ b/src/test/scala/slick/migration/api/DbTest.scala @@ -262,17 +262,9 @@ abstract class DbTest[P <: JdbcProfile](val tdb: JdbcTestDB {val profile: P}) assert(reversed.sql(1).contains("STR_WITH_DEFAULT")) assert(reversed.sql(2).contains("drop table")) - try withBeforeAndAfter(reversed)(getTables) { (before, after) => - // Only postgres can remove all columns from a table - if (this.profile.isInstanceOf[PostgresProfile]) { - assert(before.contains("TEST_TABLE")) - assert(!after.contains("TEST_TABLE")) - } - } catch { - case _: Throwable => - if (!this.profile.isInstanceOf[PostgresProfile]) { - runMigration(tm.drop) - } + withBeforeAndAfter(reversed)(getTables) { (before, after) => + assert(before.contains("TEST_TABLE")) + assert(!after.contains("TEST_TABLE")) } } } From 9fc15c8289ecdbc6dbc3f84b1e272027e8b1bb99 Mon Sep 17 00:00:00 2001 From: Aaron Novstrup Date: Sat, 17 Dec 2022 17:20:44 -0800 Subject: [PATCH 4/5] remove unused import --- src/test/scala/slick/migration/api/DbTest.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/scala/slick/migration/api/DbTest.scala b/src/test/scala/slick/migration/api/DbTest.scala index 2646c561..0c829be6 100644 --- a/src/test/scala/slick/migration/api/DbTest.scala +++ b/src/test/scala/slick/migration/api/DbTest.scala @@ -7,7 +7,7 @@ import scala.concurrent.Await import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration.Duration import scala.util.control.NonFatal -import slick.jdbc.{HsqldbProfile, JdbcProfile, OracleProfile, PostgresProfile} +import slick.jdbc.{HsqldbProfile, JdbcProfile, OracleProfile} import slick.jdbc.meta._ import slick.lifted.AbstractTable import com.typesafe.slick.testkit.util.JdbcTestDB From 9b1d9e10dc1205469cfc38ca8f1e985870e29e58 Mon Sep 17 00:00:00 2001 From: Aaron Novstrup Date: Sat, 17 Dec 2022 17:34:46 -0800 Subject: [PATCH 5/5] fix test --- src/test/scala/slick/migration/api/DbTest.scala | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/test/scala/slick/migration/api/DbTest.scala b/src/test/scala/slick/migration/api/DbTest.scala index 0c829be6..8fba77fb 100644 --- a/src/test/scala/slick/migration/api/DbTest.scala +++ b/src/test/scala/slick/migration/api/DbTest.scala @@ -257,14 +257,12 @@ abstract class DbTest[P <: JdbcProfile](val tdb: JdbcTestDB {val profile: P}) val reversed = createTable.reverse - assert(reversed.sql.size === 3) - assert(reversed.sql.head.contains("ID")) - assert(reversed.sql(1).contains("STR_WITH_DEFAULT")) - assert(reversed.sql(2).contains("drop table")) + assert(reversed.sql.size === 1) + assert(reversed.sql.head.contains("drop table")) withBeforeAndAfter(reversed)(getTables) { (before, after) => - assert(before.contains("TEST_TABLE")) - assert(!after.contains("TEST_TABLE")) + assert(before.map(_.name.name).contains("TEST_TABLE")) + assert(!after.map(_.name.name).contains("TEST_TABLE")) } } }