@contember/schema-migrations 2.0.1 → 2.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/dist/development/src/MigrationDescriber.cjs +2 -1
  2. package/dist/development/src/MigrationDescriber.cjs.map +1 -1
  3. package/dist/development/src/MigrationDescriber.js +2 -1
  4. package/dist/development/src/MigrationDescriber.js.map +1 -1
  5. package/dist/development/src/modifications/columns/CreateColumnModification.cjs +2 -1
  6. package/dist/development/src/modifications/columns/CreateColumnModification.cjs.map +1 -1
  7. package/dist/development/src/modifications/columns/CreateColumnModification.js +2 -1
  8. package/dist/development/src/modifications/columns/CreateColumnModification.js.map +1 -1
  9. package/dist/development/src/modifications/columns/UpdateColumnDefinitionModification.cjs +8 -3
  10. package/dist/development/src/modifications/columns/UpdateColumnDefinitionModification.cjs.map +1 -1
  11. package/dist/development/src/modifications/columns/UpdateColumnDefinitionModification.js +8 -3
  12. package/dist/development/src/modifications/columns/UpdateColumnDefinitionModification.js.map +1 -1
  13. package/dist/development/src/modifications/constraints/CreateUniqueConstraintModification.cjs +15 -9
  14. package/dist/development/src/modifications/constraints/CreateUniqueConstraintModification.cjs.map +1 -1
  15. package/dist/development/src/modifications/constraints/CreateUniqueConstraintModification.js +15 -9
  16. package/dist/development/src/modifications/constraints/CreateUniqueConstraintModification.js.map +1 -1
  17. package/dist/development/src/modifications/constraints/RemoveUniqueConstraintModification.cjs +34 -16
  18. package/dist/development/src/modifications/constraints/RemoveUniqueConstraintModification.cjs.map +1 -1
  19. package/dist/development/src/modifications/constraints/RemoveUniqueConstraintModification.js +34 -16
  20. package/dist/development/src/modifications/constraints/RemoveUniqueConstraintModification.js.map +1 -1
  21. package/dist/development/src/modifications/entities/CreateEntityModification.cjs +2 -1
  22. package/dist/development/src/modifications/entities/CreateEntityModification.cjs.map +1 -1
  23. package/dist/development/src/modifications/entities/CreateEntityModification.js +2 -1
  24. package/dist/development/src/modifications/entities/CreateEntityModification.js.map +1 -1
  25. package/dist/development/src/modifications/entities/CreateViewModification.cjs +12 -2
  26. package/dist/development/src/modifications/entities/CreateViewModification.cjs.map +1 -1
  27. package/dist/development/src/modifications/entities/CreateViewModification.js +12 -2
  28. package/dist/development/src/modifications/entities/CreateViewModification.js.map +1 -1
  29. package/dist/development/src/modifications/indexes/CreateIndexModification.cjs +2 -2
  30. package/dist/development/src/modifications/indexes/CreateIndexModification.cjs.map +1 -1
  31. package/dist/development/src/modifications/indexes/CreateIndexModification.js +2 -2
  32. package/dist/development/src/modifications/indexes/CreateIndexModification.js.map +1 -1
  33. package/dist/development/src/modifications/indexes/RemoveIndexModification.cjs +3 -3
  34. package/dist/development/src/modifications/indexes/RemoveIndexModification.cjs.map +1 -1
  35. package/dist/development/src/modifications/indexes/RemoveIndexModification.js +3 -3
  36. package/dist/development/src/modifications/indexes/RemoveIndexModification.js.map +1 -1
  37. package/dist/development/src/modifications/upgrade/RemoveIndexNamesModification.cjs +8 -2
  38. package/dist/development/src/modifications/upgrade/RemoveIndexNamesModification.cjs.map +1 -1
  39. package/dist/development/src/modifications/upgrade/RemoveIndexNamesModification.js +8 -2
  40. package/dist/development/src/modifications/upgrade/RemoveIndexNamesModification.js.map +1 -1
  41. package/dist/development/src/modifications/utils/columnUtils.cjs +1 -1
  42. package/dist/development/src/modifications/utils/columnUtils.cjs.map +1 -1
  43. package/dist/development/src/modifications/utils/columnUtils.js +1 -1
  44. package/dist/development/src/modifications/utils/columnUtils.js.map +1 -1
  45. package/dist/development/src/modifications/utils/schemaUpdateUtils.cjs +1 -0
  46. package/dist/development/src/modifications/utils/schemaUpdateUtils.cjs.map +1 -1
  47. package/dist/development/src/modifications/utils/schemaUpdateUtils.js +1 -0
  48. package/dist/development/src/modifications/utils/schemaUpdateUtils.js.map +1 -1
  49. package/dist/production/src/MigrationDescriber.cjs +2 -1
  50. package/dist/production/src/MigrationDescriber.cjs.map +1 -1
  51. package/dist/production/src/MigrationDescriber.js +2 -1
  52. package/dist/production/src/MigrationDescriber.js.map +1 -1
  53. package/dist/production/src/modifications/columns/CreateColumnModification.cjs +2 -1
  54. package/dist/production/src/modifications/columns/CreateColumnModification.cjs.map +1 -1
  55. package/dist/production/src/modifications/columns/CreateColumnModification.js +2 -1
  56. package/dist/production/src/modifications/columns/CreateColumnModification.js.map +1 -1
  57. package/dist/production/src/modifications/columns/UpdateColumnDefinitionModification.cjs +8 -3
  58. package/dist/production/src/modifications/columns/UpdateColumnDefinitionModification.cjs.map +1 -1
  59. package/dist/production/src/modifications/columns/UpdateColumnDefinitionModification.js +8 -3
  60. package/dist/production/src/modifications/columns/UpdateColumnDefinitionModification.js.map +1 -1
  61. package/dist/production/src/modifications/constraints/CreateUniqueConstraintModification.cjs +15 -9
  62. package/dist/production/src/modifications/constraints/CreateUniqueConstraintModification.cjs.map +1 -1
  63. package/dist/production/src/modifications/constraints/CreateUniqueConstraintModification.js +15 -9
  64. package/dist/production/src/modifications/constraints/CreateUniqueConstraintModification.js.map +1 -1
  65. package/dist/production/src/modifications/constraints/RemoveUniqueConstraintModification.cjs +34 -16
  66. package/dist/production/src/modifications/constraints/RemoveUniqueConstraintModification.cjs.map +1 -1
  67. package/dist/production/src/modifications/constraints/RemoveUniqueConstraintModification.js +34 -16
  68. package/dist/production/src/modifications/constraints/RemoveUniqueConstraintModification.js.map +1 -1
  69. package/dist/production/src/modifications/entities/CreateEntityModification.cjs +2 -1
  70. package/dist/production/src/modifications/entities/CreateEntityModification.cjs.map +1 -1
  71. package/dist/production/src/modifications/entities/CreateEntityModification.js +2 -1
  72. package/dist/production/src/modifications/entities/CreateEntityModification.js.map +1 -1
  73. package/dist/production/src/modifications/entities/CreateViewModification.cjs +12 -2
  74. package/dist/production/src/modifications/entities/CreateViewModification.cjs.map +1 -1
  75. package/dist/production/src/modifications/entities/CreateViewModification.js +12 -2
  76. package/dist/production/src/modifications/entities/CreateViewModification.js.map +1 -1
  77. package/dist/production/src/modifications/indexes/CreateIndexModification.cjs +2 -2
  78. package/dist/production/src/modifications/indexes/CreateIndexModification.cjs.map +1 -1
  79. package/dist/production/src/modifications/indexes/CreateIndexModification.js +2 -2
  80. package/dist/production/src/modifications/indexes/CreateIndexModification.js.map +1 -1
  81. package/dist/production/src/modifications/indexes/RemoveIndexModification.cjs +3 -3
  82. package/dist/production/src/modifications/indexes/RemoveIndexModification.cjs.map +1 -1
  83. package/dist/production/src/modifications/indexes/RemoveIndexModification.js +3 -3
  84. package/dist/production/src/modifications/indexes/RemoveIndexModification.js.map +1 -1
  85. package/dist/production/src/modifications/upgrade/RemoveIndexNamesModification.cjs +8 -2
  86. package/dist/production/src/modifications/upgrade/RemoveIndexNamesModification.cjs.map +1 -1
  87. package/dist/production/src/modifications/upgrade/RemoveIndexNamesModification.js +8 -2
  88. package/dist/production/src/modifications/upgrade/RemoveIndexNamesModification.js.map +1 -1
  89. package/dist/production/src/modifications/utils/columnUtils.cjs +1 -1
  90. package/dist/production/src/modifications/utils/columnUtils.cjs.map +1 -1
  91. package/dist/production/src/modifications/utils/columnUtils.js +1 -1
  92. package/dist/production/src/modifications/utils/columnUtils.js.map +1 -1
  93. package/dist/production/src/modifications/utils/schemaUpdateUtils.cjs +1 -0
  94. package/dist/production/src/modifications/utils/schemaUpdateUtils.cjs.map +1 -1
  95. package/dist/production/src/modifications/utils/schemaUpdateUtils.js +1 -0
  96. package/dist/production/src/modifications/utils/schemaUpdateUtils.js.map +1 -1
  97. package/dist/tests/src/tags.d.ts.map +1 -1
  98. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  99. package/dist/types/Migration.d.ts.map +1 -1
  100. package/dist/types/modifications/ModificationHandler.d.ts.map +1 -1
  101. package/dist/types/modifications/columns/CreateColumnModification.d.ts.map +1 -1
  102. package/dist/types/modifications/columns/UpdateColumnDefinitionModification.d.ts.map +1 -1
  103. package/dist/types/modifications/columns/columnUtils.d.ts.map +1 -1
  104. package/dist/types/modifications/constraints/CreateUniqueConstraintModification.d.ts +2 -2
  105. package/dist/types/modifications/constraints/CreateUniqueConstraintModification.d.ts.map +1 -1
  106. package/dist/types/modifications/constraints/RemoveUniqueConstraintModification.d.ts +7 -2
  107. package/dist/types/modifications/constraints/RemoveUniqueConstraintModification.d.ts.map +1 -1
  108. package/dist/types/modifications/constraints/utils.d.ts.map +1 -1
  109. package/dist/types/modifications/entities/CreateEntityModification.d.ts.map +1 -1
  110. package/dist/types/modifications/entities/CreateViewModification.d.ts +1 -0
  111. package/dist/types/modifications/entities/CreateViewModification.d.ts.map +1 -1
  112. package/dist/types/modifications/enums/enumUtils.d.ts.map +1 -1
  113. package/dist/types/modifications/indexes/utils.d.ts.map +1 -1
  114. package/dist/types/modifications/relations/helpers.d.ts.map +1 -1
  115. package/dist/types/modifications/relations/normalization.d.ts.map +1 -1
  116. package/dist/types/modifications/upgrade/RemoveIndexNamesModification.d.ts.map +1 -1
  117. package/dist/types/modifications/utils/columnUtils.d.ts +1 -1
  118. package/dist/types/modifications/utils/columnUtils.d.ts.map +1 -1
  119. package/dist/types/modifications/utils/createJunctionTable.d.ts.map +1 -1
  120. package/dist/types/modifications/utils/diffUtils.d.ts.map +1 -1
  121. package/dist/types/modifications/utils/getPrimaryColumnType.d.ts.map +1 -1
  122. package/dist/types/modifications/utils/schemaUpdateUtils.d.ts.map +1 -1
  123. package/dist/types/modifications/utils/sqlUpdateUtils.d.ts.map +1 -1
  124. package/dist/types/modifications/utils/stringArrayEquals.d.ts.map +1 -1
  125. package/dist/types/modifications/utils/valueUtils.d.ts.map +1 -1
  126. package/dist/types/modifications/utils/viewDependencies.d.ts.map +1 -1
  127. package/dist/types/tsconfig.tsbuildinfo +1 -1
  128. package/dist/types/utils/PartialEntity.d.ts +1 -1
  129. package/dist/types/utils/PartialEntity.d.ts.map +1 -1
  130. package/dist/types/utils/dbHelpers.d.ts.map +1 -1
  131. package/dist/types/utils/isDefined.d.ts.map +1 -1
  132. package/dist/types/utils/isIt.d.ts.map +1 -1
  133. package/package.json +7 -7
  134. package/src/MigrationDescriber.ts +2 -2
  135. package/src/modifications/columns/CreateColumnModification.ts +1 -0
  136. package/src/modifications/columns/UpdateColumnDefinitionModification.ts +8 -3
  137. package/src/modifications/constraints/CreateUniqueConstraintModification.ts +19 -10
  138. package/src/modifications/constraints/RemoveUniqueConstraintModification.ts +52 -19
  139. package/src/modifications/entities/CreateEntityModification.ts +1 -0
  140. package/src/modifications/entities/CreateViewModification.ts +13 -2
  141. package/src/modifications/indexes/CreateIndexModification.ts +2 -2
  142. package/src/modifications/indexes/RemoveIndexModification.ts +3 -3
  143. package/src/modifications/upgrade/RemoveIndexNamesModification.ts +8 -2
  144. package/src/modifications/utils/columnUtils.ts +6 -3
  145. package/src/modifications/utils/schemaUpdateUtils.ts +1 -0
  146. package/src/utils/PartialEntity.ts +1 -1
  147. package/tests/cases/integration/convertManyHasOneToOneHasOneRelation.test.ts +1 -0
  148. package/tests/cases/integration/createAndDropIndex.test.ts +1 -0
  149. package/tests/cases/integration/createColumn.test.ts +27 -0
  150. package/tests/cases/integration/createEntity.test.ts +69 -0
  151. package/tests/cases/integration/createUnique.test.ts +91 -1
  152. package/tests/cases/integration/removeField.test.ts +6 -4
  153. package/tests/cases/integration/updateColumnDefinition.test.ts +27 -0
@@ -8,6 +8,7 @@ const exceptions = require("./modifications/exceptions.cjs");
8
8
  require("@contember/schema-utils");
9
9
  const databaseMigrations = require("@contember/database-migrations");
10
10
  const CreateEntityModification = require("./modifications/entities/CreateEntityModification.cjs");
11
+ const CreateViewModification = require("./modifications/entities/CreateViewModification.cjs");
11
12
  require("./modifications/ModificationHandlerFactory.cjs");
