@contember/schema-migrations 1.3.0-alpha.7 → 1.3.0-beta.1

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 (237) hide show
  1. package/dist/src/MigrationDescriber.d.ts +4 -4
  2. package/dist/src/MigrationDescriber.d.ts.map +1 -1
  3. package/dist/src/MigrationDescriber.js +8 -7
  4. package/dist/src/MigrationDescriber.js.map +1 -1
  5. package/dist/src/SchemaDiffer.d.ts +1 -1
  6. package/dist/src/SchemaDiffer.d.ts.map +1 -1
  7. package/dist/src/SchemaDiffer.js +10 -2
  8. package/dist/src/SchemaDiffer.js.map +1 -1
  9. package/dist/src/SchemaMigrator.d.ts +1 -2
  10. package/dist/src/SchemaMigrator.d.ts.map +1 -1
  11. package/dist/src/SchemaMigrator.js +0 -1
  12. package/dist/src/SchemaMigrator.js.map +1 -1
  13. package/dist/src/modifications/ModificationHandler.d.ts +10 -6
  14. package/dist/src/modifications/ModificationHandler.d.ts.map +1 -1
  15. package/dist/src/modifications/ModificationHandler.js.map +1 -1
  16. package/dist/src/modifications/ModificationHandlerFactory.d.ts +2 -2
  17. package/dist/src/modifications/ModificationHandlerFactory.d.ts.map +1 -1
  18. package/dist/src/modifications/ModificationHandlerFactory.js +3 -2
  19. package/dist/src/modifications/ModificationHandlerFactory.js.map +1 -1
  20. package/dist/src/modifications/ModificationVersions.d.ts +4 -3
  21. package/dist/src/modifications/ModificationVersions.d.ts.map +1 -1
  22. package/dist/src/modifications/ModificationVersions.js +5 -4
  23. package/dist/src/modifications/ModificationVersions.js.map +1 -1
  24. package/dist/src/modifications/columns/CreateColumnModification.d.ts +2 -2
  25. package/dist/src/modifications/columns/CreateColumnModification.d.ts.map +1 -1
  26. package/dist/src/modifications/columns/CreateColumnModification.js +14 -24
  27. package/dist/src/modifications/columns/CreateColumnModification.js.map +1 -1
  28. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.d.ts +5 -3
  29. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.d.ts.map +1 -1
  30. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.js +19 -4
  31. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.js.map +1 -1
  32. package/dist/src/modifications/columns/columnUtils.d.ts +14 -0
  33. package/dist/src/modifications/columns/columnUtils.d.ts.map +1 -0
  34. package/dist/src/modifications/columns/columnUtils.js +29 -0
  35. package/dist/src/modifications/columns/columnUtils.js.map +1 -0
  36. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.d.ts +3 -3
  37. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.d.ts.map +1 -1
  38. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.js +20 -32
  39. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.js.map +1 -1
  40. package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.d.ts +11 -5
  41. package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.d.ts.map +1 -1
  42. package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.js +37 -9
  43. package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.js.map +1 -1
  44. package/dist/src/modifications/constraints/utils.d.ts +7 -0
  45. package/dist/src/modifications/constraints/utils.d.ts.map +1 -0
  46. package/dist/src/modifications/constraints/utils.js +33 -0
  47. package/dist/src/modifications/constraints/utils.js.map +1 -0
  48. package/dist/src/modifications/entities/CreateEntityModification.d.ts +4 -4
  49. package/dist/src/modifications/entities/CreateEntityModification.d.ts.map +1 -1
  50. package/dist/src/modifications/entities/CreateEntityModification.js +18 -14
  51. package/dist/src/modifications/entities/CreateEntityModification.js.map +1 -1
  52. package/dist/src/modifications/entities/CreateViewModification.d.ts +2 -2
  53. package/dist/src/modifications/entities/CreateViewModification.d.ts.map +1 -1
  54. package/dist/src/modifications/entities/CreateViewModification.js +14 -10
  55. package/dist/src/modifications/entities/CreateViewModification.js.map +1 -1
  56. package/dist/src/modifications/entities/RemoveEntityModification.d.ts +3 -4
  57. package/dist/src/modifications/entities/RemoveEntityModification.d.ts.map +1 -1
  58. package/dist/src/modifications/entities/RemoveEntityModification.js +3 -2
  59. package/dist/src/modifications/entities/RemoveEntityModification.js.map +1 -1
  60. package/dist/src/modifications/entities/ToggleEventLogModification.d.ts +2 -2
  61. package/dist/src/modifications/entities/ToggleEventLogModification.d.ts.map +1 -1
  62. package/dist/src/modifications/entities/ToggleEventLogModification.js +3 -3
  63. package/dist/src/modifications/entities/ToggleEventLogModification.js.map +1 -1
  64. package/dist/src/modifications/entities/UpdateEntityNameModification.d.ts +4 -5
  65. package/dist/src/modifications/entities/UpdateEntityNameModification.d.ts.map +1 -1
  66. package/dist/src/modifications/entities/UpdateEntityNameModification.js +3 -34
  67. package/dist/src/modifications/entities/UpdateEntityNameModification.js.map +1 -1
  68. package/dist/src/modifications/fields/RemoveFieldModification.js.map +1 -1
  69. package/dist/src/modifications/fields/UpdateFieldNameModification.d.ts +4 -5
  70. package/dist/src/modifications/fields/UpdateFieldNameModification.d.ts.map +1 -1
  71. package/dist/src/modifications/fields/UpdateFieldNameModification.js +18 -42
  72. package/dist/src/modifications/fields/UpdateFieldNameModification.js.map +1 -1
  73. package/dist/src/modifications/indexes/CreateIndexModification.d.ts +5 -5
  74. package/dist/src/modifications/indexes/CreateIndexModification.d.ts.map +1 -1
  75. package/dist/src/modifications/indexes/CreateIndexModification.js +24 -35
  76. package/dist/src/modifications/indexes/CreateIndexModification.js.map +1 -1
  77. package/dist/src/modifications/indexes/RemoveIndexModification.d.ts +12 -6
  78. package/dist/src/modifications/indexes/RemoveIndexModification.d.ts.map +1 -1
  79. package/dist/src/modifications/indexes/RemoveIndexModification.js +36 -10
  80. package/dist/src/modifications/indexes/RemoveIndexModification.js.map +1 -1
  81. package/dist/src/modifications/indexes/utils.d.ts +7 -0
  82. package/dist/src/modifications/indexes/utils.d.ts.map +1 -0
  83. package/dist/src/modifications/indexes/utils.js +33 -0
  84. package/dist/src/modifications/indexes/utils.js.map +1 -0
  85. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts +3 -4
  86. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts.map +1 -1
  87. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js +10 -10
  88. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js.map +1 -1
  89. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.d.ts +3 -4
  90. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.d.ts.map +1 -1
  91. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.js +14 -12
  92. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.js.map +1 -1
  93. package/dist/src/modifications/relations/CreateRelationModification.d.ts +4 -5
  94. package/dist/src/modifications/relations/CreateRelationModification.d.ts.map +1 -1
  95. package/dist/src/modifications/relations/CreateRelationModification.js +13 -17
  96. package/dist/src/modifications/relations/CreateRelationModification.js.map +1 -1
  97. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.d.ts +3 -4
  98. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.d.ts.map +1 -1
  99. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.js +4 -5
  100. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.js.map +1 -1
  101. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.d.ts +2 -2
  102. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.d.ts.map +1 -1
  103. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.js +3 -3
  104. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.js.map +1 -1
  105. package/dist/src/modifications/relations/helpers.d.ts +4 -1
  106. package/dist/src/modifications/relations/helpers.d.ts.map +1 -1
  107. package/dist/src/modifications/relations/helpers.js +20 -17
  108. package/dist/src/modifications/relations/helpers.js.map +1 -1
  109. package/dist/src/modifications/relations/normalization.d.ts +2 -2
  110. package/dist/src/modifications/relations/normalization.d.ts.map +1 -1
  111. package/dist/src/modifications/settings/UpdateSettingsModification.d.ts +1 -1
  112. package/dist/src/modifications/settings/UpdateSettingsModification.d.ts.map +1 -1
  113. package/dist/src/modifications/upgrade/RemoveIndexNamesModification.d.ts +19 -0
  114. package/dist/src/modifications/upgrade/RemoveIndexNamesModification.d.ts.map +1 -0
  115. package/dist/src/modifications/upgrade/RemoveIndexNamesModification.js +40 -0
  116. package/dist/src/modifications/upgrade/RemoveIndexNamesModification.js.map +1 -0
  117. package/dist/src/modifications/utils/createJunctionTable.d.ts +2 -3
  118. package/dist/src/modifications/utils/createJunctionTable.d.ts.map +1 -1
  119. package/dist/src/modifications/utils/createJunctionTable.js +4 -6
  120. package/dist/src/modifications/utils/createJunctionTable.js.map +1 -1
  121. package/dist/src/modifications/utils/schemaUpdateUtils.d.ts +12 -14
  122. package/dist/src/modifications/utils/schemaUpdateUtils.d.ts.map +1 -1
  123. package/dist/src/modifications/utils/schemaUpdateUtils.js +5 -20
  124. package/dist/src/modifications/utils/schemaUpdateUtils.js.map +1 -1
  125. package/dist/src/modifications/utils/stringArrayEquals.d.ts +2 -0
  126. package/dist/src/modifications/utils/stringArrayEquals.d.ts.map +1 -0
  127. package/dist/src/modifications/utils/stringArrayEquals.js +9 -0
  128. package/dist/src/modifications/utils/stringArrayEquals.js.map +1 -0
  129. package/dist/src/modifications/utils/viewDependencies.d.ts +1 -1
  130. package/dist/src/modifications/utils/viewDependencies.d.ts.map +1 -1
  131. package/dist/src/tsconfig.tsbuildinfo +1 -1
  132. package/dist/src/utils/PartialEntity.d.ts +5 -3
  133. package/dist/src/utils/PartialEntity.d.ts.map +1 -1
  134. package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.js +1 -1
  135. package/dist/tests/cases/integration/convertOneToManyRelation.test.js +5 -5
  136. package/dist/tests/cases/integration/convertOneToManyRelation.test.js.map +1 -1
  137. package/dist/tests/cases/integration/createAndDropIndex.test.js +4 -4
  138. package/dist/tests/cases/integration/createAndDropIndex.test.js.map +1 -1
  139. package/dist/tests/cases/integration/createColumn.test.js +0 -2
  140. package/dist/tests/cases/integration/createColumn.test.js.map +1 -1
  141. package/dist/tests/cases/integration/createEntity.test.js +6 -9
  142. package/dist/tests/cases/integration/createEntity.test.js.map +1 -1
  143. package/dist/tests/cases/integration/createManyHasMany.test.js +3 -3
  144. package/dist/tests/cases/integration/createManyHasOne.test.js +4 -4
  145. package/dist/tests/cases/integration/createManyHasOne.test.js.map +1 -1
  146. package/dist/tests/cases/integration/createOneHasMany.test.js +6 -9
  147. package/dist/tests/cases/integration/createOneHasMany.test.js.map +1 -1
  148. package/dist/tests/cases/integration/createOneHasOne.test.js +6 -6
  149. package/dist/tests/cases/integration/createRelationInverseSide.test.js +1 -1
  150. package/dist/tests/cases/integration/createRelationInverseSide.test.js.map +1 -1
  151. package/dist/tests/cases/integration/createView.test.js +6 -6
  152. package/dist/tests/cases/integration/removeField.test.js +6 -6
  153. package/dist/tests/cases/integration/removeField.test.js.map +1 -1
  154. package/dist/tests/cases/integration/updateColumnDefinition.test.js +42 -4
  155. package/dist/tests/cases/integration/updateColumnDefinition.test.js.map +1 -1
  156. package/dist/tests/cases/integration/updateEntityName.test.js +1 -20
  157. package/dist/tests/cases/integration/updateEntityName.test.js.map +1 -1
  158. package/dist/tests/cases/integration/updateFieldName.test.js +1 -21
  159. package/dist/tests/cases/integration/updateFieldName.test.js.map +1 -1
  160. package/dist/tests/cases/integration/updateRelationOnDelete.test.js +2 -2
  161. package/dist/tests/cases/integration/updateRelationOnDelete.test.js.map +1 -1
  162. package/dist/tests/cases/integration/updateView.test.js +18 -18
  163. package/dist/tests/scripts/checkCreateConsistentMigrations.js +1 -1
  164. package/dist/tests/scripts/checkCreateConsistentMigrations.js.map +1 -1
  165. package/dist/tests/src/tests.d.ts.map +1 -1
  166. package/dist/tests/src/tests.js +10 -4
  167. package/dist/tests/src/tests.js.map +1 -1
  168. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  169. package/package.json +8 -9
  170. package/src/MigrationDescriber.ts +11 -9
  171. package/src/SchemaDiffer.ts +12 -13
  172. package/src/SchemaMigrator.ts +1 -3
  173. package/src/modifications/ModificationHandler.ts +10 -5
  174. package/src/modifications/ModificationHandlerFactory.ts +12 -11
  175. package/src/modifications/ModificationVersions.ts +4 -3
  176. package/src/modifications/columns/CreateColumnModification.ts +19 -27
  177. package/src/modifications/columns/UpdateColumnDefinitionModification.ts +22 -4
  178. package/src/modifications/columns/columnUtils.ts +35 -0
  179. package/src/modifications/constraints/CreateUniqueConstraintModification.ts +31 -40
  180. package/src/modifications/constraints/RemoveUniqueConstraintModification.ts +60 -15
  181. package/src/modifications/constraints/utils.ts +36 -0
  182. package/src/modifications/entities/CreateEntityModification.ts +9 -8
  183. package/src/modifications/entities/CreateViewModification.ts +4 -3
  184. package/src/modifications/entities/RemoveEntityModification.ts +5 -5
  185. package/src/modifications/entities/ToggleEventLogModification.ts +4 -3
  186. package/src/modifications/entities/UpdateEntityNameModification.ts +10 -46
  187. package/src/modifications/fields/RemoveFieldModification.ts +1 -1
  188. package/src/modifications/fields/UpdateFieldNameModification.ts +30 -57
  189. package/src/modifications/indexes/CreateIndexModification.ts +35 -41
  190. package/src/modifications/indexes/RemoveIndexModification.ts +57 -17
  191. package/src/modifications/indexes/utils.ts +30 -0
  192. package/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.ts +7 -19
  193. package/src/modifications/relations/ConvertOneToManyRelationModification.ts +21 -22
  194. package/src/modifications/relations/CreateRelationModification.ts +20 -35
  195. package/src/modifications/relations/ToggleJunctionEventLogModification.ts +4 -5
  196. package/src/modifications/relations/UpdateRelationOnDeleteModification.ts +13 -5
  197. package/src/modifications/relations/helpers.ts +27 -22
  198. package/src/modifications/upgrade/RemoveIndexNamesModification.ts +46 -0
  199. package/src/modifications/utils/createJunctionTable.ts +8 -8
  200. package/src/modifications/utils/schemaUpdateUtils.ts +5 -17
  201. package/src/modifications/utils/stringArrayEquals.ts +4 -0
  202. package/src/tsconfig.json +0 -1
  203. package/src/utils/PartialEntity.ts +7 -1
  204. package/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.ts +1 -1
  205. package/tests/cases/integration/convertOneToManyRelation.test.ts +5 -5
  206. package/tests/cases/integration/createAndDropIndex.test.ts +4 -4
  207. package/tests/cases/integration/createColumn.test.ts +0 -2
  208. package/tests/cases/integration/createEntity.test.ts +6 -9
  209. package/tests/cases/integration/createManyHasMany.test.ts +3 -3
  210. package/tests/cases/integration/createManyHasOne.test.ts +4 -4
  211. package/tests/cases/integration/createOneHasMany.test.ts +6 -9
  212. package/tests/cases/integration/createOneHasOne.test.ts +6 -6
  213. package/tests/cases/integration/createRelationInverseSide.test.ts +1 -1
  214. package/tests/cases/integration/createView.test.ts +6 -6
  215. package/tests/cases/integration/removeField.test.ts +6 -6
  216. package/tests/cases/integration/updateColumnDefinition.test.ts +36 -4
  217. package/tests/cases/integration/updateEntityName.test.ts +1 -20
  218. package/tests/cases/integration/updateFieldName.test.ts +1 -21
  219. package/tests/cases/integration/updateRelationOnDelete.test.ts +2 -2
  220. package/tests/cases/integration/updateView.test.ts +18 -18
  221. package/tests/scripts/checkCreateConsistentMigrations.ts +1 -1
  222. package/tests/src/tests.ts +13 -8
  223. package/dist/src/modifications/utils/renameConstraintsHelper.d.ts +0 -8
  224. package/dist/src/modifications/utils/renameConstraintsHelper.d.ts.map +0 -1
  225. package/dist/src/modifications/utils/renameConstraintsHelper.js +0 -31
  226. package/dist/src/modifications/utils/renameConstraintsHelper.js.map +0 -1
  227. package/dist/src/modifications/utils/schemaMeta.d.ts +0 -8
  228. package/dist/src/modifications/utils/schemaMeta.d.ts.map +0 -1
  229. package/dist/src/modifications/utils/schemaMeta.js +0 -13
  230. package/dist/src/modifications/utils/schemaMeta.js.map +0 -1
  231. package/dist/tests/cases/integration/takenIndexName.test.d.ts +0 -2
  232. package/dist/tests/cases/integration/takenIndexName.test.d.ts.map +0 -1
  233. package/dist/tests/cases/integration/takenIndexName.test.js +0 -307
  234. package/dist/tests/cases/integration/takenIndexName.test.js.map +0 -1
  235. package/src/modifications/utils/renameConstraintsHelper.ts +0 -34
  236. package/src/modifications/utils/schemaMeta.ts +0 -18
  237. package/tests/cases/integration/takenIndexName.test.ts +0 -314
@@ -1,25 +1,48 @@
1
1
  import { MigrationBuilder } from '@contember/database-migrations'
2
2
  import { Schema } from '@contember/schema'
3
3
  import { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'
4
- import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
4
+ import {
5
+ createModificationType,
6
+ Differ,
7
+ ModificationHandler,
8
+ ModificationHandlerCreateSqlOptions,
9
+ } from '../ModificationHandler'
5
10
  import deepEqual from 'fast-deep-equal'
11
+ import { getUniqueConstraintColumns } from './utils'
12
+ import { wrapIdentifier } from '../../utils/dbHelpers'
6
13
 
7
14
  export class RemoveUniqueConstraintModificationHandler implements ModificationHandler<RemoveUniqueConstraintModificationData> {
8
15
  constructor(private readonly data: RemoveUniqueConstraintModificationData, private readonly schema: Schema) {
9
16
  }
10
17
 
11
- public createSql(builder: MigrationBuilder): void {
18
+ public createSql(builder: MigrationBuilder, { databaseMetadata, invalidateDatabaseMetadata }: ModificationHandlerCreateSqlOptions): void {
12
19
  const entity = this.schema.model.entities[this.data.entityName]
13
20
  if (entity.view) {
14
21
  return
15
22
  }
16
- builder.dropConstraint(entity.tableName, this.data.constraintName)
23
+
24
+ const fields = this.getFields()
25
+
26
+ const columns = getUniqueConstraintColumns({
27
+ entity,
28
+ fields: fields,
29
+ model: this.schema.model,
30
+ })
31
+
32
+ const constraintNames = databaseMetadata.getUniqueConstraintNames({ tableName: entity.tableName, columnNames: columns })
33
+
34
+ for (const name of constraintNames) {
35
+ builder.sql(`ALTER TABLE ${wrapIdentifier(entity.tableName)} DROP CONSTRAINT ${wrapIdentifier(name)}`)
36
+ }
37
+
38
+ invalidateDatabaseMetadata()
17
39
  }
18
40
 
19
41
  public getSchemaUpdater(): SchemaUpdater {
42
+ const fields = this.getFields()
20
43
  return updateModel(
21
44
  updateEntity(this.data.entityName, ({ entity }) => {
22
- const { [this.data.constraintName]: removed, ...unique } = entity.unique
45
+ const unique = entity.unique.filter(it => !deepEqual(it.fields, fields))
23
46
  return {
24
47
  ...entity,
25
48
  unique,
@@ -29,14 +52,21 @@ export class RemoveUniqueConstraintModificationHandler implements ModificationHa
29
52
  }
30
53
 
31
54
  describe() {
32
- const fields = this.schema.model.entities[this.data.entityName].unique[this.data.constraintName].fields
55
+ const fields = this.getFields()
33
56
  return { message: `Remove unique constraint (${fields.join(', ')}) on entity ${this.data.entityName}` }
34
57
  }
35
- }
36
58
 
37
- export interface RemoveUniqueConstraintModificationData {
38
- entityName: string
39
- constraintName: string
59
+ getFields() {
60
+ const entity = this.schema.model.entities[this.data.entityName]
61
+ const fields = 'constraintName' in this.data
62
+ ? entity.unique.find(it => it.name === this.data.constraintName)?.fields
63
+ : this.data.fields
64
+
65
+ if (!fields) {
66
+ throw new Error()
67
+ }
68
+ return fields
69
+ }
40
70
  }
41
71
 
42
72
  export const removeUniqueConstraintModification = createModificationType({
@@ -44,21 +74,36 @@ export const removeUniqueConstraintModification = createModificationType({
44
74
  handler: RemoveUniqueConstraintModificationHandler,
45
75
  })
46
76
 
77
+ export type RemoveUniqueConstraintModificationData =
78
+ | {
79
+ entityName: string
80
+ constraintName: string
81
+ fields?: never
82
+ }
83
+ | {
84
+ entityName: string
85
+ fields: readonly string[]
86
+ constraintName?: never
87
+ }
88
+
47
89
 
48
90
  export class RemoveUniqueConstraintDiffer implements Differ {
49
91
  createDiff(originalSchema: Schema, updatedSchema: Schema) {
50
92
  return Object.values(originalSchema.model.entities).flatMap(entity =>
51
- Object.values(entity.unique)
93
+ entity.unique
52
94
  .filter(
53
- it =>
54
- updatedSchema.model.entities[entity.name] &&
55
- (!updatedSchema.model.entities[entity.name].unique[it.name] ||
56
- !deepEqual(it.fields, updatedSchema.model.entities[entity.name].unique[it.name].fields)),
95
+ it => {
96
+ const updatedEntity = updatedSchema.model.entities[entity.name]
97
+ if (!updatedEntity) {
98
+ return false
99
+ }
100
+ return !updatedEntity.unique.find(uniq => deepEqual(uniq.fields, it.fields))
101
+ },
57
102
  )
58
103
  .map(unique =>
59
104
  removeUniqueConstraintModification.createModification({
60
105
  entityName: entity.name,
61
- constraintName: unique.name,
106
+ fields: unique.fields,
62
107
  }),
63
108
  ),
64
109
  )
@@ -0,0 +1,36 @@
1
+ import { acceptFieldVisitor } from '@contember/schema-utils'
2
+ import { Model } from '@contember/schema'
3
+
4
+ export const getUniqueConstraintColumns = ({ entity, fields, model }: {
5
+ fields: readonly string[]
6
+ model: Model.Schema
7
+ entity: Model.Entity
8
+ }) => {
9
+ return fields.map(fieldName => {
10
+ return acceptFieldVisitor(model, entity, fieldName, {
11
+ visitColumn: ({ column }) => {
12
+ return column.columnName
13
+ },
14
+ visitManyHasOne: ({ relation }) => {
15
+ return relation.joiningColumn.columnName
16
+ },
17
+ visitOneHasMany: () => {
18
+ throw new Error(`Cannot create unique key on 1:m relation in ${entity.name}.${fieldName}`)
19
+ },
20
+ visitOneHasOneOwning: () => {
21
+ throw new Error(
22
+ `Cannot create unique key on 1:1 relation, this relation has unique key by default in ${entity.name}.${fieldName}`,
23
+ )
24
+ },
25
+ visitOneHasOneInverse: () => {
26
+ throw new Error(`Cannot create unique key on 1:1 inverse relation in ${entity.name}.${fieldName}`)
27
+ },
28
+ visitManyHasManyOwning: () => {
29
+ throw new Error(`Cannot create unique key on m:m relation in ${entity.name}.${fieldName}`)
30
+ },
31
+ visitManyHasManyInverse: () => {
32
+ throw new Error(`Cannot create unique key on m:m inverse relation in ${entity.name}.${fieldName}`)
33
+ },
34
+ })
35
+ })
36
+ }
@@ -4,11 +4,11 @@ import { SchemaUpdater, updateModel } from '../utils/schemaUpdateUtils'
4
4
  import {
5
5
  createModificationType,
6
6
  Differ,
7
- ModificationHandler,
7
+ ModificationHandler, ModificationHandlerCreateSqlOptions,
8
8
  ModificationHandlerOptions,
9
9
  } from '../ModificationHandler'
10
10
  import { createEventTrigger, createEventTrxTrigger } from '../utils/sqlUpdateUtils'
11
- import { PartialEntity } from '../../utils/PartialEntity.js'
11
+ import { PossibleEntityShapeInMigrations } from '../../utils/PartialEntity.js'
12
12
  import { getColumnSqlType } from '../utils/columnUtils'
13
13
 
14
14
  export class CreateEntityModificationHandler implements ModificationHandler<CreateEntityModificationData> {
@@ -18,7 +18,7 @@ export class CreateEntityModificationHandler implements ModificationHandler<Crea
18
18
  private readonly options: ModificationHandlerOptions,
19
19
  ) {}
20
20
 
21
- public createSql(builder: MigrationBuilder): void {
21
+ public createSql(builder: MigrationBuilder, { systemSchema }: ModificationHandlerCreateSqlOptions): void {
22
22
  const entity = this.data.entity
23
23
  if (entity.view) {
24
24
  // BC
@@ -37,8 +37,8 @@ export class CreateEntityModificationHandler implements ModificationHandler<Crea
37
37
  })
38
38
 
39
39
  if (entity.eventLog?.enabled !== false) {
40
- createEventTrigger(builder, this.options.systemSchema, entity.tableName, [entity.primaryColumn])
41
- createEventTrxTrigger(builder, this.options.systemSchema, entity.tableName)
40
+ createEventTrigger(builder, systemSchema, entity.tableName, [entity.primaryColumn])
41
+ createEventTrxTrigger(builder, systemSchema, entity.tableName)
42
42
  }
43
43
  }
44
44
 
@@ -49,8 +49,9 @@ export class CreateEntityModificationHandler implements ModificationHandler<Crea
49
49
  ...model.entities,
50
50
  [this.data.entity.name]: {
51
51
  eventLog: { enabled: true },
52
- indexes: {},
53
52
  ...this.data.entity,
53
+ unique: Object.values(this.data.entity.unique),
54
+ indexes: Object.values(this.data.entity.indexes ?? []),
54
55
  },
55
56
  },
56
57
  }))
@@ -80,7 +81,7 @@ export class CreateEntityDiffer implements Differ {
80
81
  fields: {
81
82
  [entity.primary]: entity.fields[entity.primary],
82
83
  },
83
- unique: {},
84
+ unique: [],
84
85
  },
85
86
  }),
86
87
  )
@@ -88,5 +89,5 @@ export class CreateEntityDiffer implements Differ {
88
89
  }
89
90
 
90
91
  export interface CreateEntityModificationData {
91
- entity: PartialEntity
92
+ entity: PossibleEntityShapeInMigrations
92
93
  }
@@ -3,7 +3,7 @@ import { Model, Schema } from '@contember/schema'
3
3
  import { SchemaUpdater, updateModel } from '../utils/schemaUpdateUtils'
4
4
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
5
5
  import { Migration } from '../../Migration'
6
- import { PartialEntity } from '../../utils/PartialEntity.js'
6
+ import { PossibleEntityShapeInMigrations } from '../../utils/PartialEntity.js'
7
7
 
8
8
  export class CreateViewModificationHandler implements ModificationHandler<CreateViewModificationData> {
9
9
  constructor(private readonly data: CreateViewModificationData, private readonly schema: Schema) {}
@@ -22,9 +22,10 @@ export class CreateViewModificationHandler implements ModificationHandler<Create
22
22
  entities: {
23
23
  ...model.entities,
24
24
  [this.data.entity.name]: {
25
- indexes: {},
26
25
  eventLog: { enabled: true }, // not relevant here...
27
26
  ...this.data.entity,
27
+ unique: Object.values(this.data.entity.unique),
28
+ indexes: Object.values(this.data.entity.indexes ?? []),
28
29
  },
29
30
  },
30
31
  }))
@@ -68,5 +69,5 @@ export class CreateViewDiffer implements Differ {
68
69
  }
69
70
 
70
71
  export interface CreateViewModificationData {
71
- entity: PartialEntity
72
+ entity: PossibleEntityShapeInMigrations
72
73
  }
@@ -14,22 +14,21 @@ import {
14
14
  import {
15
15
  createModificationType,
16
16
  Differ,
17
- ModificationHandler,
17
+ ModificationHandler, ModificationHandlerCreateSqlOptions,
18
18
  ModificationHandlerOptions,
19
19
  } from '../ModificationHandler'
20
20
  import { VERSION_ACL_PATCH, VERSION_REMOVE_REFERENCING_RELATIONS } from '../ModificationVersions'
21
21
  import { isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'
22
22
  import { removeFieldModification } from '../fields'
23
- import { SchemaWithMeta } from '../utils/schemaMeta'
24
23
 
25
24
  export class RemoveEntityModificationHandler implements ModificationHandler<RemoveEntityModificationData> {
26
25
  constructor(
27
26
  private readonly data: RemoveEntityModificationData,
28
- private readonly schema: SchemaWithMeta,
27
+ private readonly schema: Schema,
29
28
  private readonly options: ModificationHandlerOptions,
30
29
  ) {}
31
30
 
32
- public createSql(builder: MigrationBuilder): void {
31
+ public createSql(builder: MigrationBuilder, options: ModificationHandlerCreateSqlOptions): void {
33
32
  const entity = this.schema.model.entities[this.data.entityName]
34
33
  if (entity.view) {
35
34
  builder.dropView(entity.tableName)
@@ -37,7 +36,8 @@ export class RemoveEntityModificationHandler implements ModificationHandler<Remo
37
36
  }
38
37
  if (this.options.formatVersion >= VERSION_REMOVE_REFERENCING_RELATIONS) {
39
38
  this.getFieldsToRemove(this.schema).forEach(([entityName, fieldName]) => {
40
- removeFieldModification.createHandler({ entityName, fieldName }, this.schema, this.options).createSql(builder)
39
+ const removeFieldHandler = removeFieldModification.createHandler({ entityName, fieldName }, this.schema, this.options)
40
+ removeFieldHandler.createSql(builder, options)
41
41
  })
42
42
  }
43
43
  builder.dropTable(entity.tableName)
@@ -5,6 +5,7 @@ import {
5
5
  createModificationType,
6
6
  Differ,
7
7
  ModificationHandler,
8
+ ModificationHandlerCreateSqlOptions,
8
9
  ModificationHandlerOptions,
9
10
  } from '../ModificationHandler'
10
11
  import {
@@ -23,14 +24,14 @@ export class ToggleEventLogModificationHandler implements ModificationHandler<To
23
24
  ) {
24
25
  }
25
26
 
26
- public createSql(builder: MigrationBuilder): void {
27
+ public createSql(builder: MigrationBuilder, { systemSchema }: ModificationHandlerCreateSqlOptions): void {
27
28
  const entity = this.schema.model.entities[this.data.entityName]
28
29
  if (entity.view) {
29
30
  return
30
31
  }
31
32
  if (this.data.enabled) {
32
- createEventTrigger(builder, this.options.systemSchema, entity.tableName, [entity.primaryColumn])
33
- createEventTrxTrigger(builder, this.options.systemSchema, entity.tableName)
33
+ createEventTrigger(builder, systemSchema, entity.tableName, [entity.primaryColumn])
34
+ createEventTrxTrigger(builder, systemSchema, entity.tableName)
34
35
  } else {
35
36
  dropEventTrigger(builder, entity.tableName)
36
37
  dropEventTrxTrigger(builder, entity.tableName)
@@ -5,32 +5,29 @@ import {
5
5
  updateAcl,
6
6
  updateAclEntities,
7
7
  updateAclEveryRole,
8
- updateEntity,
9
8
  updateEveryEntity,
10
9
  updateEveryField,
11
10
  updateModel,
12
11
  updateSchema,
13
12
  } from '../utils/schemaUpdateUtils'
14
- import { createModificationType, ModificationHandler, ModificationHandlerOptions } from '../ModificationHandler'
15
- import { isIt } from '../../utils/isIt'
16
13
  import {
17
- VERSION_ACL_PATCH,
18
- VERSION_UPDATE_CONSTRAINT_NAME,
19
- VERSION_UPDATE_CONSTRAINT_NAME_ONE_HAS_ONE,
20
- } from '../ModificationVersions'
21
- import { acceptEveryFieldVisitor, NamingHelper } from '@contember/schema-utils'
14
+ createModificationType,
15
+ ModificationHandler,
16
+ ModificationHandlerCreateSqlOptions,
17
+ ModificationHandlerOptions,
18
+ } from '../ModificationHandler'
19
+ import { isIt } from '../../utils/isIt'
20
+ import { VERSION_ACL_PATCH } from '../ModificationVersions'
22
21
  import { NoopModification } from '../NoopModification'
23
- import { renameConstraintSchemaUpdater, renameConstraintsSqlBuilder } from '../utils/renameConstraintsHelper'
24
22
  import { changeValue } from '../utils/valueUtils'
25
23
  import { updateEntityTableNameModification } from './UpdateEntityTableNameModification'
26
- import { SchemaWithMeta } from '../utils/schemaMeta'
27
24
 
28
25
  export class UpdateEntityNameModificationHandler implements ModificationHandler<UpdateEntityNameModificationData> {
29
26
  private subModification: ModificationHandler<any>
30
27
 
31
28
  constructor(
32
29
  private readonly data: UpdateEntityNameModificationData,
33
- private readonly schema: SchemaWithMeta,
30
+ private readonly schema: Schema,
34
31
  private readonly options: ModificationHandlerOptions,
35
32
  ) {
36
33
  this.subModification = data.tableName
@@ -42,29 +39,8 @@ export class UpdateEntityNameModificationHandler implements ModificationHandler<
42
39
  : new NoopModification()
43
40
  }
44
41
 
45
- public createSql(builder: MigrationBuilder): void {
46
- const entity = this.schema.model.entities[this.data.entityName]
47
- if (!entity.view && this.options.formatVersion >= VERSION_UPDATE_CONSTRAINT_NAME) {
48
- renameConstraintsSqlBuilder(builder, entity, this.getNewConstraintName.bind(this))
49
- }
50
-
51
- if (this.options.formatVersion >= VERSION_UPDATE_CONSTRAINT_NAME_ONE_HAS_ONE) {
52
- acceptEveryFieldVisitor(this.schema.model, this.data.entityName, {
53
- visitColumn: () => {},
54
- visitManyHasManyOwning: () => {},
55
- visitManyHasManyInverse: () => {},
56
- visitOneHasOneInverse: () => {},
57
- visitManyHasOne: () => {},
58
- visitOneHasMany: () => {},
59
- visitOneHasOneOwning: ({ relation }) => {
60
- const uniqueConstraintName = NamingHelper.createUniqueConstraintName(entity.name, [relation.name])
61
- const newUniqueConstraintName = NamingHelper.createUniqueConstraintName(this.data.newEntityName, [relation.name])
62
- builder.renameConstraint(entity.tableName, uniqueConstraintName, newUniqueConstraintName)
63
- },
64
- })
65
- }
66
-
67
- this.subModification.createSql(builder)
42
+ public createSql(builder: MigrationBuilder, options: ModificationHandlerCreateSqlOptions): void {
43
+ this.subModification.createSql(builder, options)
68
44
  }
69
45
 
70
46
  public getSchemaUpdater(): SchemaUpdater {
@@ -79,9 +55,6 @@ export class UpdateEntityNameModificationHandler implements ModificationHandler<
79
55
  return field
80
56
  }),
81
57
  ),
82
- this.options.formatVersion >= VERSION_UPDATE_CONSTRAINT_NAME
83
- ? updateEntity(this.data.entityName, renameConstraintSchemaUpdater(this.getNewConstraintName.bind(this)))
84
- : undefined,
85
58
  ({ model }) => {
86
59
  const { [this.data.entityName]: renamed, ...entities } = model.entities
87
60
  const newEntities = {
@@ -133,15 +106,6 @@ export class UpdateEntityNameModificationHandler implements ModificationHandler<
133
106
  )
134
107
  }
135
108
 
136
- private getNewConstraintName(constraint: Model.UniqueConstraint): string | null {
137
- const generatedName = NamingHelper.createUniqueConstraintName(this.data.entityName, constraint.fields)
138
- const isGenerated = constraint.name === generatedName
139
- if (!isGenerated) {
140
- null
141
- }
142
- return NamingHelper.createUniqueConstraintName(this.data.newEntityName, constraint.fields)
143
- }
144
-
145
109
  describe() {
146
110
  return { message: `Change entity name from ${this.data.entityName} to ${this.data.newEntityName}` }
147
111
  }
@@ -1,4 +1,4 @@
1
- import { acceptFieldVisitor, isInverseRelation, isRelation, NamingHelper } from '@contember/schema-utils'
1
+ import { acceptFieldVisitor, isInverseRelation, isRelation } from '@contember/schema-utils'
2
2
  import { MigrationBuilder } from '@contember/database-migrations'
3
3
  import { Schema } from '@contember/schema'
4
4
  import { removeField, SchemaUpdater } from '../utils/schemaUpdateUtils'
@@ -13,25 +13,28 @@ import {
13
13
  updateModel,
14
14
  updateSchema,
15
15
  } from '../utils/schemaUpdateUtils'
16
- import { createModificationType, ModificationHandler, ModificationHandlerOptions } from '../ModificationHandler'
17
- import { acceptFieldVisitor, NamingHelper, PredicateDefinitionProcessor } from '@contember/schema-utils'
16
+ import {
17
+ createModificationType,
18
+ ModificationHandler,
19
+ ModificationHandlerCreateSqlOptions,
20
+ ModificationHandlerOptions,
21
+ } from '../ModificationHandler'
22
+ import { acceptFieldVisitor, PredicateDefinitionProcessor } from '@contember/schema-utils'
18
23
  import {
19
24
  VERSION_ACL_PATCH,
20
- VERSION_UPDATE_CONSTRAINT_NAME,
21
- VERSION_UPDATE_CONSTRAINT_NAME_ONE_HAS_ONE,
25
+ VERSION_UPDATE_CONSTRAINT_FIELDS,
26
+ VERSION_UPDATE_INDEX_FIELDS,
22
27
  } from '../ModificationVersions'
23
- import { renameConstraintSchemaUpdater, renameConstraintsSqlBuilder } from '../utils/renameConstraintsHelper'
24
28
  import { changeValue } from '../utils/valueUtils'
25
29
  import { updateColumnNameModification } from '../columns'
26
30
  import { NoopModification } from '../NoopModification'
27
- import { SchemaWithMeta } from '../utils/schemaMeta'
28
31
 
29
32
  export class UpdateFieldNameModificationHandler implements ModificationHandler<UpdateFieldNameModificationData> {
30
33
  private renameColumnSubModification: ModificationHandler<any> = new NoopModification()
31
34
 
32
35
  constructor(
33
36
  private readonly data: UpdateFieldNameModificationData,
34
- private readonly schema: SchemaWithMeta,
37
+ private readonly schema: Schema,
35
38
  private readonly options: ModificationHandlerOptions,
36
39
  ) {
37
40
  if (this.data.columnName) {
@@ -43,57 +46,39 @@ export class UpdateFieldNameModificationHandler implements ModificationHandler<U
43
46
  }
44
47
  }
45
48
 
46
- public createSql(builder: MigrationBuilder): void {
49
+ public createSql(builder: MigrationBuilder, options: ModificationHandlerCreateSqlOptions): void {
47
50
  const entity = this.schema.model.entities[this.data.entityName]
48
51
  if (entity.view) {
49
52
  return
50
53
  }
51
- if (this.options.formatVersion >= VERSION_UPDATE_CONSTRAINT_NAME) {
52
- renameConstraintsSqlBuilder(builder, entity, this.getNewConstraintName.bind(this))
53
- }
54
-
55
- if (this.options.formatVersion >= VERSION_UPDATE_CONSTRAINT_NAME_ONE_HAS_ONE) {
56
- acceptFieldVisitor(this.schema.model, this.data.entityName, this.data.fieldName, {
57
- visitColumn: () => {},
58
- visitManyHasManyOwning: () => {},
59
- visitManyHasManyInverse: () => {},
60
- visitOneHasOneInverse: () => {},
61
- visitManyHasOne: () => {},
62
- visitOneHasMany: () => {},
63
- visitOneHasOneOwning: ({ relation }) => {
64
- const uniqueConstraintName = NamingHelper.createUniqueConstraintName(entity.name, [relation.name])
65
- const newUniqueConstraintName = NamingHelper.createUniqueConstraintName(entity.name, [this.data.newFieldName])
66
- builder.renameConstraint(entity.tableName, uniqueConstraintName, newUniqueConstraintName)
67
- },
68
- })
69
- }
70
-
71
- this.renameColumnSubModification.createSql(builder)
54
+ this.renameColumnSubModification.createSql(builder, options)
72
55
  }
73
56
 
74
57
  public getSchemaUpdater(): SchemaUpdater {
75
- const updateConstraintName =
76
- this.options.formatVersion >= VERSION_UPDATE_CONSTRAINT_NAME
77
- ? updateEntity(this.data.entityName, renameConstraintSchemaUpdater(this.getNewConstraintName.bind(this)))
78
- : undefined
79
58
  const updateConstraintFields =
80
- this.options.formatVersion >= VERSION_UPDATE_CONSTRAINT_NAME
59
+ this.options.formatVersion >= VERSION_UPDATE_CONSTRAINT_FIELDS
81
60
  ? updateEntity(this.data.entityName, ({ entity }) => {
82
61
  return {
83
62
  ...entity,
84
- unique: Object.fromEntries(
85
- Object.entries(entity.unique).map(([name, unique]) => [
86
- name,
87
- {
88
- ...unique,
89
- fields: unique.fields.map(changeValue(this.data.fieldName, this.data.newFieldName)),
90
- },
91
- ]),
92
- ),
63
+ unique: entity.unique.map(unique => ({
64
+ ...unique,
65
+ fields: unique.fields.map(changeValue(this.data.fieldName, this.data.newFieldName)),
66
+ })),
93
67
  }
94
68
  })
95
69
  : undefined
96
-
70
+ const updateIndexFields =
71
+ this.options.formatVersion >= VERSION_UPDATE_INDEX_FIELDS
72
+ ? updateEntity(this.data.entityName, ({ entity }) => {
73
+ return {
74
+ ...entity,
75
+ indexes: entity.indexes.map(unique => ({
76
+ ...unique,
77
+ fields: unique.fields.map(changeValue(this.data.fieldName, this.data.newFieldName)),
78
+ })),
79
+ }
80
+ })
81
+ : undefined
97
82
  const updateRelationReferences = updateEveryEntity(
98
83
  updateEveryField(({ field, entity }) => {
99
84
  const isUpdatedRelation = (entity: Model.Entity, relation: Model.AnyRelation | null) => {
@@ -189,26 +174,14 @@ export class UpdateFieldNameModificationHandler implements ModificationHandler<U
189
174
  updateAclOp,
190
175
  this.renameColumnSubModification.getSchemaUpdater(),
191
176
  updateModel(
192
- updateConstraintName,
193
177
  updateConstraintFields,
178
+ updateIndexFields,
194
179
  updateRelationReferences,
195
180
  updateFieldName,
196
181
  ),
197
182
  )
198
183
  }
199
184
 
200
-
201
- private getNewConstraintName(constraint: Model.UniqueConstraint): string | null {
202
- const generatedName = NamingHelper.createUniqueConstraintName(this.data.entityName, constraint.fields)
203
- const isGenerated = constraint.name === generatedName
204
- if (!isGenerated) {
205
- null
206
- }
207
- const newFieldNames = constraint.fields.map(changeValue(this.data.fieldName, this.data.newFieldName))
208
- const newName = NamingHelper.createUniqueConstraintName(this.data.entityName, newFieldNames)
209
- return newName === constraint.name ? null : newName
210
- }
211
-
212
185
  describe() {
213
186
  return { message: `Change field name ${this.data.entityName}.${this.data.fieldName} to ${this.data.newFieldName}` }
214
187
  }
@@ -1,56 +1,47 @@
1
1
  import { MigrationBuilder } from '@contember/database-migrations'
2
2
  import { Model, Schema } from '@contember/schema'
3
3
  import { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'
4
- import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
5
- import { acceptFieldVisitor } from '@contember/schema-utils'
4
+ import {
5
+ createModificationType,
6
+ Differ,
7
+ ModificationHandler,
8
+ ModificationHandlerCreateSqlOptions,
9
+ } from '../ModificationHandler'
10
+ import { wrapIdentifier } from '../../utils/dbHelpers'
11
+ import { getIndexColumns } from './utils'
12
+ import deepEqual from 'fast-deep-equal'
6
13
 
7
14
  export class CreateIndexModificationHandler implements ModificationHandler<CreateIndexModificationData> {
8
15
  constructor(private readonly data: CreateIndexModificationData, private readonly schema: Schema) {}
9
16
 
10
- public createSql(builder: MigrationBuilder): void {
17
+ public createSql(builder: MigrationBuilder, { databaseMetadata, invalidateDatabaseMetadata }: ModificationHandlerCreateSqlOptions): void {
11
18
  const entity = this.schema.model.entities[this.data.entityName]
12
19
  if (entity.view) {
13
20
  return
14
21
  }
15
22
  const fields = this.data.index.fields
16
- const columns = fields.map(fieldName => {
17
- return acceptFieldVisitor(this.schema.model, entity, fieldName, {
18
- visitColumn: ({ column }) => {
19
- return column.columnName
20
- },
21
- visitManyHasOne: ({ relation }) => {
22
- return relation.joiningColumn.columnName
23
- },
24
- visitOneHasOneOwning: ({ relation }) => {
25
- return relation.joiningColumn.columnName
26
- },
27
- visitOneHasMany: () => {
28
- throw new Error(`Cannot create index on 1:m relation in ${entity.name}.${fieldName}`)
29
- },
30
- visitOneHasOneInverse: () => {
31
- throw new Error(`Cannot create index on 1:1 inverse relation in ${entity.name}.${fieldName}`)
32
- },
33
- visitManyHasManyOwning: () => {
34
- throw new Error(`Cannot create index on m:m relation in ${entity.name}.${fieldName}`)
35
- },
36
- visitManyHasManyInverse: () => {
37
- throw new Error(`Cannot create index on m:m inverse relation in ${entity.name}.${fieldName}`)
38
- },
39
- })
40
- })
41
- builder.addIndex(entity.tableName, [...columns], {
42
- name: this.data.index.name,
23
+ const columns = getIndexColumns({
24
+ fields,
25
+ entity,
26
+ model: this.schema.model,
43
27
  })
28
+
29
+ const tableNameId = wrapIdentifier(entity.tableName)
30
+ const columnNameIds = columns.map(wrapIdentifier)
31
+
32
+ builder.sql(`CREATE INDEX ON ${tableNameId} (${columnNameIds.join(', ')})`)
33
+
34
+ invalidateDatabaseMetadata()
44
35
  }
45
36
 
46
37
  public getSchemaUpdater(): SchemaUpdater {
47
38
  return updateModel(
48
39
  updateEntity(this.data.entityName, ({ entity }) => ({
49
40
  ...entity,
50
- indexes: {
41
+ indexes: [
51
42
  ...entity.indexes,
52
- [this.data.index.name]: this.data.index,
53
- },
43
+ this.data.index,
44
+ ],
54
45
  })),
55
46
  )
56
47
  }
@@ -67,17 +58,20 @@ export const createIndexModification = createModificationType({
67
58
  handler: CreateIndexModificationHandler,
68
59
  })
69
60
 
61
+ export interface CreateIndexModificationData {
62
+ entityName: string
63
+ index: Model.Index
64
+ }
65
+
70
66
  export class CreateIndexDiffer implements Differ {
71
67
  createDiff(originalSchema: Schema, updatedSchema: Schema) {
72
68
  return Object.values(updatedSchema.model.entities).flatMap(entity =>
73
- Object.values(entity.indexes)
74
- .filter(it => !originalSchema.model.entities[entity.name].indexes[it.name])
75
- .map(index => createIndexModification.createModification({ entityName: entity.name, index })),
69
+ entity.indexes
70
+ .filter(it => !originalSchema.model.entities[entity.name].indexes.find(idx => deepEqual(idx.fields, it.fields)))
71
+ .map(index => createIndexModification.createModification({
72
+ entityName: entity.name,
73
+ index,
74
+ })),
76
75
  )
77
76
  }
78
77
  }
79
-
80
- export interface CreateIndexModificationData {
81
- entityName: string
82
- index: Model.Index
83
- }