12
13
  class MigrationDescriber {
13
14
  constructor(modificationHandlerFactory) {
@@ -44,7 +45,7 @@ class MigrationDescriber {
44
45
  const result = [];
45
46
  const createdEntities = [];
46
47
  for (const modification of migration.modifications) {
47
- if (modification.modification === CreateEntityModification.createEntityModification.id) {
48
+ if (modification.modification === CreateEntityModification.createEntityModification.id || modification.modification === CreateViewModification.createViewModification.id) {
48
49
  createdEntities.push(modification.entity.name);
49
50
  }
50
51
  const description = this.describeModification(
@@ -1 +1 @@
1
- {"version":3,"file":"MigrationDescriber.cjs","sources":["../../../../packages/schema-migrations/src/MigrationDescriber.ts"],"sourcesContent":["import {\n\tcreateEntityModification,\n\temptyModificationDescriptionContext,\n\tModificationDescription,\n\tModificationDescriptionContext,\n\tModificationHandler,\n\tModificationHandlerCreateSqlOptions,\n\tModificationHandlerFactory,\n\tModificationHandlerOptions,\n\tSchemaUpdateError,\n} from './modifications'\nimport { createMigrationBuilder } from '@contember/database-migrations'\nimport { Migration } from './Migration'\nimport { Schema } from '@contember/schema'\n\nexport interface ModificationDescriptionResult {\n\tmodification: Migration.Modification\n\tschema: Schema\n\tdescription: ModificationDescription\n\thandler: ModificationHandler<any>\n\tgetSql: (options: ModificationHandlerCreateSqlOptions) => string\n}\n\nexport class MigrationDescriber {\n\tconstructor(private readonly modificationHandlerFactory: ModificationHandlerFactory) {\n\t}\n\n\tpublic describeModification(\n\t\tschema: Schema,\n\t\tmodification: Migration.Modification,\n\t\toptions: ModificationHandlerOptions,\n\t\tmodificationDescriptionContext: ModificationDescriptionContext = emptyModificationDescriptionContext,\n\t): ModificationDescriptionResult {\n\t\tconst modificationHandler = this.modificationHandlerFactory.create(\n\t\t\tmodification.modification,\n\t\t\tmodification,\n\t\t\tschema,\n\t\t\toptions,\n\t\t)\n\t\ttry {\n\t\t\tschema = modificationHandler.getSchemaUpdater()({ schema })\n\t\t} catch (e) {\n\t\t\tif (!(e instanceof SchemaUpdateError)) {\n\t\t\t\tthrow e\n\t\t\t}\n\t\t\tthrow new SchemaUpdateError(e.message + '\\n for modification: \\n' + JSON.stringify(modification))\n\t\t}\n\t\treturn {\n\t\t\tmodification,\n\t\t\tschema,\n\t\t\tgetSql: options => {\n\t\t\t\tconst builder = createMigrationBuilder()\n\t\t\t\tmodificationHandler.createSql(builder, options)\n\t\t\t\treturn builder.getSql()\n\t\t\t},\n\t\t\tdescription: modificationHandler.describe(modificationDescriptionContext),\n\t\t\thandler: modificationHandler,\n\t\t}\n\t}\n\n\tpublic describeModifications(schema: Schema, migration: Migration): ModificationDescriptionResult[] {\n\t\tconst result = []\n\t\tconst createdEntities = []\n\t\tfor (const modification of migration.modifications) {\n\t\t\tif (modification.modification === createEntityModification.id) {\n\t\t\t\tcreatedEntities.push(modification.entity.name)\n\t\t\t}\n\t\t\tconst description = this.describeModification(\n\t\t\t\tschema,\n\t\t\t\tmodification,\n\t\t\t\t{\n\t\t\t\t\tformatVersion: migration.formatVersion,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcreatedEntities,\n\t\t\t\t})\n\t\t\tschema = description.schema\n\t\t\tresult.push(description)\n\t\t}\n\t\treturn result\n\t}\n}\n"],"names":["emptyModificationDescriptionContext","SchemaUpdateError","options","createMigrationBuilder","createEntityModification"],"mappings":";;;;;;;;;;;AAuBO,MAAM,mBAAmB;AAAA,EAC/B,YAA6B,4BAAwD;AAAxD,SAAA,6BAAA;AAAA,EAAA;AAAA,EAGtB,qBACN,QACA,cACA,SACA,iCAAiEA,oBAAAA,qCACjC;AAC1B,UAAA,sBAAsB,KAAK,2BAA2B;AAAA,MAC3D,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACI,QAAA;AACH,eAAS,oBAAoB,mBAAmB,EAAE,QAAQ;AAAA,aAClD,GAAG;AACP,UAAA,EAAE,aAAaC,WAAAA,oBAAoB;AAChC,cAAA;AAAA,MAAA;AAED,YAAA,IAAIA,WAAAA,kBAAkB,EAAE,UAAU,4BAA4B,KAAK,UAAU,YAAY,CAAC;AAAA,IAAA;AAE1F,WAAA;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ,CAAAC,aAAW;AAClB,cAAM,UAAUC,mBAAAA,uBAAuB;AACnB,4BAAA,UAAU,SAASD,QAAO;AAC9C,eAAO,QAAQ,OAAO;AAAA,MACvB;AAAA,MACA,aAAa,oBAAoB,SAAS,8BAA8B;AAAA,MACxE,SAAS;AAAA,IACV;AAAA,EAAA;AAAA,EAGM,sBAAsB,QAAgB,WAAuD;AACnG,UAAM,SAAS,CAAC;AAChB,UAAM,kBAAkB,CAAC;AACd,eAAA,gBAAgB,UAAU,eAAe;AAC/C,UAAA,aAAa,iBAAiBE,yBAAA,yBAAyB,IAAI;AAC9C,wBAAA,KAAK,aAAa,OAAO,IAAI;AAAA,MAAA;AAE9C,YAAM,cAAc,KAAK;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,UACC,eAAe,UAAU;AAAA,QAC1B;AAAA,QACA;AAAA,UACC;AAAA,QAAA;AAAA,MACA;AACF,eAAS,YAAY;AACrB,aAAO,KAAK,WAAW;AAAA,IAAA;AAEjB,WAAA;AAAA,EAAA;AAET;;"}
1
+ {"version":3,"file":"MigrationDescriber.cjs","sources":["../../../../packages/schema-migrations/src/MigrationDescriber.ts"],"sourcesContent":["import {\n\tcreateEntityModification, createViewModification,\n\temptyModificationDescriptionContext,\n\tModificationDescription,\n\tModificationDescriptionContext,\n\tModificationHandler,\n\tModificationHandlerCreateSqlOptions,\n\tModificationHandlerFactory,\n\tModificationHandlerOptions,\n\tSchemaUpdateError,\n} from './modifications'\nimport { createMigrationBuilder } from '@contember/database-migrations'\nimport { Migration } from './Migration'\nimport { Schema } from '@contember/schema'\n\nexport interface ModificationDescriptionResult {\n\tmodification: Migration.Modification\n\tschema: Schema\n\tdescription: ModificationDescription\n\thandler: ModificationHandler<any>\n\tgetSql: (options: ModificationHandlerCreateSqlOptions) => string\n}\n\nexport class MigrationDescriber {\n\tconstructor(private readonly modificationHandlerFactory: ModificationHandlerFactory) {\n\t}\n\n\tpublic describeModification(\n\t\tschema: Schema,\n\t\tmodification: Migration.Modification,\n\t\toptions: ModificationHandlerOptions,\n\t\tmodificationDescriptionContext: ModificationDescriptionContext = emptyModificationDescriptionContext,\n\t): ModificationDescriptionResult {\n\t\tconst modificationHandler = this.modificationHandlerFactory.create(\n\t\t\tmodification.modification,\n\t\t\tmodification,\n\t\t\tschema,\n\t\t\toptions,\n\t\t)\n\t\ttry {\n\t\t\tschema = modificationHandler.getSchemaUpdater()({ schema })\n\t\t} catch (e) {\n\t\t\tif (!(e instanceof SchemaUpdateError)) {\n\t\t\t\tthrow e\n\t\t\t}\n\t\t\tthrow new SchemaUpdateError(e.message + '\\n for modification: \\n' + JSON.stringify(modification))\n\t\t}\n\t\treturn {\n\t\t\tmodification,\n\t\t\tschema,\n\t\t\tgetSql: options => {\n\t\t\t\tconst builder = createMigrationBuilder()\n\t\t\t\tmodificationHandler.createSql(builder, options)\n\t\t\t\treturn builder.getSql()\n\t\t\t},\n\t\t\tdescription: modificationHandler.describe(modificationDescriptionContext),\n\t\t\thandler: modificationHandler,\n\t\t}\n\t}\n\n\tpublic describeModifications(schema: Schema, migration: Migration): ModificationDescriptionResult[] {\n\t\tconst result = []\n\t\tconst createdEntities = []\n\t\tfor (const modification of migration.modifications) {\n\t\t\tif (modification.modification === createEntityModification.id || modification.modification === createViewModification.id) {\n\t\t\t\tcreatedEntities.push(modification.entity.name)\n\t\t\t}\n\t\t\tconst description = this.describeModification(\n\t\t\t\tschema,\n\t\t\t\tmodification,\n\t\t\t\t{\n\t\t\t\t\tformatVersion: migration.formatVersion,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcreatedEntities,\n\t\t\t\t})\n\t\t\tschema = description.schema\n\t\t\tresult.push(description)\n\t\t}\n\t\treturn result\n\t}\n}\n"],"names":["emptyModificationDescriptionContext","SchemaUpdateError","options","createMigrationBuilder","createEntityModification","createViewModification"],"mappings":";;;;;;;;;;;;AAuBO,MAAM,mBAAmB;AAAA,EAC/B,YAA6B,4BAAwD;AAAxD,SAAA,6BAAA;AAAA,EAAA;AAAA,EAGtB,qBACN,QACA,cACA,SACA,iCAAiEA,oBAAAA,qCACjC;AAC1B,UAAA,sBAAsB,KAAK,2BAA2B;AAAA,MAC3D,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACI,QAAA;AACH,eAAS,oBAAoB,mBAAmB,EAAE,QAAQ;AAAA,aAClD,GAAG;AACP,UAAA,EAAE,aAAaC,WAAAA,oBAAoB;AAChC,cAAA;AAAA,MAAA;AAED,YAAA,IAAIA,WAAAA,kBAAkB,EAAE,UAAU,4BAA4B,KAAK,UAAU,YAAY,CAAC;AAAA,IAAA;AAE1F,WAAA;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ,CAAAC,aAAW;AAClB,cAAM,UAAUC,mBAAAA,uBAAuB;AACnB,4BAAA,UAAU,SAASD,QAAO;AAC9C,eAAO,QAAQ,OAAO;AAAA,MACvB;AAAA,MACA,aAAa,oBAAoB,SAAS,8BAA8B;AAAA,MACxE,SAAS;AAAA,IACV;AAAA,EAAA;AAAA,EAGM,sBAAsB,QAAgB,WAAuD;AACnG,UAAM,SAAS,CAAC;AAChB,UAAM,kBAAkB,CAAC;AACd,eAAA,gBAAgB,UAAU,eAAe;AACnD,UAAI,aAAa,iBAAiBE,kDAAyB,MAAM,aAAa,iBAAiBC,8CAAuB,IAAI;AACzG,wBAAA,KAAK,aAAa,OAAO,IAAI;AAAA,MAAA;AAE9C,YAAM,cAAc,KAAK;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,UACC,eAAe,UAAU;AAAA,QAC1B;AAAA,QACA;AAAA,UACC;AAAA,QAAA;AAAA,MACA;AACF,eAAS,YAAY;AACrB,aAAO,KAAK,WAAW;AAAA,IAAA;AAEjB,WAAA;AAAA,EAAA;AAET;;"}
@@ -6,6 +6,7 @@ import { SchemaUpdateError } from "./modifications/exceptions.js";
6
6
  import "@contember/schema-utils";
7
7
  import { createMigrationBuilder } from "@contember/database-migrations";
8
8
  import { createEntityModification } from "./modifications/entities/CreateEntityModification.js";
9
+ import { createViewModification } from "./modifications/entities/CreateViewModification.js";
9
10
  import "./modifications/ModificationHandlerFactory.js";
10
11
  class MigrationDescriber {
11
12
  constructor(modificationHandlerFactory) {
@@ -42,7 +43,7 @@ class MigrationDescriber {
42
43
  const result = [];
43
44
  const createdEntities = [];
44
45
  for (const modification of migration.modifications) {
45
- if (modification.modification === createEntityModification.id) {
46
+ if (modification.modification === createEntityModification.id || modification.modification === createViewModification.id) {
46
47
  createdEntities.push(modification.entity.name);
47
48
  }
48
49
  const description = this.describeModification(
@@ -1 +1 @@
1
- {"version":3,"file":"MigrationDescriber.js","sources":["../../../../packages/schema-migrations/src/MigrationDescriber.ts"],"sourcesContent":["import {\n\tcreateEntityModification,\n\temptyModificationDescriptionContext,\n\tModificationDescription,\n\tModificationDescriptionContext,\n\tModificationHandler,\n\tModificationHandlerCreateSqlOptions,\n\tModificationHandlerFactory,\n\tModificationHandlerOptions,\n\tSchemaUpdateError,\n} from './modifications'\nimport { createMigrationBuilder } from '@contember/database-migrations'\nimport { Migration } from './Migration'\nimport { Schema } from '@contember/schema'\n\nexport interface ModificationDescriptionResult {\n\tmodification: Migration.Modification\n\tschema: Schema\n\tdescription: ModificationDescription\n\thandler: ModificationHandler<any>\n\tgetSql: (options: ModificationHandlerCreateSqlOptions) => string\n}\n\nexport class MigrationDescriber {\n\tconstructor(private readonly modificationHandlerFactory: ModificationHandlerFactory) {\n\t}\n\n\tpublic describeModification(\n\t\tschema: Schema,\n\t\tmodification: Migration.Modification,\n\t\toptions: ModificationHandlerOptions,\n\t\tmodificationDescriptionContext: ModificationDescriptionContext = emptyModificationDescriptionContext,\n\t): ModificationDescriptionResult {\n\t\tconst modificationHandler = this.modificationHandlerFactory.create(\n\t\t\tmodification.modification,\n\t\t\tmodification,\n\t\t\tschema,\n\t\t\toptions,\n\t\t)\n\t\ttry {\n\t\t\tschema = modificationHandler.getSchemaUpdater()({ schema })\n\t\t} catch (e) {\n\t\t\tif (!(e instanceof SchemaUpdateError)) {\n\t\t\t\tthrow e\n\t\t\t}\n\t\t\tthrow new SchemaUpdateError(e.message + '\\n for modification: \\n' + JSON.stringify(modification))\n\t\t}\n\t\treturn {\n\t\t\tmodification,\n\t\t\tschema,\n\t\t\tgetSql: options => {\n\t\t\t\tconst builder = createMigrationBuilder()\n\t\t\t\tmodificationHandler.createSql(builder, options)\n\t\t\t\treturn builder.getSql()\n\t\t\t},\n\t\t\tdescription: modificationHandler.describe(modificationDescriptionContext),\n\t\t\thandler: modificationHandler,\n\t\t}\n\t}\n\n\tpublic describeModifications(schema: Schema, migration: Migration): ModificationDescriptionResult[] {\n\t\tconst result = []\n\t\tconst createdEntities = []\n\t\tfor (const modification of migration.modifications) {\n\t\t\tif (modification.modification === createEntityModification.id) {\n\t\t\t\tcreatedEntities.push(modification.entity.name)\n\t\t\t}\n\t\t\tconst description = this.describeModification(\n\t\t\t\tschema,\n\t\t\t\tmodification,\n\t\t\t\t{\n\t\t\t\t\tformatVersion: migration.formatVersion,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcreatedEntities,\n\t\t\t\t})\n\t\t\tschema = description.schema\n\t\t\tresult.push(description)\n\t\t}\n\t\treturn result\n\t}\n}\n"],"names":["options"],"mappings":";;;;;;;;;AAuBO,MAAM,mBAAmB;AAAA,EAC/B,YAA6B,4BAAwD;AAAxD,SAAA,6BAAA;AAAA,EAAA;AAAA,EAGtB,qBACN,QACA,cACA,SACA,iCAAiE,qCACjC;AAC1B,UAAA,sBAAsB,KAAK,2BAA2B;AAAA,MAC3D,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACI,QAAA;AACH,eAAS,oBAAoB,mBAAmB,EAAE,QAAQ;AAAA,aAClD,GAAG;AACP,UAAA,EAAE,aAAa,oBAAoB;AAChC,cAAA;AAAA,MAAA;AAED,YAAA,IAAI,kBAAkB,EAAE,UAAU,4BAA4B,KAAK,UAAU,YAAY,CAAC;AAAA,IAAA;AAE1F,WAAA;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ,CAAAA,aAAW;AAClB,cAAM,UAAU,uBAAuB;AACnB,4BAAA,UAAU,SAASA,QAAO;AAC9C,eAAO,QAAQ,OAAO;AAAA,MACvB;AAAA,MACA,aAAa,oBAAoB,SAAS,8BAA8B;AAAA,MACxE,SAAS;AAAA,IACV;AAAA,EAAA;AAAA,EAGM,sBAAsB,QAAgB,WAAuD;AACnG,UAAM,SAAS,CAAC;AAChB,UAAM,kBAAkB,CAAC;AACd,eAAA,gBAAgB,UAAU,eAAe;AAC/C,UAAA,aAAa,iBAAiB,yBAAyB,IAAI;AAC9C,wBAAA,KAAK,aAAa,OAAO,IAAI;AAAA,MAAA;AAE9C,YAAM,cAAc,KAAK;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,UACC,eAAe,UAAU;AAAA,QAC1B;AAAA,QACA;AAAA,UACC;AAAA,QAAA;AAAA,MACA;AACF,eAAS,YAAY;AACrB,aAAO,KAAK,WAAW;AAAA,IAAA;AAEjB,WAAA;AAAA,EAAA;AAET;"}
1
+ {"version":3,"file":"MigrationDescriber.js","sources":["../../../../packages/schema-migrations/src/MigrationDescriber.ts"],"sourcesContent":["import {\n\tcreateEntityModification, createViewModification,\n\temptyModificationDescriptionContext,\n\tModificationDescription,\n\tModificationDescriptionContext,\n\tModificationHandler,\n\tModificationHandlerCreateSqlOptions,\n\tModificationHandlerFactory,\n\tModificationHandlerOptions,\n\tSchemaUpdateError,\n} from './modifications'\nimport { createMigrationBuilder } from '@contember/database-migrations'\nimport { Migration } from './Migration'\nimport { Schema } from '@contember/schema'\n\nexport interface ModificationDescriptionResult {\n\tmodification: Migration.Modification\n\tschema: Schema\n\tdescription: ModificationDescription\n\thandler: ModificationHandler<any>\n\tgetSql: (options: ModificationHandlerCreateSqlOptions) => string\n}\n\nexport class MigrationDescriber {\n\tconstructor(private readonly modificationHandlerFactory: ModificationHandlerFactory) {\n\t}\n\n\tpublic describeModification(\n\t\tschema: Schema,\n\t\tmodification: Migration.Modification,\n\t\toptions: ModificationHandlerOptions,\n\t\tmodificationDescriptionContext: ModificationDescriptionContext = emptyModificationDescriptionContext,\n\t): ModificationDescriptionResult {\n\t\tconst modificationHandler = this.modificationHandlerFactory.create(\n\t\t\tmodification.modification,\n\t\t\tmodification,\n\t\t\tschema,\n\t\t\toptions,\n\t\t)\n\t\ttry {\n\t\t\tschema = modificationHandler.getSchemaUpdater()({ schema })\n\t\t} catch (e) {\n\t\t\tif (!(e instanceof SchemaUpdateError)) {\n\t\t\t\tthrow e\n\t\t\t}\n\t\t\tthrow new SchemaUpdateError(e.message + '\\n for modification: \\n' + JSON.stringify(modification))\n\t\t}\n\t\treturn {\n\t\t\tmodification,\n\t\t\tschema,\n\t\t\tgetSql: options => {\n\t\t\t\tconst builder = createMigrationBuilder()\n\t\t\t\tmodificationHandler.createSql(builder, options)\n\t\t\t\treturn builder.getSql()\n\t\t\t},\n\t\t\tdescription: modificationHandler.describe(modificationDescriptionContext),\n\t\t\thandler: modificationHandler,\n\t\t}\n\t}\n\n\tpublic describeModifications(schema: Schema, migration: Migration): ModificationDescriptionResult[] {\n\t\tconst result = []\n\t\tconst createdEntities = []\n\t\tfor (const modification of migration.modifications) {\n\t\t\tif (modification.modification === createEntityModification.id || modification.modification === createViewModification.id) {\n\t\t\t\tcreatedEntities.push(modification.entity.name)\n\t\t\t}\n\t\t\tconst description = this.describeModification(\n\t\t\t\tschema,\n\t\t\t\tmodification,\n\t\t\t\t{\n\t\t\t\t\tformatVersion: migration.formatVersion,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcreatedEntities,\n\t\t\t\t})\n\t\t\tschema = description.schema\n\t\t\tresult.push(description)\n\t\t}\n\t\treturn result\n\t}\n}\n"],"names":["options"],"mappings":";;;;;;;;;;AAuBO,MAAM,mBAAmB;AAAA,EAC/B,YAA6B,4BAAwD;AAAxD,SAAA,6BAAA;AAAA,EAAA;AAAA,EAGtB,qBACN,QACA,cACA,SACA,iCAAiE,qCACjC;AAC1B,UAAA,sBAAsB,KAAK,2BAA2B;AAAA,MAC3D,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACI,QAAA;AACH,eAAS,oBAAoB,mBAAmB,EAAE,QAAQ;AAAA,aAClD,GAAG;AACP,UAAA,EAAE,aAAa,oBAAoB;AAChC,cAAA;AAAA,MAAA;AAED,YAAA,IAAI,kBAAkB,EAAE,UAAU,4BAA4B,KAAK,UAAU,YAAY,CAAC;AAAA,IAAA;AAE1F,WAAA;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ,CAAAA,aAAW;AAClB,cAAM,UAAU,uBAAuB;AACnB,4BAAA,UAAU,SAASA,QAAO;AAC9C,eAAO,QAAQ,OAAO;AAAA,MACvB;AAAA,MACA,aAAa,oBAAoB,SAAS,8BAA8B;AAAA,MACxE,SAAS;AAAA,IACV;AAAA,EAAA;AAAA,EAGM,sBAAsB,QAAgB,WAAuD;AACnG,UAAM,SAAS,CAAC;AAChB,UAAM,kBAAkB,CAAC;AACd,eAAA,gBAAgB,UAAU,eAAe;AACnD,UAAI,aAAa,iBAAiB,yBAAyB,MAAM,aAAa,iBAAiB,uBAAuB,IAAI;AACzG,wBAAA,KAAK,aAAa,OAAO,IAAI;AAAA,MAAA;AAE9C,YAAM,cAAc,KAAK;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,UACC,eAAe,UAAU;AAAA,QAC1B;AAAA,QACA;AAAA,UACC;AAAA,QAAA;AAAA,MACA;AACF,eAAS,YAAY;AACrB,aAAO,KAAK,WAAW;AAAA,IAAA;AAEjB,WAAA;AAAA,EAAA;AAET;"}
@@ -29,7 +29,8 @@ class CreateColumnModificationHandler {
29
29
  [column.columnName]: {
30
30
  type: columnType,
31
31
  notNull: !column.nullable && seedExpression === null,
32
- sequenceGenerated: column.sequence
32
+ sequenceGenerated: column.sequence,
33
+ collation: column.collation
33
34
  }
34
35
  });
35
36
  if (seedExpression !== null) {
@@ -1 +1 @@
1
- {"version":3,"file":"CreateColumnModification.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/columns/CreateColumnModification.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\nimport { JSONValue, Model, Schema } from '@contember/schema'\nimport { addField, SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'\nimport { isColumn } from '@contember/schema-utils'\nimport { createFields } from '../utils/diffUtils'\nimport { getColumnSqlType } from '../utils/columnUtils'\nimport { fillSeed, formatSeedExpression } from './columnUtils'\n\nexport class CreateColumnModificationHandler implements ModificationHandler<CreateColumnModificationData> {\n\tconstructor(private readonly data: CreateColumnModificationData, private readonly schema: Schema) {}\n\n\tpublic createSql(builder: MigrationBuilder): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tif (entity.view) {\n\t\t\treturn\n\t\t}\n\t\tconst column = this.data.field\n\n\t\tconst columnType = getColumnSqlType(column)\n\n\t\tconst seedExpression = formatSeedExpression({\n\t\t\tmodel: this.schema.model,\n\t\t\tentity,\n\t\t\tcolumnType,\n\t\t\tfillValue: this.data.fillValue,\n\t\t\tcopyValue: this.data.copyValue,\n\t\t})\n\n\n\t\tbuilder.addColumn(entity.tableName, {\n\t\t\t[column.columnName]: {\n\t\t\t\ttype: columnType,\n\t\t\t\tnotNull: !column.nullable && seedExpression === null,\n\t\t\t\tsequenceGenerated: column.sequence,\n\t\t\t},\n\t\t})\n\n\t\tif (seedExpression !== null) {\n\t\t\tif (this.data.valueMigrationStrategy === 'using') {\n\t\t\t\tbuilder.alterColumn(entity.tableName, column.columnName, {\n\t\t\t\t\tnotNull: !column.nullable ? true : undefined,\n\t\t\t\t\ttype: columnType,\n\t\t\t\t\tusing: seedExpression,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tfillSeed({\n\t\t\t\t\tbuilder,\n\t\t\t\t\ttype: 'creating',\n\t\t\t\t\tentity,\n\t\t\t\t\tcolumnName: column.columnName,\n\t\t\t\t\tnullable: column.nullable,\n\t\t\t\t\tseedExpression,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(updateEntity(this.data.entityName, addField(this.data.field)))\n\t}\n\n\tdescribe({ createdEntities }: { createdEntities: string[] }) {\n\t\tconst notNull = !this.data.field.nullable\n\t\tconst hasValue = this.data.fillValue !== undefined || this.data.copyValue !== undefined\n\t\tconst failureWarning =\n\t\t\tnotNull && !hasValue && !createdEntities.includes(this.data.entityName)\n\t\t\t\t? 'May fail in runtime, because column is not-null. Consider setting fillValue or copyValue'\n\t\t\t\t: undefined\n\t\treturn { message: `Add field ${this.data.entityName}.${this.data.field.name}`, failureWarning }\n\t}\n}\n\nexport interface CreateColumnModificationData {\n\tentityName: string\n\tfield: Model.AnyColumn\n\tfillValue?: JSONValue\n\tcopyValue?: string\n\tvalueMigrationStrategy?: 'using' | 'update'\n}\n\n\nexport const createColumnModification = createModificationType({\n\tid: 'createColumn',\n\thandler: CreateColumnModificationHandler,\n})\n\nexport class CreateColumnDiffer implements Differ {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn createFields(originalSchema, updatedSchema, ({ newField, updatedEntity }) => {\n\t\t\tif (!isColumn(newField)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn createColumnModification.createModification({\n\t\t\t\tentityName: updatedEntity.name,\n\t\t\t\tfield: newField,\n\t\t\t\t...(newField.default !== undefined ? { fillValue: newField.default, valueMigrationStrategy: 'using' } : {}),\n\t\t\t})\n\t\t})\n\t}\n}\n"],"names":["getColumnSqlType","formatSeedExpression","fillSeed","updateModel","updateEntity","addField","createModificationType","createFields","isColumn"],"mappings":";;;;;;;;AASO,MAAM,gCAA6F;AAAA,EACzG,YAA6B,MAAqD,QAAgB;AAArE,SAAA,OAAA;AAAqD,SAAA,SAAA;AAAA,EAAA;AAAA,EAE3E,UAAU,SAAiC;AACjD,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AAC9D,QAAI,OAAO,MAAM;AAChB;AAAA,IAAA;AAEK,UAAA,SAAS,KAAK,KAAK;AAEnB,UAAA,aAAaA,6BAAiB,MAAM;AAE1C,UAAM,iBAAiBC,cAAAA,qBAAqB;AAAA,MAC3C,OAAO,KAAK,OAAO;AAAA,MACnB;AAAA,MACA;AAAA,MACA,WAAW,KAAK,KAAK;AAAA,MACrB,WAAW,KAAK,KAAK;AAAA,IAAA,CACrB;AAGO,YAAA,UAAU,OAAO,WAAW;AAAA,MACnC,CAAC,OAAO,UAAU,GAAG;AAAA,QACpB,MAAM;AAAA,QACN,SAAS,CAAC,OAAO,YAAY,mBAAmB;AAAA,QAChD,mBAAmB,OAAO;AAAA,MAAA;AAAA,IAC3B,CACA;AAED,QAAI,mBAAmB,MAAM;AACxB,UAAA,KAAK,KAAK,2BAA2B,SAAS;AACjD,gBAAQ,YAAY,OAAO,WAAW,OAAO,YAAY;AAAA,UACxD,SAAS,CAAC,OAAO,WAAW,OAAO;AAAA,UACnC,MAAM;AAAA,UACN,OAAO;AAAA,QAAA,CACP;AAAA,MAAA,OACK;AACGC,+BAAA;AAAA,UACR;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,YAAY,OAAO;AAAA,UACnB,UAAU,OAAO;AAAA,UACjB;AAAA,QAAA,CACA;AAAA,MAAA;AAAA,IACF;AAAA,EACD;AAAA,EAGM,mBAAkC;AACjC,WAAAC,8BAAYC,kBAAAA,aAAa,KAAK,KAAK,YAAYC,2BAAS,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,EAAA;AAAA,EAGjF,SAAS,EAAE,mBAAkD;AAC5D,UAAM,UAAU,CAAC,KAAK,KAAK,MAAM;AACjC,UAAM,WAAW,KAAK,KAAK,cAAc,UAAa,KAAK,KAAK,cAAc;AACxE,UAAA,iBACL,WAAW,CAAC,YAAY,CAAC,gBAAgB,SAAS,KAAK,KAAK,UAAU,IACnE,6FACA;AACJ,WAAO,EAAE,SAAS,aAAa,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,eAAe;AAAA,EAAA;AAEhG;AAWO,MAAM,2BAA2BC,oBAAAA,uBAAuB;AAAA,EAC9D,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAEM,MAAM,mBAAqC;AAAA,EACjD,WAAW,gBAAwB,eAAuB;AACzD,WAAOC,UAAAA,aAAa,gBAAgB,eAAe,CAAC,EAAE,UAAU,oBAAoB;AAC/E,UAAA,CAACC,YAAAA,SAAS,QAAQ,GAAG;AACjB,eAAA;AAAA,MAAA;AAER,aAAO,yBAAyB,mBAAmB;AAAA,QAClD,YAAY,cAAc;AAAA,QAC1B,OAAO;AAAA,QACP,GAAI,SAAS,YAAY,SAAY,EAAE,WAAW,SAAS,SAAS,wBAAwB,YAAY,CAAA;AAAA,MAAC,CACzG;AAAA,IAAA,CACD;AAAA,EAAA;AAEH;;;;"}
1
+ {"version":3,"file":"CreateColumnModification.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/columns/CreateColumnModification.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\nimport { JSONValue, Model, Schema } from '@contember/schema'\nimport { addField, SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'\nimport { isColumn } from '@contember/schema-utils'\nimport { createFields } from '../utils/diffUtils'\nimport { getColumnSqlType } from '../utils/columnUtils'\nimport { fillSeed, formatSeedExpression } from './columnUtils'\n\nexport class CreateColumnModificationHandler implements ModificationHandler<CreateColumnModificationData> {\n\tconstructor(private readonly data: CreateColumnModificationData, private readonly schema: Schema) {}\n\n\tpublic createSql(builder: MigrationBuilder): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tif (entity.view) {\n\t\t\treturn\n\t\t}\n\t\tconst column = this.data.field\n\n\t\tconst columnType = getColumnSqlType(column)\n\n\t\tconst seedExpression = formatSeedExpression({\n\t\t\tmodel: this.schema.model,\n\t\t\tentity,\n\t\t\tcolumnType,\n\t\t\tfillValue: this.data.fillValue,\n\t\t\tcopyValue: this.data.copyValue,\n\t\t})\n\n\n\t\tbuilder.addColumn(entity.tableName, {\n\t\t\t[column.columnName]: {\n\t\t\t\ttype: columnType,\n\t\t\t\tnotNull: !column.nullable && seedExpression === null,\n\t\t\t\tsequenceGenerated: column.sequence,\n\t\t\t\tcollation: column.collation,\n\t\t\t},\n\t\t})\n\n\t\tif (seedExpression !== null) {\n\t\t\tif (this.data.valueMigrationStrategy === 'using') {\n\t\t\t\tbuilder.alterColumn(entity.tableName, column.columnName, {\n\t\t\t\t\tnotNull: !column.nullable ? true : undefined,\n\t\t\t\t\ttype: columnType,\n\t\t\t\t\tusing: seedExpression,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tfillSeed({\n\t\t\t\t\tbuilder,\n\t\t\t\t\ttype: 'creating',\n\t\t\t\t\tentity,\n\t\t\t\t\tcolumnName: column.columnName,\n\t\t\t\t\tnullable: column.nullable,\n\t\t\t\t\tseedExpression,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(updateEntity(this.data.entityName, addField(this.data.field)))\n\t}\n\n\tdescribe({ createdEntities }: { createdEntities: string[] }) {\n\t\tconst notNull = !this.data.field.nullable\n\t\tconst hasValue = this.data.fillValue !== undefined || this.data.copyValue !== undefined\n\t\tconst failureWarning =\n\t\t\tnotNull && !hasValue && !createdEntities.includes(this.data.entityName)\n\t\t\t\t? 'May fail in runtime, because column is not-null. Consider setting fillValue or copyValue'\n\t\t\t\t: undefined\n\t\treturn { message: `Add field ${this.data.entityName}.${this.data.field.name}`, failureWarning }\n\t}\n}\n\nexport interface CreateColumnModificationData {\n\tentityName: string\n\tfield: Model.AnyColumn\n\tfillValue?: JSONValue\n\tcopyValue?: string\n\tvalueMigrationStrategy?: 'using' | 'update'\n}\n\n\nexport const createColumnModification = createModificationType({\n\tid: 'createColumn',\n\thandler: CreateColumnModificationHandler,\n})\n\nexport class CreateColumnDiffer implements Differ {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn createFields(originalSchema, updatedSchema, ({ newField, updatedEntity }) => {\n\t\t\tif (!isColumn(newField)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn createColumnModification.createModification({\n\t\t\t\tentityName: updatedEntity.name,\n\t\t\t\tfield: newField,\n\t\t\t\t...(newField.default !== undefined ? { fillValue: newField.default, valueMigrationStrategy: 'using' } : {}),\n\t\t\t})\n\t\t})\n\t}\n}\n"],"names":["getColumnSqlType","formatSeedExpression","fillSeed","updateModel","updateEntity","addField","createModificationType","createFields","isColumn"],"mappings":";;;;;;;;AASO,MAAM,gCAA6F;AAAA,EACzG,YAA6B,MAAqD,QAAgB;AAArE,SAAA,OAAA;AAAqD,SAAA,SAAA;AAAA,EAAA;AAAA,EAE3E,UAAU,SAAiC;AACjD,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AAC9D,QAAI,OAAO,MAAM;AAChB;AAAA,IAAA;AAEK,UAAA,SAAS,KAAK,KAAK;AAEnB,UAAA,aAAaA,6BAAiB,MAAM;AAE1C,UAAM,iBAAiBC,cAAAA,qBAAqB;AAAA,MAC3C,OAAO,KAAK,OAAO;AAAA,MACnB;AAAA,MACA;AAAA,MACA,WAAW,KAAK,KAAK;AAAA,MACrB,WAAW,KAAK,KAAK;AAAA,IAAA,CACrB;AAGO,YAAA,UAAU,OAAO,WAAW;AAAA,MACnC,CAAC,OAAO,UAAU,GAAG;AAAA,QACpB,MAAM;AAAA,QACN,SAAS,CAAC,OAAO,YAAY,mBAAmB;AAAA,QAChD,mBAAmB,OAAO;AAAA,QAC1B,WAAW,OAAO;AAAA,MAAA;AAAA,IACnB,CACA;AAED,QAAI,mBAAmB,MAAM;AACxB,UAAA,KAAK,KAAK,2BAA2B,SAAS;AACjD,gBAAQ,YAAY,OAAO,WAAW,OAAO,YAAY;AAAA,UACxD,SAAS,CAAC,OAAO,WAAW,OAAO;AAAA,UACnC,MAAM;AAAA,UACN,OAAO;AAAA,QAAA,CACP;AAAA,MAAA,OACK;AACGC,+BAAA;AAAA,UACR;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,YAAY,OAAO;AAAA,UACnB,UAAU,OAAO;AAAA,UACjB;AAAA,QAAA,CACA;AAAA,MAAA;AAAA,IACF;AAAA,EACD;AAAA,EAGM,mBAAkC;AACjC,WAAAC,8BAAYC,kBAAAA,aAAa,KAAK,KAAK,YAAYC,2BAAS,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,EAAA;AAAA,EAGjF,SAAS,EAAE,mBAAkD;AAC5D,UAAM,UAAU,CAAC,KAAK,KAAK,MAAM;AACjC,UAAM,WAAW,KAAK,KAAK,cAAc,UAAa,KAAK,KAAK,cAAc;AACxE,UAAA,iBACL,WAAW,CAAC,YAAY,CAAC,gBAAgB,SAAS,KAAK,KAAK,UAAU,IACnE,6FACA;AACJ,WAAO,EAAE,SAAS,aAAa,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,eAAe;AAAA,EAAA;AAEhG;AAWO,MAAM,2BAA2BC,oBAAAA,uBAAuB;AAAA,EAC9D,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAEM,MAAM,mBAAqC;AAAA,EACjD,WAAW,gBAAwB,eAAuB;AACzD,WAAOC,UAAAA,aAAa,gBAAgB,eAAe,CAAC,EAAE,UAAU,oBAAoB;AAC/E,UAAA,CAACC,YAAAA,SAAS,QAAQ,GAAG;AACjB,eAAA;AAAA,MAAA;AAER,aAAO,yBAAyB,mBAAmB;AAAA,QAClD,YAAY,cAAc;AAAA,QAC1B,OAAO;AAAA,QACP,GAAI,SAAS,YAAY,SAAY,EAAE,WAAW,SAAS,SAAS,wBAAwB,YAAY,CAAA;AAAA,MAAC,CACzG;AAAA,IAAA,CACD;AAAA,EAAA;AAEH;;;;"}
@@ -27,7 +27,8 @@ class CreateColumnModificationHandler {
27
27
  [column.columnName]: {
28
28
  type: columnType,
29
29
  notNull: !column.nullable && seedExpression === null,
30
- sequenceGenerated: column.sequence
30
+ sequenceGenerated: column.sequence,
31
+ collation: column.collation
31
32
  }
32
33
  });
33
34
  if (seedExpression !== null) {
@@ -1 +1 @@
1
- {"version":3,"file":"CreateColumnModification.js","sources":["../../../../../../packages/schema-migrations/src/modifications/columns/CreateColumnModification.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\nimport { JSONValue, Model, Schema } from '@contember/schema'\nimport { addField, SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'\nimport { isColumn } from '@contember/schema-utils'\nimport { createFields } from '../utils/diffUtils'\nimport { getColumnSqlType } from '../utils/columnUtils'\nimport { fillSeed, formatSeedExpression } from './columnUtils'\n\nexport class CreateColumnModificationHandler implements ModificationHandler<CreateColumnModificationData> {\n\tconstructor(private readonly data: CreateColumnModificationData, private readonly schema: Schema) {}\n\n\tpublic createSql(builder: MigrationBuilder): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tif (entity.view) {\n\t\t\treturn\n\t\t}\n\t\tconst column = this.data.field\n\n\t\tconst columnType = getColumnSqlType(column)\n\n\t\tconst seedExpression = formatSeedExpression({\n\t\t\tmodel: this.schema.model,\n\t\t\tentity,\n\t\t\tcolumnType,\n\t\t\tfillValue: this.data.fillValue,\n\t\t\tcopyValue: this.data.copyValue,\n\t\t})\n\n\n\t\tbuilder.addColumn(entity.tableName, {\n\t\t\t[column.columnName]: {\n\t\t\t\ttype: columnType,\n\t\t\t\tnotNull: !column.nullable && seedExpression === null,\n\t\t\t\tsequenceGenerated: column.sequence,\n\t\t\t},\n\t\t})\n\n\t\tif (seedExpression !== null) {\n\t\t\tif (this.data.valueMigrationStrategy === 'using') {\n\t\t\t\tbuilder.alterColumn(entity.tableName, column.columnName, {\n\t\t\t\t\tnotNull: !column.nullable ? true : undefined,\n\t\t\t\t\ttype: columnType,\n\t\t\t\t\tusing: seedExpression,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tfillSeed({\n\t\t\t\t\tbuilder,\n\t\t\t\t\ttype: 'creating',\n\t\t\t\t\tentity,\n\t\t\t\t\tcolumnName: column.columnName,\n\t\t\t\t\tnullable: column.nullable,\n\t\t\t\t\tseedExpression,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(updateEntity(this.data.entityName, addField(this.data.field)))\n\t}\n\n\tdescribe({ createdEntities }: { createdEntities: string[] }) {\n\t\tconst notNull = !this.data.field.nullable\n\t\tconst hasValue = this.data.fillValue !== undefined || this.data.copyValue !== undefined\n\t\tconst failureWarning =\n\t\t\tnotNull && !hasValue && !createdEntities.includes(this.data.entityName)\n\t\t\t\t? 'May fail in runtime, because column is not-null. Consider setting fillValue or copyValue'\n\t\t\t\t: undefined\n\t\treturn { message: `Add field ${this.data.entityName}.${this.data.field.name}`, failureWarning }\n\t}\n}\n\nexport interface CreateColumnModificationData {\n\tentityName: string\n\tfield: Model.AnyColumn\n\tfillValue?: JSONValue\n\tcopyValue?: string\n\tvalueMigrationStrategy?: 'using' | 'update'\n}\n\n\nexport const createColumnModification = createModificationType({\n\tid: 'createColumn',\n\thandler: CreateColumnModificationHandler,\n})\n\nexport class CreateColumnDiffer implements Differ {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn createFields(originalSchema, updatedSchema, ({ newField, updatedEntity }) => {\n\t\t\tif (!isColumn(newField)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn createColumnModification.createModification({\n\t\t\t\tentityName: updatedEntity.name,\n\t\t\t\tfield: newField,\n\t\t\t\t...(newField.default !== undefined ? { fillValue: newField.default, valueMigrationStrategy: 'using' } : {}),\n\t\t\t})\n\t\t})\n\t}\n}\n"],"names":[],"mappings":";;;;;;AASO,MAAM,gCAA6F;AAAA,EACzG,YAA6B,MAAqD,QAAgB;AAArE,SAAA,OAAA;AAAqD,SAAA,SAAA;AAAA,EAAA;AAAA,EAE3E,UAAU,SAAiC;AACjD,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AAC9D,QAAI,OAAO,MAAM;AAChB;AAAA,IAAA;AAEK,UAAA,SAAS,KAAK,KAAK;AAEnB,UAAA,aAAa,iBAAiB,MAAM;AAE1C,UAAM,iBAAiB,qBAAqB;AAAA,MAC3C,OAAO,KAAK,OAAO;AAAA,MACnB;AAAA,MACA;AAAA,MACA,WAAW,KAAK,KAAK;AAAA,MACrB,WAAW,KAAK,KAAK;AAAA,IAAA,CACrB;AAGO,YAAA,UAAU,OAAO,WAAW;AAAA,MACnC,CAAC,OAAO,UAAU,GAAG;AAAA,QACpB,MAAM;AAAA,QACN,SAAS,CAAC,OAAO,YAAY,mBAAmB;AAAA,QAChD,mBAAmB,OAAO;AAAA,MAAA;AAAA,IAC3B,CACA;AAED,QAAI,mBAAmB,MAAM;AACxB,UAAA,KAAK,KAAK,2BAA2B,SAAS;AACjD,gBAAQ,YAAY,OAAO,WAAW,OAAO,YAAY;AAAA,UACxD,SAAS,CAAC,OAAO,WAAW,OAAO;AAAA,UACnC,MAAM;AAAA,UACN,OAAO;AAAA,QAAA,CACP;AAAA,MAAA,OACK;AACG,iBAAA;AAAA,UACR;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,YAAY,OAAO;AAAA,UACnB,UAAU,OAAO;AAAA,UACjB;AAAA,QAAA,CACA;AAAA,MAAA;AAAA,IACF;AAAA,EACD;AAAA,EAGM,mBAAkC;AACjC,WAAA,YAAY,aAAa,KAAK,KAAK,YAAY,SAAS,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,EAAA;AAAA,EAGjF,SAAS,EAAE,mBAAkD;AAC5D,UAAM,UAAU,CAAC,KAAK,KAAK,MAAM;AACjC,UAAM,WAAW,KAAK,KAAK,cAAc,UAAa,KAAK,KAAK,cAAc;AACxE,UAAA,iBACL,WAAW,CAAC,YAAY,CAAC,gBAAgB,SAAS,KAAK,KAAK,UAAU,IACnE,6FACA;AACJ,WAAO,EAAE,SAAS,aAAa,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,eAAe;AAAA,EAAA;AAEhG;AAWO,MAAM,2BAA2B,uBAAuB;AAAA,EAC9D,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAEM,MAAM,mBAAqC;AAAA,EACjD,WAAW,gBAAwB,eAAuB;AACzD,WAAO,aAAa,gBAAgB,eAAe,CAAC,EAAE,UAAU,oBAAoB;AAC/E,UAAA,CAAC,SAAS,QAAQ,GAAG;AACjB,eAAA;AAAA,MAAA;AAER,aAAO,yBAAyB,mBAAmB;AAAA,QAClD,YAAY,cAAc;AAAA,QAC1B,OAAO;AAAA,QACP,GAAI,SAAS,YAAY,SAAY,EAAE,WAAW,SAAS,SAAS,wBAAwB,YAAY,CAAA;AAAA,MAAC,CACzG;AAAA,IAAA,CACD;AAAA,EAAA;AAEH;"}
1
+ {"version":3,"file":"CreateColumnModification.js","sources":["../../../../../../packages/schema-migrations/src/modifications/columns/CreateColumnModification.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\nimport { JSONValue, Model, Schema } from '@contember/schema'\nimport { addField, SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'\nimport { isColumn } from '@contember/schema-utils'\nimport { createFields } from '../utils/diffUtils'\nimport { getColumnSqlType } from '../utils/columnUtils'\nimport { fillSeed, formatSeedExpression } from './columnUtils'\n\nexport class CreateColumnModificationHandler implements ModificationHandler<CreateColumnModificationData> {\n\tconstructor(private readonly data: CreateColumnModificationData, private readonly schema: Schema) {}\n\n\tpublic createSql(builder: MigrationBuilder): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tif (entity.view) {\n\t\t\treturn\n\t\t}\n\t\tconst column = this.data.field\n\n\t\tconst columnType = getColumnSqlType(column)\n\n\t\tconst seedExpression = formatSeedExpression({\n\t\t\tmodel: this.schema.model,\n\t\t\tentity,\n\t\t\tcolumnType,\n\t\t\tfillValue: this.data.fillValue,\n\t\t\tcopyValue: this.data.copyValue,\n\t\t})\n\n\n\t\tbuilder.addColumn(entity.tableName, {\n\t\t\t[column.columnName]: {\n\t\t\t\ttype: columnType,\n\t\t\t\tnotNull: !column.nullable && seedExpression === null,\n\t\t\t\tsequenceGenerated: column.sequence,\n\t\t\t\tcollation: column.collation,\n\t\t\t},\n\t\t})\n\n\t\tif (seedExpression !== null) {\n\t\t\tif (this.data.valueMigrationStrategy === 'using') {\n\t\t\t\tbuilder.alterColumn(entity.tableName, column.columnName, {\n\t\t\t\t\tnotNull: !column.nullable ? true : undefined,\n\t\t\t\t\ttype: columnType,\n\t\t\t\t\tusing: seedExpression,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tfillSeed({\n\t\t\t\t\tbuilder,\n\t\t\t\t\ttype: 'creating',\n\t\t\t\t\tentity,\n\t\t\t\t\tcolumnName: column.columnName,\n\t\t\t\t\tnullable: column.nullable,\n\t\t\t\t\tseedExpression,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(updateEntity(this.data.entityName, addField(this.data.field)))\n\t}\n\n\tdescribe({ createdEntities }: { createdEntities: string[] }) {\n\t\tconst notNull = !this.data.field.nullable\n\t\tconst hasValue = this.data.fillValue !== undefined || this.data.copyValue !== undefined\n\t\tconst failureWarning =\n\t\t\tnotNull && !hasValue && !createdEntities.includes(this.data.entityName)\n\t\t\t\t? 'May fail in runtime, because column is not-null. Consider setting fillValue or copyValue'\n\t\t\t\t: undefined\n\t\treturn { message: `Add field ${this.data.entityName}.${this.data.field.name}`, failureWarning }\n\t}\n}\n\nexport interface CreateColumnModificationData {\n\tentityName: string\n\tfield: Model.AnyColumn\n\tfillValue?: JSONValue\n\tcopyValue?: string\n\tvalueMigrationStrategy?: 'using' | 'update'\n}\n\n\nexport const createColumnModification = createModificationType({\n\tid: 'createColumn',\n\thandler: CreateColumnModificationHandler,\n})\n\nexport class CreateColumnDiffer implements Differ {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn createFields(originalSchema, updatedSchema, ({ newField, updatedEntity }) => {\n\t\t\tif (!isColumn(newField)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn createColumnModification.createModification({\n\t\t\t\tentityName: updatedEntity.name,\n\t\t\t\tfield: newField,\n\t\t\t\t...(newField.default !== undefined ? { fillValue: newField.default, valueMigrationStrategy: 'using' } : {}),\n\t\t\t})\n\t\t})\n\t}\n}\n"],"names":[],"mappings":";;;;;;AASO,MAAM,gCAA6F;AAAA,EACzG,YAA6B,MAAqD,QAAgB;AAArE,SAAA,OAAA;AAAqD,SAAA,SAAA;AAAA,EAAA;AAAA,EAE3E,UAAU,SAAiC;AACjD,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AAC9D,QAAI,OAAO,MAAM;AAChB;AAAA,IAAA;AAEK,UAAA,SAAS,KAAK,KAAK;AAEnB,UAAA,aAAa,iBAAiB,MAAM;AAE1C,UAAM,iBAAiB,qBAAqB;AAAA,MAC3C,OAAO,KAAK,OAAO;AAAA,MACnB;AAAA,MACA;AAAA,MACA,WAAW,KAAK,KAAK;AAAA,MACrB,WAAW,KAAK,KAAK;AAAA,IAAA,CACrB;AAGO,YAAA,UAAU,OAAO,WAAW;AAAA,MACnC,CAAC,OAAO,UAAU,GAAG;AAAA,QACpB,MAAM;AAAA,QACN,SAAS,CAAC,OAAO,YAAY,mBAAmB;AAAA,QAChD,mBAAmB,OAAO;AAAA,QAC1B,WAAW,OAAO;AAAA,MAAA;AAAA,IACnB,CACA;AAED,QAAI,mBAAmB,MAAM;AACxB,UAAA,KAAK,KAAK,2BAA2B,SAAS;AACjD,gBAAQ,YAAY,OAAO,WAAW,OAAO,YAAY;AAAA,UACxD,SAAS,CAAC,OAAO,WAAW,OAAO;AAAA,UACnC,MAAM;AAAA,UACN,OAAO;AAAA,QAAA,CACP;AAAA,MAAA,OACK;AACG,iBAAA;AAAA,UACR;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,YAAY,OAAO;AAAA,UACnB,UAAU,OAAO;AAAA,UACjB;AAAA,QAAA,CACA;AAAA,MAAA;AAAA,IACF;AAAA,EACD;AAAA,EAGM,mBAAkC;AACjC,WAAA,YAAY,aAAa,KAAK,KAAK,YAAY,SAAS,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,EAAA;AAAA,EAGjF,SAAS,EAAE,mBAAkD;AAC5D,UAAM,UAAU,CAAC,KAAK,KAAK,MAAM;AACjC,UAAM,WAAW,KAAK,KAAK,cAAc,UAAa,KAAK,KAAK,cAAc;AACxE,UAAA,iBACL,WAAW,CAAC,YAAY,CAAC,gBAAgB,SAAS,KAAK,KAAK,UAAU,IACnE,6FACA;AACJ,WAAO,EAAE,SAAS,aAAa,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,eAAe;AAAA,EAAA;AAEhG;AAWO,MAAM,2BAA2B,uBAAuB;AAAA,EAC9D,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAEM,MAAM,mBAAqC;AAAA,EACjD,WAAW,gBAAwB,eAAuB;AACzD,WAAO,aAAa,gBAAgB,eAAe,CAAC,EAAE,UAAU,oBAAoB;AAC/E,UAAA,CAAC,SAAS,QAAQ,GAAG;AACjB,eAAA;AAAA,MAAA;AAER,aAAO,yBAAyB,mBAAmB;AAAA,QAClD,YAAY,cAAc;AAAA,QAC1B,OAAO;AAAA,QACP,GAAI,SAAS,YAAY,SAAY,EAAE,WAAW,SAAS,SAAS,wBAAwB,YAAY,CAAA;AAAA,MAAC,CACzG;AAAA,IAAA,CACD;AAAA,EAAA;AAEH;"}
@@ -21,10 +21,14 @@ class UpdateColumnDefinitionModificationHandler {
21
21
  const oldColumn = entity.fields[this.data.fieldName];
22
22
  const newColumn = this.data.definition;
23
23
  const hasNewSequence = !oldColumn.sequence && newColumn.sequence;
24
- const hasNewType = newColumn.columnType !== oldColumn.columnType;
24
+ const oldColumnType = columnUtils.getColumnSqlType(oldColumn);
25
25
  const columnType = columnUtils.getColumnSqlType(newColumn);
26
+ const hasNewType = columnType !== oldColumnType;
26
27
  const hasNullableChanged = oldColumn.nullable !== newColumn.nullable;
27
- const usingCast = `${dbHelpers.wrapIdentifier(oldColumn.columnName)}::${columnType}`;
28
+ const hasNewCollation = newColumn.collation !== oldColumn.collation;
29
+ const columnNameWrapped = dbHelpers.wrapIdentifier(oldColumn.columnName);
30
+ const isChangedToArray = !oldColumn.list && newColumn.list;
31
+ const usingCast = (isChangedToArray ? `ARRAY[${columnNameWrapped}]` : columnNameWrapped) + `::${columnType}`;
28
32
  const seedExpression = columnUtils$1.formatSeedExpression({
29
33
  model: this.schema.model,
30
34
  entity,
@@ -36,7 +40,8 @@ class UpdateColumnDefinitionModificationHandler {
36
40
  const migrateWithUsing = hasSeed && this.data.valueMigrationStrategy === "using";
37
41
  const migrateWithUpdate = hasSeed && this.data.valueMigrationStrategy !== "using";
38
42
  builder.alterColumn(entity.tableName, oldColumn.columnName, {
39
- type: hasNewSequence || hasNewType || migrateWithUsing ? columnType : void 0,
43
+ collation: hasNewCollation ? dbHelpers.wrapIdentifier(newColumn.collation || "default") : void 0,
44
+ type: hasNewCollation || hasNewSequence || hasNewType || migrateWithUsing ? columnType : void 0,
40
45
  notNull: hasNullableChanged && (!migrateWithUpdate || newColumn.nullable) ? !newColumn.nullable : void 0,
41
46
  using: (() => {
42
47
  if (hasNewSequence) {
@@ -1 +1 @@
1
- {"version":3,"file":"UpdateColumnDefinitionModification.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/columns/UpdateColumnDefinitionModification.ts"],"sourcesContent":["import { escapeValue, MigrationBuilder } from '@contember/database-migrations'\nimport { JSONValue, Model, Schema } from '@contember/schema'\nimport { SchemaUpdater, updateEntity, updateField, updateModel } from '../utils/schemaUpdateUtils'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'\nimport deepEqual from 'fast-deep-equal'\nimport { updateColumns } from '../utils/diffUtils'\nimport { wrapIdentifier } from '../../utils/dbHelpers'\nimport { getColumnSqlType } from '../utils/columnUtils'\nimport { fillSeed, formatSeedExpression } from './columnUtils'\n\nexport class UpdateColumnDefinitionModificationHandler implements ModificationHandler<UpdateColumnDefinitionModificationData> {\n\tconstructor(private readonly data: UpdateColumnDefinitionModificationData, private readonly schema: Schema) {}\n\n\tpublic createSql(builder: MigrationBuilder): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tif (entity.view) {\n\t\t\treturn\n\t\t}\n\t\tconst oldColumn = entity.fields[this.data.fieldName] as Model.AnyColumn\n\t\tconst newColumn = this.data.definition\n\n\t\tconst hasNewSequence = !oldColumn.sequence && newColumn.sequence\n\t\tconst hasNewType = newColumn.columnType !== oldColumn.columnType\n\t\tconst columnType = getColumnSqlType(newColumn)\n\t\tconst hasNullableChanged = oldColumn.nullable !== newColumn.nullable\n\n\t\tconst usingCast = `${wrapIdentifier(oldColumn.columnName)}::${columnType}`\n\n\t\tconst seedExpression = formatSeedExpression({\n\t\t\tmodel: this.schema.model,\n\t\t\tentity,\n\t\t\tcolumnType,\n\t\t\tfillValue: this.data.fillValue,\n\t\t\tcopyValue: this.data.copyValue,\n\t\t})\n\t\tconst hasSeed = seedExpression !== null\n\t\tconst migrateWithUsing = hasSeed && this.data.valueMigrationStrategy === 'using'\n\t\tconst migrateWithUpdate = hasSeed && this.data.valueMigrationStrategy !== 'using'\n\n\t\tbuilder.alterColumn(entity.tableName, oldColumn.columnName, {\n\t\t\ttype: hasNewSequence || hasNewType || migrateWithUsing ? columnType : undefined,\n\t\t\tnotNull: hasNullableChanged && (!migrateWithUpdate || newColumn.nullable) ? !newColumn.nullable : undefined,\n\t\t\tusing: (() => {\n\t\t\t\tif (hasNewSequence) {\n\t\t\t\t\treturn `COALESCE(${usingCast}, nextval(PG_GET_SERIAL_SEQUENCE(${escapeValue(entity.tableName)}, ${escapeValue(oldColumn.columnName)})))`\n\t\t\t\t}\n\t\t\t\tif (migrateWithUsing) {\n\t\t\t\t\treturn `COALESCE(${usingCast}, ${seedExpression})`\n\t\t\t\t}\n\n\t\t\t\tif (hasNewType) {\n\t\t\t\t\treturn usingCast\n\t\t\t\t}\n\t\t\t\treturn undefined\n\t\t\t})(),\n\t\t\tsequenceGenerated: oldColumn.sequence && !newColumn.sequence ? false : (!oldColumn.sequence ? newColumn.sequence : undefined),\n\t\t})\n\n\t\tif (migrateWithUpdate) {\n\t\t\tfillSeed({\n\t\t\t\tbuilder,\n\t\t\t\ttype: 'updating',\n\t\t\t\tentity,\n\t\t\t\tcolumnName: oldColumn.columnName,\n\t\t\t\tnullable: newColumn.nullable,\n\t\t\t\tseedExpression,\n\t\t\t})\n\t\t}\n\n\t\tconst seqAlter = []\n\t\tif (oldColumn.sequence && newColumn.sequence) {\n\t\t\tif (oldColumn.sequence.precedence !== newColumn.sequence.precedence) {\n\t\t\t\tseqAlter.push(`SET GENERATED ${newColumn.sequence.precedence}`)\n\t\t\t}\n\t\t\tif (oldColumn.sequence.start !== newColumn.sequence.start && typeof newColumn.sequence.start == 'number') {\n\t\t\t\tseqAlter.push(`SET START WITH ${newColumn.sequence.start}`)\n\t\t\t}\n\t\t\tif (newColumn.sequence.restart) {\n\t\t\t\tseqAlter.push('RESTART')\n\t\t\t}\n\t\t}\n\t\tif (seqAlter.length > 0) {\n\t\t\tbuilder.sql(`ALTER TABLE ${wrapIdentifier(entity.tableName)} ALTER ${wrapIdentifier(oldColumn.columnName)} ${seqAlter.join(' ')}`)\n\t\t}\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(\n\t\t\tupdateEntity(\n\t\t\t\tthis.data.entityName,\n\t\t\t\tupdateField<Model.AnyColumn>(this.data.fieldName, ({ field }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...this.data.definition,\n\t\t\t\t\t\tname: field.name,\n\t\t\t\t\t\tcolumnName: field.columnName,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t}\n\n\tdescribe() {\n\t\tconst current = this.schema.model.entities[this.data.entityName].fields[this.data.fieldName] as Model.AnyColumn\n\t\tconst changingToNotNull = current.nullable && !this.data.definition.nullable\n\t\tconst failureWarning = changingToNotNull ? 'Changing to not-null may fail in runtime.' : undefined\n\n\t\treturn {\n\t\t\tmessage: `Update column definition of field ${this.data.entityName}.${this.data.fieldName}`,\n\t\t\tfailureWarning,\n\t\t}\n\t}\n}\n\ntype SequenceDefinitionAlter =\n\t& Model.AnyColumn['sequence']\n\t& {\n\t\trestart?: boolean\n\t}\n\ntype ColumnDefinitionAlter =\n\t& Omit<Model.AnyColumn, 'sequence' | 'columnName' | 'name'>\n\t& {\n\t\tsequence?: SequenceDefinitionAlter\n\t}\n\nexport interface UpdateColumnDefinitionModificationData {\n\tentityName: string\n\tfieldName: string\n\tdefinition: ColumnDefinitionAlter\n\tfillValue?: JSONValue\n\tcopyValue?: string\n\tvalueMigrationStrategy?: 'using' | 'update'\n}\n\nexport const updateColumnDefinitionModification = createModificationType({\n\tid: 'updateColumnDefinition',\n\thandler: UpdateColumnDefinitionModificationHandler,\n})\n\nexport class UpdateColumnDefinitionDiffer implements Differ<UpdateColumnDefinitionModificationData> {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn updateColumns(originalSchema, updatedSchema, ({ originalColumn, updatedColumn, updatedEntity }) => {\n\t\t\tconst {\n\t\t\t\tname: {},\n\t\t\t\tcolumnName: {},\n\t\t\t\t...updatedDefinition\n\t\t\t} = updatedColumn\n\t\t\tconst {\n\t\t\t\tname: {},\n\t\t\t\tcolumnName: {},\n\t\t\t\t...originalDefinition\n\t\t\t} = originalColumn\n\t\t\tif (deepEqual(updatedDefinition, originalDefinition)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\treturn updateColumnDefinitionModification.createModification({\n\t\t\t\tentityName: updatedEntity.name,\n\t\t\t\tfieldName: updatedColumn.name,\n\t\t\t\tdefinition: updatedDefinition,\n\t\t\t})\n\t\t})\n\t}\n}\n"],"names":["getColumnSqlType","wrapIdentifier","formatSeedExpression","escapeValue","fillSeed","updateModel","updateEntity","updateField","createModificationType","updateColumns"],"mappings":"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"}
1
+ {"version":3,"file":"UpdateColumnDefinitionModification.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/columns/UpdateColumnDefinitionModification.ts"],"sourcesContent":["import { escapeValue, MigrationBuilder } from '@contember/database-migrations'\nimport { JSONValue, Model, Schema } from '@contember/schema'\nimport { SchemaUpdater, updateEntity, updateField, updateModel } from '../utils/schemaUpdateUtils'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'\nimport deepEqual from 'fast-deep-equal'\nimport { updateColumns } from '../utils/diffUtils'\nimport { wrapIdentifier } from '../../utils/dbHelpers'\nimport { getColumnSqlType } from '../utils/columnUtils'\nimport { fillSeed, formatSeedExpression } from './columnUtils'\n\nexport class UpdateColumnDefinitionModificationHandler implements ModificationHandler<UpdateColumnDefinitionModificationData> {\n\tconstructor(private readonly data: UpdateColumnDefinitionModificationData, private readonly schema: Schema) {}\n\n\tpublic createSql(builder: MigrationBuilder): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tif (entity.view) {\n\t\t\treturn\n\t\t}\n\t\tconst oldColumn = entity.fields[this.data.fieldName] as Model.AnyColumn\n\t\tconst newColumn = this.data.definition\n\n\t\tconst hasNewSequence = !oldColumn.sequence && newColumn.sequence\n\t\tconst oldColumnType = getColumnSqlType(oldColumn)\n\t\tconst columnType = getColumnSqlType(newColumn)\n\t\tconst hasNewType = columnType !== oldColumnType\n\t\tconst hasNullableChanged = oldColumn.nullable !== newColumn.nullable\n\t\tconst hasNewCollation = newColumn.collation !== oldColumn.collation\n\n\t\tconst columnNameWrapped = wrapIdentifier(oldColumn.columnName)\n\t\tconst isChangedToArray = !oldColumn.list && newColumn.list\n\t\tconst usingCast = (isChangedToArray ? `ARRAY[${columnNameWrapped}]` : columnNameWrapped) + `::${columnType}`\n\n\t\tconst seedExpression = formatSeedExpression({\n\t\t\tmodel: this.schema.model,\n\t\t\tentity,\n\t\t\tcolumnType,\n\t\t\tfillValue: this.data.fillValue,\n\t\t\tcopyValue: this.data.copyValue,\n\t\t})\n\t\tconst hasSeed = seedExpression !== null\n\t\tconst migrateWithUsing = hasSeed && this.data.valueMigrationStrategy === 'using'\n\t\tconst migrateWithUpdate = hasSeed && this.data.valueMigrationStrategy !== 'using'\n\n\t\tbuilder.alterColumn(entity.tableName, oldColumn.columnName, {\n\t\t\tcollation: hasNewCollation ? wrapIdentifier(newColumn.collation || 'default') : undefined,\n\t\t\ttype: hasNewCollation || hasNewSequence || hasNewType || migrateWithUsing ? columnType : undefined,\n\t\t\tnotNull: hasNullableChanged && (!migrateWithUpdate || newColumn.nullable) ? !newColumn.nullable : undefined,\n\t\t\tusing: (() => {\n\t\t\t\tif (hasNewSequence) {\n\t\t\t\t\treturn `COALESCE(${usingCast}, nextval(PG_GET_SERIAL_SEQUENCE(${escapeValue(entity.tableName)}, ${escapeValue(oldColumn.columnName)})))`\n\t\t\t\t}\n\t\t\t\tif (migrateWithUsing) {\n\t\t\t\t\treturn `COALESCE(${usingCast}, ${seedExpression})`\n\t\t\t\t}\n\n\t\t\t\tif (hasNewType) {\n\t\t\t\t\treturn usingCast\n\t\t\t\t}\n\t\t\t\treturn undefined\n\t\t\t})(),\n\t\t\tsequenceGenerated: oldColumn.sequence && !newColumn.sequence ? false : (!oldColumn.sequence ? newColumn.sequence : undefined),\n\t\t})\n\n\t\tif (migrateWithUpdate) {\n\t\t\tfillSeed({\n\t\t\t\tbuilder,\n\t\t\t\ttype: 'updating',\n\t\t\t\tentity,\n\t\t\t\tcolumnName: oldColumn.columnName,\n\t\t\t\tnullable: newColumn.nullable,\n\t\t\t\tseedExpression,\n\t\t\t})\n\t\t}\n\n\t\tconst seqAlter = []\n\t\tif (oldColumn.sequence && newColumn.sequence) {\n\t\t\tif (oldColumn.sequence.precedence !== newColumn.sequence.precedence) {\n\t\t\t\tseqAlter.push(`SET GENERATED ${newColumn.sequence.precedence}`)\n\t\t\t}\n\t\t\tif (oldColumn.sequence.start !== newColumn.sequence.start && typeof newColumn.sequence.start == 'number') {\n\t\t\t\tseqAlter.push(`SET START WITH ${newColumn.sequence.start}`)\n\t\t\t}\n\t\t\tif (newColumn.sequence.restart) {\n\t\t\t\tseqAlter.push('RESTART')\n\t\t\t}\n\t\t}\n\t\tif (seqAlter.length > 0) {\n\t\t\tbuilder.sql(`ALTER TABLE ${wrapIdentifier(entity.tableName)} ALTER ${wrapIdentifier(oldColumn.columnName)} ${seqAlter.join(' ')}`)\n\t\t}\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(\n\t\t\tupdateEntity(\n\t\t\t\tthis.data.entityName,\n\t\t\t\tupdateField<Model.AnyColumn>(this.data.fieldName, ({ field }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...this.data.definition,\n\t\t\t\t\t\tname: field.name,\n\t\t\t\t\t\tcolumnName: field.columnName,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t}\n\n\tdescribe() {\n\t\tconst current = this.schema.model.entities[this.data.entityName].fields[this.data.fieldName] as Model.AnyColumn\n\t\tconst changingToNotNull = current.nullable && !this.data.definition.nullable\n\t\tconst failureWarning = changingToNotNull ? 'Changing to not-null may fail in runtime.' : undefined\n\n\t\treturn {\n\t\t\tmessage: `Update column definition of field ${this.data.entityName}.${this.data.fieldName}`,\n\t\t\tfailureWarning,\n\t\t}\n\t}\n}\n\ntype SequenceDefinitionAlter =\n\t& Model.AnyColumn['sequence']\n\t& {\n\t\trestart?: boolean\n\t}\n\ntype ColumnDefinitionAlter =\n\t& Omit<Model.AnyColumn, 'sequence' | 'columnName' | 'name'>\n\t& {\n\t\tsequence?: SequenceDefinitionAlter\n\t}\n\nexport interface UpdateColumnDefinitionModificationData {\n\tentityName: string\n\tfieldName: string\n\tdefinition: ColumnDefinitionAlter\n\tfillValue?: JSONValue\n\tcopyValue?: string\n\tvalueMigrationStrategy?: 'using' | 'update'\n}\n\nexport const updateColumnDefinitionModification = createModificationType({\n\tid: 'updateColumnDefinition',\n\thandler: UpdateColumnDefinitionModificationHandler,\n})\n\nexport class UpdateColumnDefinitionDiffer implements Differ<UpdateColumnDefinitionModificationData> {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn updateColumns(originalSchema, updatedSchema, ({ originalColumn, updatedColumn, updatedEntity }) => {\n\t\t\tconst {\n\t\t\t\tname: {},\n\t\t\t\tcolumnName: {},\n\t\t\t\t...updatedDefinition\n\t\t\t} = updatedColumn\n\t\t\tconst {\n\t\t\t\tname: {},\n\t\t\t\tcolumnName: {},\n\t\t\t\t...originalDefinition\n\t\t\t} = originalColumn\n\t\t\tif (deepEqual(updatedDefinition, originalDefinition)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\treturn updateColumnDefinitionModification.createModification({\n\t\t\t\tentityName: updatedEntity.name,\n\t\t\t\tfieldName: updatedColumn.name,\n\t\t\t\tdefinition: updatedDefinition,\n\t\t\t})\n\t\t})\n\t}\n}\n"],"names":["getColumnSqlType","wrapIdentifier","formatSeedExpression","escapeValue","fillSeed","updateModel","updateEntity","updateField","createModificationType","updateColumns"],"mappings":"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"}
@@ -19,10 +19,14 @@ class UpdateColumnDefinitionModificationHandler {
19
19
  const oldColumn = entity.fields[this.data.fieldName];
20
20
  const newColumn = this.data.definition;
21
21
  const hasNewSequence = !oldColumn.sequence && newColumn.sequence;
22
- const hasNewType = newColumn.columnType !== oldColumn.columnType;
22
+ const oldColumnType = getColumnSqlType(oldColumn);
23
23
  const columnType = getColumnSqlType(newColumn);
24
+ const hasNewType = columnType !== oldColumnType;
24
25
  const hasNullableChanged = oldColumn.nullable !== newColumn.nullable;
25
- const usingCast = `${wrapIdentifier(oldColumn.columnName)}::${columnType}`;
26
+ const hasNewCollation = newColumn.collation !== oldColumn.collation;
27
+ const columnNameWrapped = wrapIdentifier(oldColumn.columnName);
28
+ const isChangedToArray = !oldColumn.list && newColumn.list;
29
+ const usingCast = (isChangedToArray ? `ARRAY[${columnNameWrapped}]` : columnNameWrapped) + `::${columnType}`;
26
30
  const seedExpression = formatSeedExpression({
27
31
  model: this.schema.model,
28
32
  entity,
@@ -34,7 +38,8 @@ class UpdateColumnDefinitionModificationHandler {
34
38
  const migrateWithUsing = hasSeed && this.data.valueMigrationStrategy === "using";
35
39
  const migrateWithUpdate = hasSeed && this.data.valueMigrationStrategy !== "using";
36
40
  builder.alterColumn(entity.tableName, oldColumn.columnName, {
37
- type: hasNewSequence || hasNewType || migrateWithUsing ? columnType : void 0,
41
+ collation: hasNewCollation ? wrapIdentifier(newColumn.collation || "default") : void 0,
42
+ type: hasNewCollation || hasNewSequence || hasNewType || migrateWithUsing ? columnType : void 0,
38
43
  notNull: hasNullableChanged && (!migrateWithUpdate || newColumn.nullable) ? !newColumn.nullable : void 0,
39
44
  using: (() => {
40
45
  if (hasNewSequence) {
@@ -1 +1 @@
1
- {"version":3,"file":"UpdateColumnDefinitionModification.js","sources":["../../../../../../packages/schema-migrations/src/modifications/columns/UpdateColumnDefinitionModification.ts"],"sourcesContent":["import { escapeValue, MigrationBuilder } from '@contember/database-migrations'\nimport { JSONValue, Model, Schema } from '@contember/schema'\nimport { SchemaUpdater, updateEntity, updateField, updateModel } from '../utils/schemaUpdateUtils'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'\nimport deepEqual from 'fast-deep-equal'\nimport { updateColumns } from '../utils/diffUtils'\nimport { wrapIdentifier } from '../../utils/dbHelpers'\nimport { getColumnSqlType } from '../utils/columnUtils'\nimport { fillSeed, formatSeedExpression } from './columnUtils'\n\nexport class UpdateColumnDefinitionModificationHandler implements ModificationHandler<UpdateColumnDefinitionModificationData> {\n\tconstructor(private readonly data: UpdateColumnDefinitionModificationData, private readonly schema: Schema) {}\n\n\tpublic createSql(builder: MigrationBuilder): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tif (entity.view) {\n\t\t\treturn\n\t\t}\n\t\tconst oldColumn = entity.fields[this.data.fieldName] as Model.AnyColumn\n\t\tconst newColumn = this.data.definition\n\n\t\tconst hasNewSequence = !oldColumn.sequence && newColumn.sequence\n\t\tconst hasNewType = newColumn.columnType !== oldColumn.columnType\n\t\tconst columnType = getColumnSqlType(newColumn)\n\t\tconst hasNullableChanged = oldColumn.nullable !== newColumn.nullable\n\n\t\tconst usingCast = `${wrapIdentifier(oldColumn.columnName)}::${columnType}`\n\n\t\tconst seedExpression = formatSeedExpression({\n\t\t\tmodel: this.schema.model,\n\t\t\tentity,\n\t\t\tcolumnType,\n\t\t\tfillValue: this.data.fillValue,\n\t\t\tcopyValue: this.data.copyValue,\n\t\t})\n\t\tconst hasSeed = seedExpression !== null\n\t\tconst migrateWithUsing = hasSeed && this.data.valueMigrationStrategy === 'using'\n\t\tconst migrateWithUpdate = hasSeed && this.data.valueMigrationStrategy !== 'using'\n\n\t\tbuilder.alterColumn(entity.tableName, oldColumn.columnName, {\n\t\t\ttype: hasNewSequence || hasNewType || migrateWithUsing ? columnType : undefined,\n\t\t\tnotNull: hasNullableChanged && (!migrateWithUpdate || newColumn.nullable) ? !newColumn.nullable : undefined,\n\t\t\tusing: (() => {\n\t\t\t\tif (hasNewSequence) {\n\t\t\t\t\treturn `COALESCE(${usingCast}, nextval(PG_GET_SERIAL_SEQUENCE(${escapeValue(entity.tableName)}, ${escapeValue(oldColumn.columnName)})))`\n\t\t\t\t}\n\t\t\t\tif (migrateWithUsing) {\n\t\t\t\t\treturn `COALESCE(${usingCast}, ${seedExpression})`\n\t\t\t\t}\n\n\t\t\t\tif (hasNewType) {\n\t\t\t\t\treturn usingCast\n\t\t\t\t}\n\t\t\t\treturn undefined\n\t\t\t})(),\n\t\t\tsequenceGenerated: oldColumn.sequence && !newColumn.sequence ? false : (!oldColumn.sequence ? newColumn.sequence : undefined),\n\t\t})\n\n\t\tif (migrateWithUpdate) {\n\t\t\tfillSeed({\n\t\t\t\tbuilder,\n\t\t\t\ttype: 'updating',\n\t\t\t\tentity,\n\t\t\t\tcolumnName: oldColumn.columnName,\n\t\t\t\tnullable: newColumn.nullable,\n\t\t\t\tseedExpression,\n\t\t\t})\n\t\t}\n\n\t\tconst seqAlter = []\n\t\tif (oldColumn.sequence && newColumn.sequence) {\n\t\t\tif (oldColumn.sequence.precedence !== newColumn.sequence.precedence) {\n\t\t\t\tseqAlter.push(`SET GENERATED ${newColumn.sequence.precedence}`)\n\t\t\t}\n\t\t\tif (oldColumn.sequence.start !== newColumn.sequence.start && typeof newColumn.sequence.start == 'number') {\n\t\t\t\tseqAlter.push(`SET START WITH ${newColumn.sequence.start}`)\n\t\t\t}\n\t\t\tif (newColumn.sequence.restart) {\n\t\t\t\tseqAlter.push('RESTART')\n\t\t\t}\n\t\t}\n\t\tif (seqAlter.length > 0) {\n\t\t\tbuilder.sql(`ALTER TABLE ${wrapIdentifier(entity.tableName)} ALTER ${wrapIdentifier(oldColumn.columnName)} ${seqAlter.join(' ')}`)\n\t\t}\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(\n\t\t\tupdateEntity(\n\t\t\t\tthis.data.entityName,\n\t\t\t\tupdateField<Model.AnyColumn>(this.data.fieldName, ({ field }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...this.data.definition,\n\t\t\t\t\t\tname: field.name,\n\t\t\t\t\t\tcolumnName: field.columnName,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t}\n\n\tdescribe() {\n\t\tconst current = this.schema.model.entities[this.data.entityName].fields[this.data.fieldName] as Model.AnyColumn\n\t\tconst changingToNotNull = current.nullable && !this.data.definition.nullable\n\t\tconst failureWarning = changingToNotNull ? 'Changing to not-null may fail in runtime.' : undefined\n\n\t\treturn {\n\t\t\tmessage: `Update column definition of field ${this.data.entityName}.${this.data.fieldName}`,\n\t\t\tfailureWarning,\n\t\t}\n\t}\n}\n\ntype SequenceDefinitionAlter =\n\t& Model.AnyColumn['sequence']\n\t& {\n\t\trestart?: boolean\n\t}\n\ntype ColumnDefinitionAlter =\n\t& Omit<Model.AnyColumn, 'sequence' | 'columnName' | 'name'>\n\t& {\n\t\tsequence?: SequenceDefinitionAlter\n\t}\n\nexport interface UpdateColumnDefinitionModificationData {\n\tentityName: string\n\tfieldName: string\n\tdefinition: ColumnDefinitionAlter\n\tfillValue?: JSONValue\n\tcopyValue?: string\n\tvalueMigrationStrategy?: 'using' | 'update'\n}\n\nexport const updateColumnDefinitionModification = createModificationType({\n\tid: 'updateColumnDefinition',\n\thandler: UpdateColumnDefinitionModificationHandler,\n})\n\nexport class UpdateColumnDefinitionDiffer implements Differ<UpdateColumnDefinitionModificationData> {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn updateColumns(originalSchema, updatedSchema, ({ originalColumn, updatedColumn, updatedEntity }) => {\n\t\t\tconst {\n\t\t\t\tname: {},\n\t\t\t\tcolumnName: {},\n\t\t\t\t...updatedDefinition\n\t\t\t} = updatedColumn\n\t\t\tconst {\n\t\t\t\tname: {},\n\t\t\t\tcolumnName: {},\n\t\t\t\t...originalDefinition\n\t\t\t} = originalColumn\n\t\t\tif (deepEqual(updatedDefinition, originalDefinition)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\treturn updateColumnDefinitionModification.createModification({\n\t\t\t\tentityName: updatedEntity.name,\n\t\t\t\tfieldName: updatedColumn.name,\n\t\t\t\tdefinition: updatedDefinition,\n\t\t\t})\n\t\t})\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;AAUO,MAAM,0CAAkH;AAAA,EAC9H,YAA6B,MAA+D,QAAgB;AAA/E,SAAA,OAAA;AAA+D,SAAA,SAAA;AAAA,EAAA;AAAA,EAErF,UAAU,SAAiC;AACjD,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AAC9D,QAAI,OAAO,MAAM;AAChB;AAAA,IAAA;AAED,UAAM,YAAY,OAAO,OAAO,KAAK,KAAK,SAAS;AAC7C,UAAA,YAAY,KAAK,KAAK;AAE5B,UAAM,iBAAiB,CAAC,UAAU,YAAY,UAAU;AAClD,UAAA,aAAa,UAAU,eAAe,UAAU;AAChD,UAAA,aAAa,iBAAiB,SAAS;AACvC,UAAA,qBAAqB,UAAU,aAAa,UAAU;AAE5D,UAAM,YAAY,GAAG,eAAe,UAAU,UAAU,CAAC,KAAK,UAAU;AAExE,UAAM,iBAAiB,qBAAqB;AAAA,MAC3C,OAAO,KAAK,OAAO;AAAA,MACnB;AAAA,MACA;AAAA,MACA,WAAW,KAAK,KAAK;AAAA,MACrB,WAAW,KAAK,KAAK;AAAA,IAAA,CACrB;AACD,UAAM,UAAU,mBAAmB;AACnC,UAAM,mBAAmB,WAAW,KAAK,KAAK,2BAA2B;AACzE,UAAM,oBAAoB,WAAW,KAAK,KAAK,2BAA2B;AAE1E,YAAQ,YAAY,OAAO,WAAW,UAAU,YAAY;AAAA,MAC3D,MAAM,kBAAkB,cAAc,mBAAmB,aAAa;AAAA,MACtE,SAAS,uBAAuB,CAAC,qBAAqB,UAAU,YAAY,CAAC,UAAU,WAAW;AAAA,MAClG,QAAQ,MAAM;AACb,YAAI,gBAAgB;AACZ,iBAAA,YAAY,SAAS,oCAAoC,YAAY,OAAO,SAAS,CAAC,KAAK,YAAY,UAAU,UAAU,CAAC;AAAA,QAAA;AAEpI,YAAI,kBAAkB;AACd,iBAAA,YAAY,SAAS,KAAK,cAAc;AAAA,QAAA;AAGhD,YAAI,YAAY;AACR,iBAAA;AAAA,QAAA;AAED,eAAA;AAAA,MAAA,GACL;AAAA,MACH,mBAAmB,UAAU,YAAY,CAAC,UAAU,WAAW,QAAS,CAAC,UAAU,WAAW,UAAU,WAAW;AAAA,IAAA,CACnH;AAED,QAAI,mBAAmB;AACb,eAAA;AAAA,QACR;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA,YAAY,UAAU;AAAA,QACtB,UAAU,UAAU;AAAA,QACpB;AAAA,MAAA,CACA;AAAA,IAAA;AAGF,UAAM,WAAW,CAAC;AACd,QAAA,UAAU,YAAY,UAAU,UAAU;AAC7C,UAAI,UAAU,SAAS,eAAe,UAAU,SAAS,YAAY;AACpE,iBAAS,KAAK,iBAAiB,UAAU,SAAS,UAAU,EAAE;AAAA,MAAA;AAE3D,UAAA,UAAU,SAAS,UAAU,UAAU,SAAS,SAAS,OAAO,UAAU,SAAS,SAAS,UAAU;AACzG,iBAAS,KAAK,kBAAkB,UAAU,SAAS,KAAK,EAAE;AAAA,MAAA;AAEvD,UAAA,UAAU,SAAS,SAAS;AAC/B,iBAAS,KAAK,SAAS;AAAA,MAAA;AAAA,IACxB;AAEG,QAAA,SAAS,SAAS,GAAG;AACxB,cAAQ,IAAI,eAAe,eAAe,OAAO,SAAS,CAAC,UAAU,eAAe,UAAU,UAAU,CAAC,IAAI,SAAS,KAAK,GAAG,CAAC,EAAE;AAAA,IAAA;AAAA,EAClI;AAAA,EAGM,mBAAkC;AACjC,WAAA;AAAA,MACN;AAAA,QACC,KAAK,KAAK;AAAA,QACV,YAA6B,KAAK,KAAK,WAAW,CAAC,EAAE,YAAY;AACzD,iBAAA;AAAA,YACN,GAAG,KAAK,KAAK;AAAA,YACb,MAAM,MAAM;AAAA,YACZ,YAAY,MAAM;AAAA,UACnB;AAAA,QACA,CAAA;AAAA,MAAA;AAAA,IAEH;AAAA,EAAA;AAAA,EAGD,WAAW;AACV,UAAM,UAAU,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU,EAAE,OAAO,KAAK,KAAK,SAAS;AAC3F,UAAM,oBAAoB,QAAQ,YAAY,CAAC,KAAK,KAAK,WAAW;AAC9D,UAAA,iBAAiB,oBAAoB,8CAA8C;AAElF,WAAA;AAAA,MACN,SAAS,qCAAqC,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,SAAS;AAAA,MACzF;AAAA,IACD;AAAA,EAAA;AAEF;AAuBO,MAAM,qCAAqC,uBAAuB;AAAA,EACxE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAEM,MAAM,6BAAuF;AAAA,EACnG,WAAW,gBAAwB,eAAuB;AAClD,WAAA,cAAc,gBAAgB,eAAe,CAAC,EAAE,gBAAgB,eAAe,oBAAoB;AACnG,YAAA;AAAA,QACL,MAAM,CAAC;AAAA,QACP,YAAY,CAAC;AAAA,QACb,GAAG;AAAA,MAAA,IACA;AACE,YAAA;AAAA,QACL,MAAM,CAAC;AAAA,QACP,YAAY,CAAC;AAAA,QACb,GAAG;AAAA,MAAA,IACA;AACA,UAAA,UAAU,mBAAmB,kBAAkB,GAAG;AAC9C,eAAA;AAAA,MAAA;AAGR,aAAO,mCAAmC,mBAAmB;AAAA,QAC5D,YAAY,cAAc;AAAA,QAC1B,WAAW,cAAc;AAAA,QACzB,YAAY;AAAA,MAAA,CACZ;AAAA,IAAA,CACD;AAAA,EAAA;AAEH;"}
1
+ {"version":3,"file":"UpdateColumnDefinitionModification.js","sources":["../../../../../../packages/schema-migrations/src/modifications/columns/UpdateColumnDefinitionModification.ts"],"sourcesContent":["import { escapeValue, MigrationBuilder } from '@contember/database-migrations'\nimport { JSONValue, Model, Schema } from '@contember/schema'\nimport { SchemaUpdater, updateEntity, updateField, updateModel } from '../utils/schemaUpdateUtils'\nimport { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'\nimport deepEqual from 'fast-deep-equal'\nimport { updateColumns } from '../utils/diffUtils'\nimport { wrapIdentifier } from '../../utils/dbHelpers'\nimport { getColumnSqlType } from '../utils/columnUtils'\nimport { fillSeed, formatSeedExpression } from './columnUtils'\n\nexport class UpdateColumnDefinitionModificationHandler implements ModificationHandler<UpdateColumnDefinitionModificationData> {\n\tconstructor(private readonly data: UpdateColumnDefinitionModificationData, private readonly schema: Schema) {}\n\n\tpublic createSql(builder: MigrationBuilder): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tif (entity.view) {\n\t\t\treturn\n\t\t}\n\t\tconst oldColumn = entity.fields[this.data.fieldName] as Model.AnyColumn\n\t\tconst newColumn = this.data.definition\n\n\t\tconst hasNewSequence = !oldColumn.sequence && newColumn.sequence\n\t\tconst oldColumnType = getColumnSqlType(oldColumn)\n\t\tconst columnType = getColumnSqlType(newColumn)\n\t\tconst hasNewType = columnType !== oldColumnType\n\t\tconst hasNullableChanged = oldColumn.nullable !== newColumn.nullable\n\t\tconst hasNewCollation = newColumn.collation !== oldColumn.collation\n\n\t\tconst columnNameWrapped = wrapIdentifier(oldColumn.columnName)\n\t\tconst isChangedToArray = !oldColumn.list && newColumn.list\n\t\tconst usingCast = (isChangedToArray ? `ARRAY[${columnNameWrapped}]` : columnNameWrapped) + `::${columnType}`\n\n\t\tconst seedExpression = formatSeedExpression({\n\t\t\tmodel: this.schema.model,\n\t\t\tentity,\n\t\t\tcolumnType,\n\t\t\tfillValue: this.data.fillValue,\n\t\t\tcopyValue: this.data.copyValue,\n\t\t})\n\t\tconst hasSeed = seedExpression !== null\n\t\tconst migrateWithUsing = hasSeed && this.data.valueMigrationStrategy === 'using'\n\t\tconst migrateWithUpdate = hasSeed && this.data.valueMigrationStrategy !== 'using'\n\n\t\tbuilder.alterColumn(entity.tableName, oldColumn.columnName, {\n\t\t\tcollation: hasNewCollation ? wrapIdentifier(newColumn.collation || 'default') : undefined,\n\t\t\ttype: hasNewCollation || hasNewSequence || hasNewType || migrateWithUsing ? columnType : undefined,\n\t\t\tnotNull: hasNullableChanged && (!migrateWithUpdate || newColumn.nullable) ? !newColumn.nullable : undefined,\n\t\t\tusing: (() => {\n\t\t\t\tif (hasNewSequence) {\n\t\t\t\t\treturn `COALESCE(${usingCast}, nextval(PG_GET_SERIAL_SEQUENCE(${escapeValue(entity.tableName)}, ${escapeValue(oldColumn.columnName)})))`\n\t\t\t\t}\n\t\t\t\tif (migrateWithUsing) {\n\t\t\t\t\treturn `COALESCE(${usingCast}, ${seedExpression})`\n\t\t\t\t}\n\n\t\t\t\tif (hasNewType) {\n\t\t\t\t\treturn usingCast\n\t\t\t\t}\n\t\t\t\treturn undefined\n\t\t\t})(),\n\t\t\tsequenceGenerated: oldColumn.sequence && !newColumn.sequence ? false : (!oldColumn.sequence ? newColumn.sequence : undefined),\n\t\t})\n\n\t\tif (migrateWithUpdate) {\n\t\t\tfillSeed({\n\t\t\t\tbuilder,\n\t\t\t\ttype: 'updating',\n\t\t\t\tentity,\n\t\t\t\tcolumnName: oldColumn.columnName,\n\t\t\t\tnullable: newColumn.nullable,\n\t\t\t\tseedExpression,\n\t\t\t})\n\t\t}\n\n\t\tconst seqAlter = []\n\t\tif (oldColumn.sequence && newColumn.sequence) {\n\t\t\tif (oldColumn.sequence.precedence !== newColumn.sequence.precedence) {\n\t\t\t\tseqAlter.push(`SET GENERATED ${newColumn.sequence.precedence}`)\n\t\t\t}\n\t\t\tif (oldColumn.sequence.start !== newColumn.sequence.start && typeof newColumn.sequence.start == 'number') {\n\t\t\t\tseqAlter.push(`SET START WITH ${newColumn.sequence.start}`)\n\t\t\t}\n\t\t\tif (newColumn.sequence.restart) {\n\t\t\t\tseqAlter.push('RESTART')\n\t\t\t}\n\t\t}\n\t\tif (seqAlter.length > 0) {\n\t\t\tbuilder.sql(`ALTER TABLE ${wrapIdentifier(entity.tableName)} ALTER ${wrapIdentifier(oldColumn.columnName)} ${seqAlter.join(' ')}`)\n\t\t}\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(\n\t\t\tupdateEntity(\n\t\t\t\tthis.data.entityName,\n\t\t\t\tupdateField<Model.AnyColumn>(this.data.fieldName, ({ field }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...this.data.definition,\n\t\t\t\t\t\tname: field.name,\n\t\t\t\t\t\tcolumnName: field.columnName,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t}\n\n\tdescribe() {\n\t\tconst current = this.schema.model.entities[this.data.entityName].fields[this.data.fieldName] as Model.AnyColumn\n\t\tconst changingToNotNull = current.nullable && !this.data.definition.nullable\n\t\tconst failureWarning = changingToNotNull ? 'Changing to not-null may fail in runtime.' : undefined\n\n\t\treturn {\n\t\t\tmessage: `Update column definition of field ${this.data.entityName}.${this.data.fieldName}`,\n\t\t\tfailureWarning,\n\t\t}\n\t}\n}\n\ntype SequenceDefinitionAlter =\n\t& Model.AnyColumn['sequence']\n\t& {\n\t\trestart?: boolean\n\t}\n\ntype ColumnDefinitionAlter =\n\t& Omit<Model.AnyColumn, 'sequence' | 'columnName' | 'name'>\n\t& {\n\t\tsequence?: SequenceDefinitionAlter\n\t}\n\nexport interface UpdateColumnDefinitionModificationData {\n\tentityName: string\n\tfieldName: string\n\tdefinition: ColumnDefinitionAlter\n\tfillValue?: JSONValue\n\tcopyValue?: string\n\tvalueMigrationStrategy?: 'using' | 'update'\n}\n\nexport const updateColumnDefinitionModification = createModificationType({\n\tid: 'updateColumnDefinition',\n\thandler: UpdateColumnDefinitionModificationHandler,\n})\n\nexport class UpdateColumnDefinitionDiffer implements Differ<UpdateColumnDefinitionModificationData> {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn updateColumns(originalSchema, updatedSchema, ({ originalColumn, updatedColumn, updatedEntity }) => {\n\t\t\tconst {\n\t\t\t\tname: {},\n\t\t\t\tcolumnName: {},\n\t\t\t\t...updatedDefinition\n\t\t\t} = updatedColumn\n\t\t\tconst {\n\t\t\t\tname: {},\n\t\t\t\tcolumnName: {},\n\t\t\t\t...originalDefinition\n\t\t\t} = originalColumn\n\t\t\tif (deepEqual(updatedDefinition, originalDefinition)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\treturn updateColumnDefinitionModification.createModification({\n\t\t\t\tentityName: updatedEntity.name,\n\t\t\t\tfieldName: updatedColumn.name,\n\t\t\t\tdefinition: updatedDefinition,\n\t\t\t})\n\t\t})\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -10,9 +10,10 @@ class CreateUniqueConstraintModificationHandler {
10
10
  this.data = data;
11
11
  this.schema = schema;
12
12
  }
13
- createSql(builder, { databaseMetadata, invalidateDatabaseMetadata }) {
13
+ createSql(builder, { invalidateDatabaseMetadata }) {
14
14
  const entity = this.schema.model.entities[this.data.entityName];
15
- if (entity.view) {
15
+ const shouldExecuteSql = !entity.view || this.data.unique.index && entity.view.materialized;
16
+ if (!shouldExecuteSql) {
16
17
  return;
17
18
  }
18
19
  const fields = this.data.unique.fields;
@@ -23,13 +24,18 @@ class CreateUniqueConstraintModificationHandler {
23
24
  });
24
25
  const tableNameId = dbHelpers.wrapIdentifier(entity.tableName);
25
26
  const columnNameIds = columns.map(dbHelpers.wrapIdentifier);
26
- let checkModifier = "";
27
- if (this.data.unique.timing === "deferred") {
28
- checkModifier = " INITIALLY DEFERRED";
29
- } else if (this.data.unique.timing === "deferrable") {
30
- checkModifier = " DEFERRABLE";
27
+ if ("index" in this.data.unique && this.data.unique.index) {
28
+ const nulls = this.data.unique.nulls === "not distinct" ? " NULLS NOT DISTINCT" : " NULLS DISTINCT";
29
+ builder.sql(`CREATE UNIQUE INDEX ON ${tableNameId} (${columnNameIds.join(", ")})${nulls}`);
30
+ } else {
31
+ let checkModifier = "";
32
+ if (this.data.unique.timing === "deferred") {
33
+ checkModifier = " INITIALLY DEFERRED";
34
+ } else if (this.data.unique.timing === "deferrable") {
35
+ checkModifier = " DEFERRABLE";
36
+ }
37
+ builder.sql(`ALTER TABLE ${tableNameId} ADD UNIQUE (${columnNameIds.join(", ")})${checkModifier}`);
31
38
  }
32
- builder.sql(`ALTER TABLE ${tableNameId} ADD UNIQUE (${columnNameIds.join(", ")})${checkModifier}`);
33
39
  invalidateDatabaseMetadata();
34
40
  }
35
41
  getSchemaUpdater() {
@@ -45,7 +51,7 @@ class CreateUniqueConstraintModificationHandler {
45
51
  }
46
52
  describe({ createdEntities }) {
47
53
  return {
48
- message: `Create unique constraint (${this.data.unique.fields.join(", ")}) on entity ${this.data.entityName}`,
54
+ message: `Create unique ${this.data.unique.index ? "index" : "constraint"} (${this.data.unique.fields.join(", ")}) on entity ${this.data.entityName}`,
49
55
  failureWarning: !createdEntities.includes(this.data.entityName) ? "Make sure no conflicting rows exists, otherwise this may fail in runtime." : void 0
50
56
  };
51
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CreateUniqueConstraintModification.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/constraints/CreateUniqueConstraintModification.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\nimport { Model, Schema } from '@contember/schema'\nimport { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'\nimport {\n\tcreateModificationType,\n\tDiffer,\n\tModificationHandler,\n\tModificationHandlerCreateSqlOptions,\n} from '../ModificationHandler'\nimport { wrapIdentifier } from '../../utils/dbHelpers'\nimport { getUniqueConstraintColumns } from './utils'\nimport deepEqual from 'fast-deep-equal'\n\nexport class CreateUniqueConstraintModificationHandler implements ModificationHandler<CreateUniqueConstraintModificationData> {\n\tconstructor(private readonly data: CreateUniqueConstraintModificationData, private readonly schema: Schema) {\n\t}\n\n\tpublic createSql(builder: MigrationBuilder, { databaseMetadata, invalidateDatabaseMetadata }: ModificationHandlerCreateSqlOptions): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tif (entity.view) {\n\t\t\treturn\n\t\t}\n\t\tconst fields = this.data.unique.fields\n\t\tconst columns = getUniqueConstraintColumns({\n\t\t\tentity,\n\t\t\tmodel: this.schema.model,\n\t\t\tfields,\n\t\t})\n\n\t\tconst tableNameId = wrapIdentifier(entity.tableName)\n\t\tconst columnNameIds = columns.map(wrapIdentifier)\n\n\t\tlet checkModifier = ''\n\t\tif (this.data.unique.timing === 'deferred') {\n\t\t\tcheckModifier = ' INITIALLY DEFERRED'\n\t\t} else if (this.data.unique.timing === 'deferrable') {\n\t\t\tcheckModifier = ' DEFERRABLE'\n\t\t}\n\n\t\tbuilder.sql(`ALTER TABLE ${tableNameId} ADD UNIQUE (${columnNameIds.join(', ')})${checkModifier}`)\n\n\t\tinvalidateDatabaseMetadata()\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(\n\t\t\tupdateEntity(this.data.entityName, ({ entity }) => ({\n\t\t\t\t...entity,\n\t\t\t\tunique: [\n\t\t\t\t\t...entity.unique,\n\t\t\t\t\tthis.data.unique,\n\t\t\t\t],\n\t\t\t})),\n\t\t)\n\t}\n\n\tdescribe({ createdEntities }: { createdEntities: string[] }) {\n\t\treturn {\n\t\t\tmessage: `Create unique constraint (${this.data.unique.fields.join(', ')}) on entity ${this.data.entityName}`,\n\t\t\tfailureWarning: !createdEntities.includes(this.data.entityName)\n\t\t\t\t? 'Make sure no conflicting rows exists, otherwise this may fail in runtime.'\n\t\t\t\t: undefined,\n\t\t}\n\t}\n\n}\n\nexport const createUniqueConstraintModification = createModificationType({\n\tid: 'createUniqueConstraint',\n\thandler: CreateUniqueConstraintModificationHandler,\n})\n\nexport interface CreateUniqueConstraintModificationData {\n\tentityName: string\n\tunique: Model.UniqueConstraint\n}\n\nexport class CreateUniqueConstraintDiffer implements Differ {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn Object.values(updatedSchema.model.entities).flatMap(entity =>\n\t\t\tentity.unique\n\t\t\t\t.filter(it => !originalSchema.model.entities[entity.name].unique.find(uniq => deepEqual(uniq.fields, it.fields)))\n\t\t\t\t.map(unique => createUniqueConstraintModification.createModification({\n\t\t\t\t\tentityName: entity.name,\n\t\t\t\t\tunique,\n\t\t\t\t})),\n\t\t)\n\t}\n}\n"],"names":["getUniqueConstraintColumns","wrapIdentifier","updateModel","updateEntity","createModificationType"],"mappings":";;;;;;;AAaO,MAAM,0CAAiH;AAAA,EAC7H,YAA6B,MAA+D,QAAgB;AAA/E,SAAA,OAAA;AAA+D,SAAA,SAAA;AAAA,EAAA;AAAA,EAGrF,UAAU,SAA2B,EAAE,kBAAkB,8BAAyE;AACxI,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AAC9D,QAAI,OAAO,MAAM;AAChB;AAAA,IAAA;AAEK,UAAA,SAAS,KAAK,KAAK,OAAO;AAChC,UAAM,UAAUA,MAAAA,2BAA2B;AAAA,MAC1C;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,MACnB;AAAA,IAAA,CACA;AAEK,UAAA,cAAcC,UAAAA,eAAe,OAAO,SAAS;AAC7C,UAAA,gBAAgB,QAAQ,IAAIA,wBAAc;AAEhD,QAAI,gBAAgB;AACpB,QAAI,KAAK,KAAK,OAAO,WAAW,YAAY;AAC3B,sBAAA;AAAA,IACN,WAAA,KAAK,KAAK,OAAO,WAAW,cAAc;AACpC,sBAAA;AAAA,IAAA;AAGT,YAAA,IAAI,eAAe,WAAW,gBAAgB,cAAc,KAAK,IAAI,CAAC,IAAI,aAAa,EAAE;AAEtE,+BAAA;AAAA,EAAA;AAAA,EAGrB,mBAAkC;AACjC,WAAAC,kBAAA;AAAA,MACNC,+BAAa,KAAK,KAAK,YAAY,CAAC,EAAE,cAAc;AAAA,QACnD,GAAG;AAAA,QACH,QAAQ;AAAA,UACP,GAAG,OAAO;AAAA,UACV,KAAK,KAAK;AAAA,QAAA;AAAA,MACX,EACC;AAAA,IACH;AAAA,EAAA;AAAA,EAGD,SAAS,EAAE,mBAAkD;AACrD,WAAA;AAAA,MACN,SAAS,6BAA6B,KAAK,KAAK,OAAO,OAAO,KAAK,IAAI,CAAC,eAAe,KAAK,KAAK,UAAU;AAAA,MAC3G,gBAAgB,CAAC,gBAAgB,SAAS,KAAK,KAAK,UAAU,IAC3D,8EACA;AAAA,IACJ;AAAA,EAAA;AAGF;AAEO,MAAM,qCAAqCC,oBAAAA,uBAAuB;AAAA,EACxE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAOM,MAAM,6BAA+C;AAAA,EAC3D,WAAW,gBAAwB,eAAuB;AACzD,WAAO,OAAO,OAAO,cAAc,MAAM,QAAQ,EAAE;AAAA,MAAQ,CAAA,WAC1D,OAAO,OACL,OAAO,CAAA,OAAM,CAAC,eAAe,MAAM,SAAS,OAAO,IAAI,EAAE,OAAO,KAAK,CAAQ,SAAA,UAAU,KAAK,QAAQ,GAAG,MAAM,CAAC,CAAC,EAC/G,IAAI,CAAU,WAAA,mCAAmC,mBAAmB;AAAA,QACpE,YAAY,OAAO;AAAA,QACnB;AAAA,MAAA,CACA,CAAC;AAAA,IACJ;AAAA,EAAA;AAEF;;;;"}
1
+ {"version":3,"file":"CreateUniqueConstraintModification.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/constraints/CreateUniqueConstraintModification.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\nimport { Model, Schema } from '@contember/schema'\nimport { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'\nimport {\n\tcreateModificationType,\n\tDiffer,\n\tModificationHandler,\n\tModificationHandlerCreateSqlOptions,\n} from '../ModificationHandler'\nimport { wrapIdentifier } from '../../utils/dbHelpers'\nimport { getUniqueConstraintColumns } from './utils'\nimport deepEqual from 'fast-deep-equal'\n\nexport class CreateUniqueConstraintModificationHandler implements ModificationHandler<CreateUniqueConstraintModificationData> {\n\tconstructor(private readonly data: CreateUniqueConstraintModificationData, private readonly schema: Schema) {\n\t}\n\n\tpublic createSql(builder: MigrationBuilder, { invalidateDatabaseMetadata }: ModificationHandlerCreateSqlOptions): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tconst shouldExecuteSql =\n\t\t\t!entity.view\n\t\t\t|| (this.data.unique.index && entity.view.materialized)\n\t\tif (!shouldExecuteSql) {\n\t\t\treturn\n\t\t}\n\t\tconst fields = this.data.unique.fields\n\t\tconst columns = getUniqueConstraintColumns({\n\t\t\tentity,\n\t\t\tmodel: this.schema.model,\n\t\t\tfields,\n\t\t})\n\n\t\tconst tableNameId = wrapIdentifier(entity.tableName)\n\t\tconst columnNameIds = columns.map(wrapIdentifier)\n\n\t\tif ('index' in this.data.unique && this.data.unique.index) {\n\t\t\tconst nulls = this.data.unique.nulls === 'not distinct' ? ' NULLS NOT DISTINCT' : ' NULLS DISTINCT'\n\t\t\tbuilder.sql(`CREATE UNIQUE INDEX ON ${tableNameId} (${columnNameIds.join(', ')})${nulls}`)\n\t\t} else {\n\t\t\tlet checkModifier = ''\n\t\t\tif (this.data.unique.timing === 'deferred') {\n\t\t\t\tcheckModifier = ' INITIALLY DEFERRED'\n\t\t\t} else if (this.data.unique.timing === 'deferrable') {\n\t\t\t\tcheckModifier = ' DEFERRABLE'\n\t\t\t}\n\n\t\t\tbuilder.sql(`ALTER TABLE ${tableNameId} ADD UNIQUE (${columnNameIds.join(', ')})${checkModifier}`)\n\t\t}\n\n\n\t\tinvalidateDatabaseMetadata()\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(\n\t\t\tupdateEntity(this.data.entityName, ({ entity }) => ({\n\t\t\t\t...entity,\n\t\t\t\tunique: [\n\t\t\t\t\t...entity.unique,\n\t\t\t\t\tthis.data.unique,\n\t\t\t\t],\n\t\t\t})),\n\t\t)\n\t}\n\n\tdescribe({ createdEntities }: { createdEntities: string[] }) {\n\t\treturn {\n\t\t\tmessage: `Create unique ${this.data.unique.index ? 'index' : 'constraint'} (${this.data.unique.fields.join(', ')}) on entity ${this.data.entityName}`,\n\t\t\tfailureWarning: !createdEntities.includes(this.data.entityName)\n\t\t\t\t? 'Make sure no conflicting rows exists, otherwise this may fail in runtime.'\n\t\t\t\t: undefined,\n\t\t}\n\t}\n\n}\n\nexport const createUniqueConstraintModification = createModificationType({\n\tid: 'createUniqueConstraint',\n\thandler: CreateUniqueConstraintModificationHandler,\n})\n\nexport interface CreateUniqueConstraintModificationData {\n\tentityName: string\n\tunique: Model.UniqueConstraint | Model.UniqueIndex\n}\n\nexport class CreateUniqueConstraintDiffer implements Differ {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn Object.values(updatedSchema.model.entities).flatMap(entity =>\n\t\t\tentity.unique\n\t\t\t\t.filter(it => !originalSchema.model.entities[entity.name].unique.find(uniq => deepEqual(uniq.fields, it.fields)))\n\t\t\t\t.map(unique => createUniqueConstraintModification.createModification({\n\t\t\t\t\tentityName: entity.name,\n\t\t\t\t\tunique,\n\t\t\t\t})),\n\t\t)\n\t}\n}\n"],"names":["getUniqueConstraintColumns","wrapIdentifier","updateModel","updateEntity","createModificationType"],"mappings":";;;;;;;AAaO,MAAM,0CAAiH;AAAA,EAC7H,YAA6B,MAA+D,QAAgB;AAA/E,SAAA,OAAA;AAA+D,SAAA,SAAA;AAAA,EAAA;AAAA,EAGrF,UAAU,SAA2B,EAAE,8BAAyE;AACtH,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AACxD,UAAA,mBACL,CAAC,OAAO,QACJ,KAAK,KAAK,OAAO,SAAS,OAAO,KAAK;AAC3C,QAAI,CAAC,kBAAkB;AACtB;AAAA,IAAA;AAEK,UAAA,SAAS,KAAK,KAAK,OAAO;AAChC,UAAM,UAAUA,MAAAA,2BAA2B;AAAA,MAC1C;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,MACnB;AAAA,IAAA,CACA;AAEK,UAAA,cAAcC,UAAAA,eAAe,OAAO,SAAS;AAC7C,UAAA,gBAAgB,QAAQ,IAAIA,wBAAc;AAEhD,QAAI,WAAW,KAAK,KAAK,UAAU,KAAK,KAAK,OAAO,OAAO;AAC1D,YAAM,QAAQ,KAAK,KAAK,OAAO,UAAU,iBAAiB,wBAAwB;AAC1E,cAAA,IAAI,0BAA0B,WAAW,KAAK,cAAc,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE;AAAA,IAAA,OACnF;AACN,UAAI,gBAAgB;AACpB,UAAI,KAAK,KAAK,OAAO,WAAW,YAAY;AAC3B,wBAAA;AAAA,MACN,WAAA,KAAK,KAAK,OAAO,WAAW,cAAc;AACpC,wBAAA;AAAA,MAAA;AAGT,cAAA,IAAI,eAAe,WAAW,gBAAgB,cAAc,KAAK,IAAI,CAAC,IAAI,aAAa,EAAE;AAAA,IAAA;AAIvE,+BAAA;AAAA,EAAA;AAAA,EAGrB,mBAAkC;AACjC,WAAAC,kBAAA;AAAA,MACNC,+BAAa,KAAK,KAAK,YAAY,CAAC,EAAE,cAAc;AAAA,QACnD,GAAG;AAAA,QACH,QAAQ;AAAA,UACP,GAAG,OAAO;AAAA,UACV,KAAK,KAAK;AAAA,QAAA;AAAA,MACX,EACC;AAAA,IACH;AAAA,EAAA;AAAA,EAGD,SAAS,EAAE,mBAAkD;AACrD,WAAA;AAAA,MACN,SAAS,iBAAiB,KAAK,KAAK,OAAO,QAAQ,UAAU,YAAY,KAAK,KAAK,KAAK,OAAO,OAAO,KAAK,IAAI,CAAC,eAAe,KAAK,KAAK,UAAU;AAAA,MACnJ,gBAAgB,CAAC,gBAAgB,SAAS,KAAK,KAAK,UAAU,IAC3D,8EACA;AAAA,IACJ;AAAA,EAAA;AAGF;AAEO,MAAM,qCAAqCC,oBAAAA,uBAAuB;AAAA,EACxE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAOM,MAAM,6BAA+C;AAAA,EAC3D,WAAW,gBAAwB,eAAuB;AACzD,WAAO,OAAO,OAAO,cAAc,MAAM,QAAQ,EAAE;AAAA,MAAQ,CAAA,WAC1D,OAAO,OACL,OAAO,CAAA,OAAM,CAAC,eAAe,MAAM,SAAS,OAAO,IAAI,EAAE,OAAO,KAAK,CAAQ,SAAA,UAAU,KAAK,QAAQ,GAAG,MAAM,CAAC,CAAC,EAC/G,IAAI,CAAU,WAAA,mCAAmC,mBAAmB;AAAA,QACpE,YAAY,OAAO;AAAA,QACnB;AAAA,MAAA,CACA,CAAC;AAAA,IACJ;AAAA,EAAA;AAEF;;;;"}
@@ -8,9 +8,10 @@ class CreateUniqueConstraintModificationHandler {
8
8
  this.data = data;
9
9
  this.schema = schema;
10
10
  }
11
- createSql(builder, { databaseMetadata, invalidateDatabaseMetadata }) {
11
+ createSql(builder, { invalidateDatabaseMetadata }) {
12
12
  const entity = this.schema.model.entities[this.data.entityName];
13
- if (entity.view) {
13
+ const shouldExecuteSql = !entity.view || this.data.unique.index && entity.view.materialized;
14
+ if (!shouldExecuteSql) {
14
15
  return;
15
16
  }
16
17
  const fields = this.data.unique.fields;
@@ -21,13 +22,18 @@ class CreateUniqueConstraintModificationHandler {
21
22
  });
22
23
  const tableNameId = wrapIdentifier(entity.tableName);
23
24
  const columnNameIds = columns.map(wrapIdentifier);
24
- let checkModifier = "";
25
- if (this.data.unique.timing === "deferred") {
26
- checkModifier = " INITIALLY DEFERRED";
27
- } else if (this.data.unique.timing === "deferrable") {
28
- checkModifier = " DEFERRABLE";
25
+ if ("index" in this.data.unique && this.data.unique.index) {
26
+ const nulls = this.data.unique.nulls === "not distinct" ? " NULLS NOT DISTINCT" : " NULLS DISTINCT";
27
+ builder.sql(`CREATE UNIQUE INDEX ON ${tableNameId} (${columnNameIds.join(", ")})${nulls}`);
28
+ } else {
29
+ let checkModifier = "";
30
+ if (this.data.unique.timing === "deferred") {
31
+ checkModifier = " INITIALLY DEFERRED";
32
+ } else if (this.data.unique.timing === "deferrable") {
33
+ checkModifier = " DEFERRABLE";
34
+ }
35
+ builder.sql(`ALTER TABLE ${tableNameId} ADD UNIQUE (${columnNameIds.join(", ")})${checkModifier}`);
29
36
  }
30
- builder.sql(`ALTER TABLE ${tableNameId} ADD UNIQUE (${columnNameIds.join(", ")})${checkModifier}`);
31
37
  invalidateDatabaseMetadata();
32
38
  }
33
39
  getSchemaUpdater() {
@@ -43,7 +49,7 @@ class CreateUniqueConstraintModificationHandler {
43
49
  }
44
50
  describe({ createdEntities }) {
45
51
  return {
46
- message: `Create unique constraint (${this.data.unique.fields.join(", ")}) on entity ${this.data.entityName}`,
52
+ message: `Create unique ${this.data.unique.index ? "index" : "constraint"} (${this.data.unique.fields.join(", ")}) on entity ${this.data.entityName}`,
47
53
  failureWarning: !createdEntities.includes(this.data.entityName) ? "Make sure no conflicting rows exists, otherwise this may fail in runtime." : void 0
48
54
  };
49
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CreateUniqueConstraintModification.js","sources":["../../../../../../packages/schema-migrations/src/modifications/constraints/CreateUniqueConstraintModification.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\nimport { Model, Schema } from '@contember/schema'\nimport { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'\nimport {\n\tcreateModificationType,\n\tDiffer,\n\tModificationHandler,\n\tModificationHandlerCreateSqlOptions,\n} from '../ModificationHandler'\nimport { wrapIdentifier } from '../../utils/dbHelpers'\nimport { getUniqueConstraintColumns } from './utils'\nimport deepEqual from 'fast-deep-equal'\n\nexport class CreateUniqueConstraintModificationHandler implements ModificationHandler<CreateUniqueConstraintModificationData> {\n\tconstructor(private readonly data: CreateUniqueConstraintModificationData, private readonly schema: Schema) {\n\t}\n\n\tpublic createSql(builder: MigrationBuilder, { databaseMetadata, invalidateDatabaseMetadata }: ModificationHandlerCreateSqlOptions): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tif (entity.view) {\n\t\t\treturn\n\t\t}\n\t\tconst fields = this.data.unique.fields\n\t\tconst columns = getUniqueConstraintColumns({\n\t\t\tentity,\n\t\t\tmodel: this.schema.model,\n\t\t\tfields,\n\t\t})\n\n\t\tconst tableNameId = wrapIdentifier(entity.tableName)\n\t\tconst columnNameIds = columns.map(wrapIdentifier)\n\n\t\tlet checkModifier = ''\n\t\tif (this.data.unique.timing === 'deferred') {\n\t\t\tcheckModifier = ' INITIALLY DEFERRED'\n\t\t} else if (this.data.unique.timing === 'deferrable') {\n\t\t\tcheckModifier = ' DEFERRABLE'\n\t\t}\n\n\t\tbuilder.sql(`ALTER TABLE ${tableNameId} ADD UNIQUE (${columnNameIds.join(', ')})${checkModifier}`)\n\n\t\tinvalidateDatabaseMetadata()\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(\n\t\t\tupdateEntity(this.data.entityName, ({ entity }) => ({\n\t\t\t\t...entity,\n\t\t\t\tunique: [\n\t\t\t\t\t...entity.unique,\n\t\t\t\t\tthis.data.unique,\n\t\t\t\t],\n\t\t\t})),\n\t\t)\n\t}\n\n\tdescribe({ createdEntities }: { createdEntities: string[] }) {\n\t\treturn {\n\t\t\tmessage: `Create unique constraint (${this.data.unique.fields.join(', ')}) on entity ${this.data.entityName}`,\n\t\t\tfailureWarning: !createdEntities.includes(this.data.entityName)\n\t\t\t\t? 'Make sure no conflicting rows exists, otherwise this may fail in runtime.'\n\t\t\t\t: undefined,\n\t\t}\n\t}\n\n}\n\nexport const createUniqueConstraintModification = createModificationType({\n\tid: 'createUniqueConstraint',\n\thandler: CreateUniqueConstraintModificationHandler,\n})\n\nexport interface CreateUniqueConstraintModificationData {\n\tentityName: string\n\tunique: Model.UniqueConstraint\n}\n\nexport class CreateUniqueConstraintDiffer implements Differ {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn Object.values(updatedSchema.model.entities).flatMap(entity =>\n\t\t\tentity.unique\n\t\t\t\t.filter(it => !originalSchema.model.entities[entity.name].unique.find(uniq => deepEqual(uniq.fields, it.fields)))\n\t\t\t\t.map(unique => createUniqueConstraintModification.createModification({\n\t\t\t\t\tentityName: entity.name,\n\t\t\t\t\tunique,\n\t\t\t\t})),\n\t\t)\n\t}\n}\n"],"names":[],"mappings":";;;;;AAaO,MAAM,0CAAiH;AAAA,EAC7H,YAA6B,MAA+D,QAAgB;AAA/E,SAAA,OAAA;AAA+D,SAAA,SAAA;AAAA,EAAA;AAAA,EAGrF,UAAU,SAA2B,EAAE,kBAAkB,8BAAyE;AACxI,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AAC9D,QAAI,OAAO,MAAM;AAChB;AAAA,IAAA;AAEK,UAAA,SAAS,KAAK,KAAK,OAAO;AAChC,UAAM,UAAU,2BAA2B;AAAA,MAC1C;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,MACnB;AAAA,IAAA,CACA;AAEK,UAAA,cAAc,eAAe,OAAO,SAAS;AAC7C,UAAA,gBAAgB,QAAQ,IAAI,cAAc;AAEhD,QAAI,gBAAgB;AACpB,QAAI,KAAK,KAAK,OAAO,WAAW,YAAY;AAC3B,sBAAA;AAAA,IACN,WAAA,KAAK,KAAK,OAAO,WAAW,cAAc;AACpC,sBAAA;AAAA,IAAA;AAGT,YAAA,IAAI,eAAe,WAAW,gBAAgB,cAAc,KAAK,IAAI,CAAC,IAAI,aAAa,EAAE;AAEtE,+BAAA;AAAA,EAAA;AAAA,EAGrB,mBAAkC;AACjC,WAAA;AAAA,MACN,aAAa,KAAK,KAAK,YAAY,CAAC,EAAE,cAAc;AAAA,QACnD,GAAG;AAAA,QACH,QAAQ;AAAA,UACP,GAAG,OAAO;AAAA,UACV,KAAK,KAAK;AAAA,QAAA;AAAA,MACX,EACC;AAAA,IACH;AAAA,EAAA;AAAA,EAGD,SAAS,EAAE,mBAAkD;AACrD,WAAA;AAAA,MACN,SAAS,6BAA6B,KAAK,KAAK,OAAO,OAAO,KAAK,IAAI,CAAC,eAAe,KAAK,KAAK,UAAU;AAAA,MAC3G,gBAAgB,CAAC,gBAAgB,SAAS,KAAK,KAAK,UAAU,IAC3D,8EACA;AAAA,IACJ;AAAA,EAAA;AAGF;AAEO,MAAM,qCAAqC,uBAAuB;AAAA,EACxE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAOM,MAAM,6BAA+C;AAAA,EAC3D,WAAW,gBAAwB,eAAuB;AACzD,WAAO,OAAO,OAAO,cAAc,MAAM,QAAQ,EAAE;AAAA,MAAQ,CAAA,WAC1D,OAAO,OACL,OAAO,CAAA,OAAM,CAAC,eAAe,MAAM,SAAS,OAAO,IAAI,EAAE,OAAO,KAAK,CAAQ,SAAA,UAAU,KAAK,QAAQ,GAAG,MAAM,CAAC,CAAC,EAC/G,IAAI,CAAU,WAAA,mCAAmC,mBAAmB;AAAA,QACpE,YAAY,OAAO;AAAA,QACnB;AAAA,MAAA,CACA,CAAC;AAAA,IACJ;AAAA,EAAA;AAEF;"}
1
+ {"version":3,"file":"CreateUniqueConstraintModification.js","sources":["../../../../../../packages/schema-migrations/src/modifications/constraints/CreateUniqueConstraintModification.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\nimport { Model, Schema } from '@contember/schema'\nimport { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'\nimport {\n\tcreateModificationType,\n\tDiffer,\n\tModificationHandler,\n\tModificationHandlerCreateSqlOptions,\n} from '../ModificationHandler'\nimport { wrapIdentifier } from '../../utils/dbHelpers'\nimport { getUniqueConstraintColumns } from './utils'\nimport deepEqual from 'fast-deep-equal'\n\nexport class CreateUniqueConstraintModificationHandler implements ModificationHandler<CreateUniqueConstraintModificationData> {\n\tconstructor(private readonly data: CreateUniqueConstraintModificationData, private readonly schema: Schema) {\n\t}\n\n\tpublic createSql(builder: MigrationBuilder, { invalidateDatabaseMetadata }: ModificationHandlerCreateSqlOptions): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tconst shouldExecuteSql =\n\t\t\t!entity.view\n\t\t\t|| (this.data.unique.index && entity.view.materialized)\n\t\tif (!shouldExecuteSql) {\n\t\t\treturn\n\t\t}\n\t\tconst fields = this.data.unique.fields\n\t\tconst columns = getUniqueConstraintColumns({\n\t\t\tentity,\n\t\t\tmodel: this.schema.model,\n\t\t\tfields,\n\t\t})\n\n\t\tconst tableNameId = wrapIdentifier(entity.tableName)\n\t\tconst columnNameIds = columns.map(wrapIdentifier)\n\n\t\tif ('index' in this.data.unique && this.data.unique.index) {\n\t\t\tconst nulls = this.data.unique.nulls === 'not distinct' ? ' NULLS NOT DISTINCT' : ' NULLS DISTINCT'\n\t\t\tbuilder.sql(`CREATE UNIQUE INDEX ON ${tableNameId} (${columnNameIds.join(', ')})${nulls}`)\n\t\t} else {\n\t\t\tlet checkModifier = ''\n\t\t\tif (this.data.unique.timing === 'deferred') {\n\t\t\t\tcheckModifier = ' INITIALLY DEFERRED'\n\t\t\t} else if (this.data.unique.timing === 'deferrable') {\n\t\t\t\tcheckModifier = ' DEFERRABLE'\n\t\t\t}\n\n\t\t\tbuilder.sql(`ALTER TABLE ${tableNameId} ADD UNIQUE (${columnNameIds.join(', ')})${checkModifier}`)\n\t\t}\n\n\n\t\tinvalidateDatabaseMetadata()\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\treturn updateModel(\n\t\t\tupdateEntity(this.data.entityName, ({ entity }) => ({\n\t\t\t\t...entity,\n\t\t\t\tunique: [\n\t\t\t\t\t...entity.unique,\n\t\t\t\t\tthis.data.unique,\n\t\t\t\t],\n\t\t\t})),\n\t\t)\n\t}\n\n\tdescribe({ createdEntities }: { createdEntities: string[] }) {\n\t\treturn {\n\t\t\tmessage: `Create unique ${this.data.unique.index ? 'index' : 'constraint'} (${this.data.unique.fields.join(', ')}) on entity ${this.data.entityName}`,\n\t\t\tfailureWarning: !createdEntities.includes(this.data.entityName)\n\t\t\t\t? 'Make sure no conflicting rows exists, otherwise this may fail in runtime.'\n\t\t\t\t: undefined,\n\t\t}\n\t}\n\n}\n\nexport const createUniqueConstraintModification = createModificationType({\n\tid: 'createUniqueConstraint',\n\thandler: CreateUniqueConstraintModificationHandler,\n})\n\nexport interface CreateUniqueConstraintModificationData {\n\tentityName: string\n\tunique: Model.UniqueConstraint | Model.UniqueIndex\n}\n\nexport class CreateUniqueConstraintDiffer implements Differ {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn Object.values(updatedSchema.model.entities).flatMap(entity =>\n\t\t\tentity.unique\n\t\t\t\t.filter(it => !originalSchema.model.entities[entity.name].unique.find(uniq => deepEqual(uniq.fields, it.fields)))\n\t\t\t\t.map(unique => createUniqueConstraintModification.createModification({\n\t\t\t\t\tentityName: entity.name,\n\t\t\t\t\tunique,\n\t\t\t\t})),\n\t\t)\n\t}\n}\n"],"names":[],"mappings":";;;;;AAaO,MAAM,0CAAiH;AAAA,EAC7H,YAA6B,MAA+D,QAAgB;AAA/E,SAAA,OAAA;AAA+D,SAAA,SAAA;AAAA,EAAA;AAAA,EAGrF,UAAU,SAA2B,EAAE,8BAAyE;AACtH,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AACxD,UAAA,mBACL,CAAC,OAAO,QACJ,KAAK,KAAK,OAAO,SAAS,OAAO,KAAK;AAC3C,QAAI,CAAC,kBAAkB;AACtB;AAAA,IAAA;AAEK,UAAA,SAAS,KAAK,KAAK,OAAO;AAChC,UAAM,UAAU,2BAA2B;AAAA,MAC1C;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,MACnB;AAAA,IAAA,CACA;AAEK,UAAA,cAAc,eAAe,OAAO,SAAS;AAC7C,UAAA,gBAAgB,QAAQ,IAAI,cAAc;AAEhD,QAAI,WAAW,KAAK,KAAK,UAAU,KAAK,KAAK,OAAO,OAAO;AAC1D,YAAM,QAAQ,KAAK,KAAK,OAAO,UAAU,iBAAiB,wBAAwB;AAC1E,cAAA,IAAI,0BAA0B,WAAW,KAAK,cAAc,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE;AAAA,IAAA,OACnF;AACN,UAAI,gBAAgB;AACpB,UAAI,KAAK,KAAK,OAAO,WAAW,YAAY;AAC3B,wBAAA;AAAA,MACN,WAAA,KAAK,KAAK,OAAO,WAAW,cAAc;AACpC,wBAAA;AAAA,MAAA;AAGT,cAAA,IAAI,eAAe,WAAW,gBAAgB,cAAc,KAAK,IAAI,CAAC,IAAI,aAAa,EAAE;AAAA,IAAA;AAIvE,+BAAA;AAAA,EAAA;AAAA,EAGrB,mBAAkC;AACjC,WAAA;AAAA,MACN,aAAa,KAAK,KAAK,YAAY,CAAC,EAAE,cAAc;AAAA,QACnD,GAAG;AAAA,QACH,QAAQ;AAAA,UACP,GAAG,OAAO;AAAA,UACV,KAAK,KAAK;AAAA,QAAA;AAAA,MACX,EACC;AAAA,IACH;AAAA,EAAA;AAAA,EAGD,SAAS,EAAE,mBAAkD;AACrD,WAAA;AAAA,MACN,SAAS,iBAAiB,KAAK,KAAK,OAAO,QAAQ,UAAU,YAAY,KAAK,KAAK,KAAK,OAAO,OAAO,KAAK,IAAI,CAAC,eAAe,KAAK,KAAK,UAAU;AAAA,MACnJ,gBAAgB,CAAC,gBAAgB,SAAS,KAAK,KAAK,UAAU,IAC3D,8EACA;AAAA,IACJ;AAAA,EAAA;AAGF;AAEO,MAAM,qCAAqC,uBAAuB;AAAA,EACxE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAOM,MAAM,6BAA+C;AAAA,EAC3D,WAAW,gBAAwB,eAAuB;AACzD,WAAO,OAAO,OAAO,cAAc,MAAM,QAAQ,EAAE;AAAA,MAAQ,CAAA,WAC1D,OAAO,OACL,OAAO,CAAA,OAAM,CAAC,eAAe,MAAM,SAAS,OAAO,IAAI,EAAE,OAAO,KAAK,CAAQ,SAAA,UAAU,KAAK,QAAQ,GAAG,MAAM,CAAC,CAAC,EAC/G,IAAI,CAAU,WAAA,mCAAmC,mBAAmB;AAAA,QACpE,YAAY,OAAO;AAAA,QACnB;AAAA,MAAA,CACA,CAAC;AAAA,IACJ;AAAA,EAAA;AAEF;"}
@@ -12,26 +12,41 @@ class RemoveUniqueConstraintModificationHandler {
12
12
  }
13
13
  createSql(builder, { databaseMetadata, invalidateDatabaseMetadata }) {
14
14
  const entity = this.schema.model.entities[this.data.entityName];
15
- if (entity.view) {
15
+ const unique = this.getUnique();
16
+ const shouldExecuteSql = !entity.view || unique.index && entity.view.materialized;
17
+ if (!shouldExecuteSql) {
16
18
  return;
17
19
  }
18
- const fields = this.getFields();
19
20
  const columns = utils.getUniqueConstraintColumns({
20
21
  entity,
21
- fields,
22
+ fields: unique.fields,
22
23
  model: this.schema.model
23
24
  });
24
- const constraintNames = databaseMetadata.uniqueConstraints.filter({ tableName: entity.tableName, columnNames: columns }).getNames();
25
- for (const name of constraintNames) {
26
- builder.sql(`ALTER TABLE ${dbHelpers.wrapIdentifier(entity.tableName)} DROP CONSTRAINT ${dbHelpers.wrapIdentifier(name)}`);
25
+ if (unique.index) {
26
+ const indexNames = databaseMetadata.indexes.filter({
27
+ tableName: entity.tableName,
28
+ columnNames: columns,
29
+ unique: true
30
+ }).getNames();
31
+ for (const name of indexNames) {
32
+ builder.sql(`DROP INDEX ${dbHelpers.wrapIdentifier(name)}`);
33
+ }
34
+ } else {
35
+ const constraintNames = databaseMetadata.uniqueConstraints.filter({
36
+ tableName: entity.tableName,
37
+ columnNames: columns
38
+ }).getNames();
39
+ for (const name of constraintNames) {
40
+ builder.sql(`ALTER TABLE ${dbHelpers.wrapIdentifier(entity.tableName)} DROP CONSTRAINT ${dbHelpers.wrapIdentifier(name)}`);
41
+ }
27
42
  }
28
43
  invalidateDatabaseMetadata();
29
44
  }
30
45
  getSchemaUpdater() {
31
- const fields = this.getFields();
46
+ const thisUnique = this.getUnique();
32
47
  return schemaUpdateUtils.updateModel(
33
48
  schemaUpdateUtils.updateEntity(this.data.entityName, ({ entity }) => {
34
- const unique = entity.unique.filter((it) => !deepEqual(it.fields, fields));
49
+ const unique = entity.unique.filter((it) => !deepEqual(it, thisUnique));
35
50
  return {
36
51
  ...entity,
37
52
  unique
@@ -40,16 +55,19 @@ class RemoveUniqueConstraintModificationHandler {
40
55
  );
41
56
  }
42
57
  describe() {
43
- const fields = this.getFields();
44
- return { message: `Remove unique constraint (${fields.join(", ")}) on entity ${this.data.entityName}` };
58
+ const unique = this.getUnique();
59
+ return { message: `Remove unique ${unique.index ? "index" : "constraint"} (${unique.fields.join(", ")}) on entity ${this.data.entityName}` };
45
60
  }
46
- getFields() {
61
+ getUnique() {
62
+ if ("unique" in this.data) {
63
+ return this.data.unique;
64
+ }
47
65
  const entity = this.schema.model.entities[this.data.entityName];
48
- const fields = "constraintName" in this.data ? entity.unique.find((it) => it.name === this.data.constraintName)?.fields : this.data.fields;
49
- if (!fields) {
66
+ const unique = "constraintName" in this.data ? entity.unique.find((it) => "name" in it && it.name === this.data.constraintName) : entity.unique.find((it) => deepEqual(it.fields, this.data.fields));
67
+ if (!unique) {
50
68
  throw new Error();
51
69
  }
52
- return fields;
70
+ return unique;
53
71
  }
54
72
  }
55
73
  const removeUniqueConstraintModification = ModificationHandler.createModificationType({
@@ -64,11 +82,11 @@ class RemoveUniqueConstraintDiffer {
64
82
  if (!updatedEntity) {
65
83
  return false;
66
84
  }
67
- return !updatedEntity.unique.find((uniq) => deepEqual(uniq.fields, it.fields) && it.timing === uniq.timing);
85
+ return !updatedEntity.unique.find((uniq) => deepEqual(uniq, it));
68
86
  }).map(
69
87
  (unique) => removeUniqueConstraintModification.createModification({
70
88
  entityName: entity.name,
71
- fields: unique.fields
89
+ unique
72
90
  })
73
91
  )
74
92
  );
@@ -1 +1 @@
1
- {"version":3,"file":"RemoveUniqueConstraintModification.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/constraints/RemoveUniqueConstraintModification.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\nimport { Schema } from '@contember/schema'\nimport { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'\nimport {\n\tcreateModificationType,\n\tDiffer,\n\tModificationHandler,\n\tModificationHandlerCreateSqlOptions,\n} from '../ModificationHandler'\nimport deepEqual from 'fast-deep-equal'\nimport { getUniqueConstraintColumns } from './utils'\nimport { wrapIdentifier } from '../../utils/dbHelpers'\n\nexport class RemoveUniqueConstraintModificationHandler implements ModificationHandler<RemoveUniqueConstraintModificationData> {\n\tconstructor(private readonly data: RemoveUniqueConstraintModificationData, private readonly schema: Schema) {\n\t}\n\n\tpublic createSql(builder: MigrationBuilder, { databaseMetadata, invalidateDatabaseMetadata }: ModificationHandlerCreateSqlOptions): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tif (entity.view) {\n\t\t\treturn\n\t\t}\n\n\t\tconst fields = this.getFields()\n\n\t\tconst columns = getUniqueConstraintColumns({\n\t\t\tentity,\n\t\t\tfields: fields,\n\t\t\tmodel: this.schema.model,\n\t\t})\n\n\t\tconst constraintNames = databaseMetadata.uniqueConstraints.filter({ tableName: entity.tableName, columnNames: columns }).getNames()\n\n\t\tfor (const name of constraintNames) {\n\t\t\tbuilder.sql(`ALTER TABLE ${wrapIdentifier(entity.tableName)} DROP CONSTRAINT ${wrapIdentifier(name)}`)\n\t\t}\n\n\t\tinvalidateDatabaseMetadata()\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\tconst fields = this.getFields()\n\t\treturn updateModel(\n\t\t\tupdateEntity(this.data.entityName, ({ entity }) => {\n\t\t\t\tconst unique = entity.unique.filter(it => !deepEqual(it.fields, fields))\n\t\t\t\treturn {\n\t\t\t\t\t...entity,\n\t\t\t\t\tunique,\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n\t}\n\n\tdescribe() {\n\t\tconst fields = this.getFields()\n\t\treturn { message: `Remove unique constraint (${fields.join(', ')}) on entity ${this.data.entityName}` }\n\t}\n\n\tgetFields() {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tconst fields = 'constraintName' in this.data\n\t\t\t? entity.unique.find(it => it.name === this.data.constraintName)?.fields\n\t\t\t: this.data.fields\n\n\t\tif (!fields) {\n\t\t\tthrow new Error()\n\t\t}\n\t\treturn fields\n\t}\n}\n\nexport const removeUniqueConstraintModification = createModificationType({\n\tid: 'removeUniqueConstraint',\n\thandler: RemoveUniqueConstraintModificationHandler,\n})\n\nexport type RemoveUniqueConstraintModificationData =\n\t| {\n\t\tentityName: string\n\t\tconstraintName: string\n\t\tfields?: never\n\t}\n\t| {\n\t\tentityName: string\n\t\tfields: readonly string[]\n\t\tconstraintName?: never\n\t}\n\n\nexport class RemoveUniqueConstraintDiffer implements Differ {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn Object.values(originalSchema.model.entities).flatMap(entity =>\n\t\t\tentity.unique\n\t\t\t\t.filter(it => {\n\t\t\t\t\tconst updatedEntity = updatedSchema.model.entities[entity.name]\n\t\t\t\t\tif (!updatedEntity) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t\treturn !updatedEntity.unique.find(uniq => deepEqual(uniq.fields, it.fields) && it.timing === uniq.timing)\n\t\t\t\t})\n\t\t\t\t.map(unique =>\n\t\t\t\t\tremoveUniqueConstraintModification.createModification({\n\t\t\t\t\t\tentityName: entity.name,\n\t\t\t\t\t\tfields: unique.fields,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t)\n\t}\n}\n"],"names":["getUniqueConstraintColumns","wrapIdentifier","updateModel","updateEntity","createModificationType"],"mappings":";;;;;;;AAaO,MAAM,0CAAiH;AAAA,EAC7H,YAA6B,MAA+D,QAAgB;AAA/E,SAAA,OAAA;AAA+D,SAAA,SAAA;AAAA,EAAA;AAAA,EAGrF,UAAU,SAA2B,EAAE,kBAAkB,8BAAyE;AACxI,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AAC9D,QAAI,OAAO,MAAM;AAChB;AAAA,IAAA;AAGK,UAAA,SAAS,KAAK,UAAU;AAE9B,UAAM,UAAUA,MAAAA,2BAA2B;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,IAAA,CACnB;AAED,UAAM,kBAAkB,iBAAiB,kBAAkB,OAAO,EAAE,WAAW,OAAO,WAAW,aAAa,QAAS,CAAA,EAAE,SAAS;AAElI,eAAW,QAAQ,iBAAiB;AAC3B,cAAA,IAAI,eAAeC,UAAA,eAAe,OAAO,SAAS,CAAC,oBAAoBA,UAAAA,eAAe,IAAI,CAAC,EAAE;AAAA,IAAA;AAG3E,+BAAA;AAAA,EAAA;AAAA,EAGrB,mBAAkC;AAClC,UAAA,SAAS,KAAK,UAAU;AACvB,WAAAC,kBAAA;AAAA,MACNC,+BAAa,KAAK,KAAK,YAAY,CAAC,EAAE,aAAa;AAC5C,cAAA,SAAS,OAAO,OAAO,OAAO,CAAA,OAAM,CAAC,UAAU,GAAG,QAAQ,MAAM,CAAC;AAChE,eAAA;AAAA,UACN,GAAG;AAAA,UACH;AAAA,QACD;AAAA,MACA,CAAA;AAAA,IACF;AAAA,EAAA;AAAA,EAGD,WAAW;AACJ,UAAA,SAAS,KAAK,UAAU;AACvB,WAAA,EAAE,SAAS,6BAA6B,OAAO,KAAK,IAAI,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG;AAAA,EAAA;AAAA,EAGvG,YAAY;AACX,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AAC9D,UAAM,SAAS,oBAAoB,KAAK,OACrC,OAAO,OAAO,KAAK,CAAA,OAAM,GAAG,SAAS,KAAK,KAAK,cAAc,GAAG,SAChE,KAAK,KAAK;AAEb,QAAI,CAAC,QAAQ;AACZ,YAAM,IAAI,MAAM;AAAA,IAAA;AAEV,WAAA;AAAA,EAAA;AAET;AAEO,MAAM,qCAAqCC,oBAAAA,uBAAuB;AAAA,EACxE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAeM,MAAM,6BAA+C;AAAA,EAC3D,WAAW,gBAAwB,eAAuB;AACzD,WAAO,OAAO,OAAO,eAAe,MAAM,QAAQ,EAAE;AAAA,MAAQ,CAC3D,WAAA,OAAO,OACL,OAAO,CAAM,OAAA;AACb,cAAM,gBAAgB,cAAc,MAAM,SAAS,OAAO,IAAI;AAC9D,YAAI,CAAC,eAAe;AACZ,iBAAA;AAAA,QAAA;AAER,eAAO,CAAC,cAAc,OAAO,KAAK,UAAQ,UAAU,KAAK,QAAQ,GAAG,MAAM,KAAK,GAAG,WAAW,KAAK,MAAM;AAAA,MACxG,CAAA,EACA;AAAA,QAAI,CAAA,WACJ,mCAAmC,mBAAmB;AAAA,UACrD,YAAY,OAAO;AAAA,UACnB,QAAQ,OAAO;AAAA,QACf,CAAA;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA;AAEF;;;;"}
1
+ {"version":3,"file":"RemoveUniqueConstraintModification.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/constraints/RemoveUniqueConstraintModification.ts"],"sourcesContent":["import { MigrationBuilder } from '@contember/database-migrations'\nimport { Model, Schema } from '@contember/schema'\nimport { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'\nimport {\n\tcreateModificationType,\n\tDiffer,\n\tModificationHandler,\n\tModificationHandlerCreateSqlOptions,\n} from '../ModificationHandler'\nimport deepEqual from 'fast-deep-equal'\nimport { getUniqueConstraintColumns } from './utils'\nimport { wrapIdentifier } from '../../utils/dbHelpers'\n\nexport class RemoveUniqueConstraintModificationHandler implements ModificationHandler<RemoveUniqueConstraintModificationData> {\n\tconstructor(private readonly data: RemoveUniqueConstraintModificationData, private readonly schema: Schema) {\n\t}\n\n\tpublic createSql(builder: MigrationBuilder, { databaseMetadata, invalidateDatabaseMetadata }: ModificationHandlerCreateSqlOptions): void {\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tconst unique = this.getUnique()\n\n\t\tconst shouldExecuteSql =\n\t\t\t!entity.view\n\t\t\t|| (unique.index && entity.view.materialized)\n\n\t\tif (!shouldExecuteSql) {\n\t\t\treturn\n\t\t}\n\n\n\t\tconst columns = getUniqueConstraintColumns({\n\t\t\tentity,\n\t\t\tfields: unique.fields,\n\t\t\tmodel: this.schema.model,\n\t\t})\n\n\t\tif (unique.index) {\n\t\t\tconst indexNames = databaseMetadata.indexes.filter({\n\t\t\t\ttableName: entity.tableName,\n\t\t\t\tcolumnNames: columns,\n\t\t\t\tunique: true,\n\t\t\t}).getNames()\n\n\t\t\tfor (const name of indexNames) {\n\t\t\t\tbuilder.sql(`DROP INDEX ${wrapIdentifier(name)}`)\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst constraintNames = databaseMetadata.uniqueConstraints.filter({\n\t\t\t\ttableName: entity.tableName,\n\t\t\t\tcolumnNames: columns,\n\t\t\t}).getNames()\n\n\t\t\tfor (const name of constraintNames) {\n\t\t\t\tbuilder.sql(`ALTER TABLE ${wrapIdentifier(entity.tableName)} DROP CONSTRAINT ${wrapIdentifier(name)}`)\n\t\t\t}\n\t\t}\n\n\n\t\tinvalidateDatabaseMetadata()\n\t}\n\n\tpublic getSchemaUpdater(): SchemaUpdater {\n\t\tconst thisUnique = this.getUnique()\n\t\treturn updateModel(\n\t\t\tupdateEntity(this.data.entityName, ({ entity }) => {\n\t\t\t\tconst unique = entity.unique.filter(it => !deepEqual(it, thisUnique))\n\t\t\t\treturn {\n\t\t\t\t\t...entity,\n\t\t\t\t\tunique,\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n\t}\n\n\tdescribe() {\n\t\tconst unique = this.getUnique()\n\t\treturn { message: `Remove unique ${unique.index ? 'index' : 'constraint'} (${unique.fields.join(', ')}) on entity ${this.data.entityName}` }\n\t}\n\n\tgetUnique(): Model.Unique {\n\t\tif ('unique' in this.data) {\n\t\t\treturn this.data.unique\n\t\t}\n\t\tconst entity = this.schema.model.entities[this.data.entityName]\n\t\tconst unique = 'constraintName' in this.data\n\t\t\t? entity.unique.find(it => 'name' in it && it.name === this.data.constraintName)\n\t\t\t: entity.unique.find(it => deepEqual(it.fields, this.data.fields))\n\n\t\tif (!unique) {\n\t\t\tthrow new Error()\n\t\t}\n\t\treturn unique\n\t}\n}\n\nexport const removeUniqueConstraintModification = createModificationType({\n\tid: 'removeUniqueConstraint',\n\thandler: RemoveUniqueConstraintModificationHandler,\n})\n\nexport type RemoveUniqueConstraintModificationData =\n\t| {\n\t\tentityName: string\n\t\tfields?: never\n\t\tconstraintName?: never\n\t\tunique: Model.Unique\n\t}\n\t// deprecated\n\t| {\n\t\tentityName: string\n\t\tconstraintName: string\n\t\tfields?: never\n\t}\n\t| {\n\t\tentityName: string\n\t\tfields: readonly string[]\n\t\tconstraintName?: never\n\t}\n\n\nexport class RemoveUniqueConstraintDiffer implements Differ {\n\tcreateDiff(originalSchema: Schema, updatedSchema: Schema) {\n\t\treturn Object.values(originalSchema.model.entities).flatMap(entity =>\n\t\t\tentity.unique\n\t\t\t\t.filter(it => {\n\t\t\t\t\tconst updatedEntity = updatedSchema.model.entities[entity.name]\n\t\t\t\t\tif (!updatedEntity) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t\treturn !updatedEntity.unique.find(uniq => deepEqual(uniq, it))\n\t\t\t\t})\n\t\t\t\t.map(unique =>\n\t\t\t\t\tremoveUniqueConstraintModification.createModification({\n\t\t\t\t\t\tentityName: entity.name,\n\t\t\t\t\t\tunique: unique,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t)\n\t}\n}\n"],"names":["getUniqueConstraintColumns","wrapIdentifier","updateModel","updateEntity","createModificationType"],"mappings":";;;;;;;AAaO,MAAM,0CAAiH;AAAA,EAC7H,YAA6B,MAA+D,QAAgB;AAA/E,SAAA,OAAA;AAA+D,SAAA,SAAA;AAAA,EAAA;AAAA,EAGrF,UAAU,SAA2B,EAAE,kBAAkB,8BAAyE;AACxI,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AACxD,UAAA,SAAS,KAAK,UAAU;AAE9B,UAAM,mBACL,CAAC,OAAO,QACJ,OAAO,SAAS,OAAO,KAAK;AAEjC,QAAI,CAAC,kBAAkB;AACtB;AAAA,IAAA;AAID,UAAM,UAAUA,MAAAA,2BAA2B;AAAA,MAC1C;AAAA,MACA,QAAQ,OAAO;AAAA,MACf,OAAO,KAAK,OAAO;AAAA,IAAA,CACnB;AAED,QAAI,OAAO,OAAO;AACX,YAAA,aAAa,iBAAiB,QAAQ,OAAO;AAAA,QAClD,WAAW,OAAO;AAAA,QAClB,aAAa;AAAA,QACb,QAAQ;AAAA,MACR,CAAA,EAAE,SAAS;AAEZ,iBAAW,QAAQ,YAAY;AAC9B,gBAAQ,IAAI,cAAcC,UAAAA,eAAe,IAAI,CAAC,EAAE;AAAA,MAAA;AAAA,IACjD,OAEM;AAEA,YAAA,kBAAkB,iBAAiB,kBAAkB,OAAO;AAAA,QACjE,WAAW,OAAO;AAAA,QAClB,aAAa;AAAA,MACb,CAAA,EAAE,SAAS;AAEZ,iBAAW,QAAQ,iBAAiB;AAC3B,gBAAA,IAAI,eAAeA,UAAA,eAAe,OAAO,SAAS,CAAC,oBAAoBA,UAAAA,eAAe,IAAI,CAAC,EAAE;AAAA,MAAA;AAAA,IACtG;AAI0B,+BAAA;AAAA,EAAA;AAAA,EAGrB,mBAAkC;AAClC,UAAA,aAAa,KAAK,UAAU;AAC3B,WAAAC,kBAAA;AAAA,MACNC,+BAAa,KAAK,KAAK,YAAY,CAAC,EAAE,aAAa;AAC5C,cAAA,SAAS,OAAO,OAAO,OAAO,QAAM,CAAC,UAAU,IAAI,UAAU,CAAC;AAC7D,eAAA;AAAA,UACN,GAAG;AAAA,UACH;AAAA,QACD;AAAA,MACA,CAAA;AAAA,IACF;AAAA,EAAA;AAAA,EAGD,WAAW;AACJ,UAAA,SAAS,KAAK,UAAU;AAC9B,WAAO,EAAE,SAAS,iBAAiB,OAAO,QAAQ,UAAU,YAAY,KAAK,OAAO,OAAO,KAAK,IAAI,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG;AAAA,EAAA;AAAA,EAG5I,YAA0B;AACrB,QAAA,YAAY,KAAK,MAAM;AAC1B,aAAO,KAAK,KAAK;AAAA,IAAA;AAElB,UAAM,SAAS,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU;AACxD,UAAA,SAAS,oBAAoB,KAAK,OACrC,OAAO,OAAO,KAAK,CAAM,OAAA,UAAU,MAAM,GAAG,SAAS,KAAK,KAAK,cAAc,IAC7E,OAAO,OAAO,KAAK,CAAA,OAAM,UAAU,GAAG,QAAQ,KAAK,KAAK,MAAM,CAAC;AAElE,QAAI,CAAC,QAAQ;AACZ,YAAM,IAAI,MAAM;AAAA,IAAA;AAEV,WAAA;AAAA,EAAA;AAET;AAEO,MAAM,qCAAqCC,oBAAAA,uBAAuB;AAAA,EACxE,IAAI;AAAA,EACJ,SAAS;AACV,CAAC;AAsBM,MAAM,6BAA+C;AAAA,EAC3D,WAAW,gBAAwB,eAAuB;AACzD,WAAO,OAAO,OAAO,eAAe,MAAM,QAAQ,EAAE;AAAA,MAAQ,CAC3D,WAAA,OAAO,OACL,OAAO,CAAM,OAAA;AACb,cAAM,gBAAgB,cAAc,MAAM,SAAS,OAAO,IAAI;AAC9D,YAAI,CAAC,eAAe;AACZ,iBAAA;AAAA,QAAA;AAED,eAAA,CAAC,cAAc,OAAO,KAAK,UAAQ,UAAU,MAAM,EAAE,CAAC;AAAA,MAC7D,CAAA,EACA;AAAA,QAAI,CAAA,WACJ,mCAAmC,mBAAmB;AAAA,UACrD,YAAY,OAAO;AAAA,UACnB;AAAA,QACA,CAAA;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA;AAEF;;;;"}