@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.
- package/dist/src/MigrationDescriber.d.ts +4 -4
- package/dist/src/MigrationDescriber.d.ts.map +1 -1
- package/dist/src/MigrationDescriber.js +8 -7
- package/dist/src/MigrationDescriber.js.map +1 -1
- package/dist/src/SchemaDiffer.d.ts +1 -1
- package/dist/src/SchemaDiffer.d.ts.map +1 -1
- package/dist/src/SchemaDiffer.js +10 -2
- package/dist/src/SchemaDiffer.js.map +1 -1
- package/dist/src/SchemaMigrator.d.ts +1 -2
- package/dist/src/SchemaMigrator.d.ts.map +1 -1
- package/dist/src/SchemaMigrator.js +0 -1
- package/dist/src/SchemaMigrator.js.map +1 -1
- package/dist/src/modifications/ModificationHandler.d.ts +10 -6
- package/dist/src/modifications/ModificationHandler.d.ts.map +1 -1
- package/dist/src/modifications/ModificationHandler.js.map +1 -1
- package/dist/src/modifications/ModificationHandlerFactory.d.ts +2 -2
- package/dist/src/modifications/ModificationHandlerFactory.d.ts.map +1 -1
- package/dist/src/modifications/ModificationHandlerFactory.js +3 -2
- package/dist/src/modifications/ModificationHandlerFactory.js.map +1 -1
- package/dist/src/modifications/ModificationVersions.d.ts +4 -3
- package/dist/src/modifications/ModificationVersions.d.ts.map +1 -1
- package/dist/src/modifications/ModificationVersions.js +5 -4
- package/dist/src/modifications/ModificationVersions.js.map +1 -1
- package/dist/src/modifications/columns/CreateColumnModification.d.ts +2 -2
- package/dist/src/modifications/columns/CreateColumnModification.d.ts.map +1 -1
- package/dist/src/modifications/columns/CreateColumnModification.js +14 -24
- package/dist/src/modifications/columns/CreateColumnModification.js.map +1 -1
- package/dist/src/modifications/columns/UpdateColumnDefinitionModification.d.ts +5 -3
- package/dist/src/modifications/columns/UpdateColumnDefinitionModification.d.ts.map +1 -1
- package/dist/src/modifications/columns/UpdateColumnDefinitionModification.js +19 -4
- package/dist/src/modifications/columns/UpdateColumnDefinitionModification.js.map +1 -1
- package/dist/src/modifications/columns/columnUtils.d.ts +14 -0
- package/dist/src/modifications/columns/columnUtils.d.ts.map +1 -0
- package/dist/src/modifications/columns/columnUtils.js +29 -0
- package/dist/src/modifications/columns/columnUtils.js.map +1 -0
- package/dist/src/modifications/constraints/CreateUniqueConstraintModification.d.ts +3 -3
- package/dist/src/modifications/constraints/CreateUniqueConstraintModification.d.ts.map +1 -1
- package/dist/src/modifications/constraints/CreateUniqueConstraintModification.js +20 -32
- package/dist/src/modifications/constraints/CreateUniqueConstraintModification.js.map +1 -1
- package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.d.ts +11 -5
- package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.d.ts.map +1 -1
- package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.js +37 -9
- package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.js.map +1 -1
- package/dist/src/modifications/constraints/utils.d.ts +7 -0
- package/dist/src/modifications/constraints/utils.d.ts.map +1 -0
- package/dist/src/modifications/constraints/utils.js +33 -0
- package/dist/src/modifications/constraints/utils.js.map +1 -0
- package/dist/src/modifications/entities/CreateEntityModification.d.ts +4 -4
- package/dist/src/modifications/entities/CreateEntityModification.d.ts.map +1 -1
- package/dist/src/modifications/entities/CreateEntityModification.js +18 -14
- package/dist/src/modifications/entities/CreateEntityModification.js.map +1 -1
- package/dist/src/modifications/entities/CreateViewModification.d.ts +2 -2
- package/dist/src/modifications/entities/CreateViewModification.d.ts.map +1 -1
- package/dist/src/modifications/entities/CreateViewModification.js +14 -10
- package/dist/src/modifications/entities/CreateViewModification.js.map +1 -1
- package/dist/src/modifications/entities/RemoveEntityModification.d.ts +3 -4
- package/dist/src/modifications/entities/RemoveEntityModification.d.ts.map +1 -1
- package/dist/src/modifications/entities/RemoveEntityModification.js +3 -2
- package/dist/src/modifications/entities/RemoveEntityModification.js.map +1 -1
- package/dist/src/modifications/entities/ToggleEventLogModification.d.ts +2 -2
- package/dist/src/modifications/entities/ToggleEventLogModification.d.ts.map +1 -1
- package/dist/src/modifications/entities/ToggleEventLogModification.js +3 -3
- package/dist/src/modifications/entities/ToggleEventLogModification.js.map +1 -1
- package/dist/src/modifications/entities/UpdateEntityNameModification.d.ts +4 -5
- package/dist/src/modifications/entities/UpdateEntityNameModification.d.ts.map +1 -1
- package/dist/src/modifications/entities/UpdateEntityNameModification.js +3 -34
- package/dist/src/modifications/entities/UpdateEntityNameModification.js.map +1 -1
- package/dist/src/modifications/fields/RemoveFieldModification.js.map +1 -1
- package/dist/src/modifications/fields/UpdateFieldNameModification.d.ts +4 -5
- package/dist/src/modifications/fields/UpdateFieldNameModification.d.ts.map +1 -1
- package/dist/src/modifications/fields/UpdateFieldNameModification.js +18 -42
- package/dist/src/modifications/fields/UpdateFieldNameModification.js.map +1 -1
- package/dist/src/modifications/indexes/CreateIndexModification.d.ts +5 -5
- package/dist/src/modifications/indexes/CreateIndexModification.d.ts.map +1 -1
- package/dist/src/modifications/indexes/CreateIndexModification.js +24 -35
- package/dist/src/modifications/indexes/CreateIndexModification.js.map +1 -1
- package/dist/src/modifications/indexes/RemoveIndexModification.d.ts +12 -6
- package/dist/src/modifications/indexes/RemoveIndexModification.d.ts.map +1 -1
- package/dist/src/modifications/indexes/RemoveIndexModification.js +36 -10
- package/dist/src/modifications/indexes/RemoveIndexModification.js.map +1 -1
- package/dist/src/modifications/indexes/utils.d.ts +7 -0
- package/dist/src/modifications/indexes/utils.d.ts.map +1 -0
- package/dist/src/modifications/indexes/utils.js +33 -0
- package/dist/src/modifications/indexes/utils.js.map +1 -0
- package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts +3 -4
- package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts.map +1 -1
- package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js +10 -10
- package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js.map +1 -1
- package/dist/src/modifications/relations/ConvertOneToManyRelationModification.d.ts +3 -4
- package/dist/src/modifications/relations/ConvertOneToManyRelationModification.d.ts.map +1 -1
- package/dist/src/modifications/relations/ConvertOneToManyRelationModification.js +14 -12
- package/dist/src/modifications/relations/ConvertOneToManyRelationModification.js.map +1 -1
- package/dist/src/modifications/relations/CreateRelationModification.d.ts +4 -5
- package/dist/src/modifications/relations/CreateRelationModification.d.ts.map +1 -1
- package/dist/src/modifications/relations/CreateRelationModification.js +13 -17
- package/dist/src/modifications/relations/CreateRelationModification.js.map +1 -1
- package/dist/src/modifications/relations/ToggleJunctionEventLogModification.d.ts +3 -4
- package/dist/src/modifications/relations/ToggleJunctionEventLogModification.d.ts.map +1 -1
- package/dist/src/modifications/relations/ToggleJunctionEventLogModification.js +4 -5
- package/dist/src/modifications/relations/ToggleJunctionEventLogModification.js.map +1 -1
- package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.d.ts +2 -2
- package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.d.ts.map +1 -1
- package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.js +3 -3
- package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.js.map +1 -1
- package/dist/src/modifications/relations/helpers.d.ts +4 -1
- package/dist/src/modifications/relations/helpers.d.ts.map +1 -1
- package/dist/src/modifications/relations/helpers.js +20 -17
- package/dist/src/modifications/relations/helpers.js.map +1 -1
- package/dist/src/modifications/relations/normalization.d.ts +2 -2
- package/dist/src/modifications/relations/normalization.d.ts.map +1 -1
- package/dist/src/modifications/settings/UpdateSettingsModification.d.ts +1 -1
- package/dist/src/modifications/settings/UpdateSettingsModification.d.ts.map +1 -1
- package/dist/src/modifications/upgrade/RemoveIndexNamesModification.d.ts +19 -0
- package/dist/src/modifications/upgrade/RemoveIndexNamesModification.d.ts.map +1 -0
- package/dist/src/modifications/upgrade/RemoveIndexNamesModification.js +40 -0
- package/dist/src/modifications/upgrade/RemoveIndexNamesModification.js.map +1 -0
- package/dist/src/modifications/utils/createJunctionTable.d.ts +2 -3
- package/dist/src/modifications/utils/createJunctionTable.d.ts.map +1 -1
- package/dist/src/modifications/utils/createJunctionTable.js +4 -6
- package/dist/src/modifications/utils/createJunctionTable.js.map +1 -1
- package/dist/src/modifications/utils/schemaUpdateUtils.d.ts +12 -14
- package/dist/src/modifications/utils/schemaUpdateUtils.d.ts.map +1 -1
- package/dist/src/modifications/utils/schemaUpdateUtils.js +5 -20
- package/dist/src/modifications/utils/schemaUpdateUtils.js.map +1 -1
- package/dist/src/modifications/utils/stringArrayEquals.d.ts +2 -0
- package/dist/src/modifications/utils/stringArrayEquals.d.ts.map +1 -0
- package/dist/src/modifications/utils/stringArrayEquals.js +9 -0
- package/dist/src/modifications/utils/stringArrayEquals.js.map +1 -0
- package/dist/src/modifications/utils/viewDependencies.d.ts +1 -1
- package/dist/src/modifications/utils/viewDependencies.d.ts.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/utils/PartialEntity.d.ts +5 -3
- package/dist/src/utils/PartialEntity.d.ts.map +1 -1
- package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.js +1 -1
- package/dist/tests/cases/integration/convertOneToManyRelation.test.js +5 -5
- package/dist/tests/cases/integration/convertOneToManyRelation.test.js.map +1 -1
- package/dist/tests/cases/integration/createAndDropIndex.test.js +4 -4
- package/dist/tests/cases/integration/createAndDropIndex.test.js.map +1 -1
- package/dist/tests/cases/integration/createColumn.test.js +0 -2
- package/dist/tests/cases/integration/createColumn.test.js.map +1 -1
- package/dist/tests/cases/integration/createEntity.test.js +6 -9
- package/dist/tests/cases/integration/createEntity.test.js.map +1 -1
- package/dist/tests/cases/integration/createManyHasMany.test.js +3 -3
- package/dist/tests/cases/integration/createManyHasOne.test.js +4 -4
- package/dist/tests/cases/integration/createManyHasOne.test.js.map +1 -1
- package/dist/tests/cases/integration/createOneHasMany.test.js +6 -9
- package/dist/tests/cases/integration/createOneHasMany.test.js.map +1 -1
- package/dist/tests/cases/integration/createOneHasOne.test.js +6 -6
- package/dist/tests/cases/integration/createRelationInverseSide.test.js +1 -1
- package/dist/tests/cases/integration/createRelationInverseSide.test.js.map +1 -1
- package/dist/tests/cases/integration/createView.test.js +6 -6
- package/dist/tests/cases/integration/removeField.test.js +6 -6
- package/dist/tests/cases/integration/removeField.test.js.map +1 -1
- package/dist/tests/cases/integration/updateColumnDefinition.test.js +42 -4
- package/dist/tests/cases/integration/updateColumnDefinition.test.js.map +1 -1
- package/dist/tests/cases/integration/updateEntityName.test.js +1 -20
- package/dist/tests/cases/integration/updateEntityName.test.js.map +1 -1
- package/dist/tests/cases/integration/updateFieldName.test.js +1 -21
- package/dist/tests/cases/integration/updateFieldName.test.js.map +1 -1
- package/dist/tests/cases/integration/updateRelationOnDelete.test.js +2 -2
- package/dist/tests/cases/integration/updateRelationOnDelete.test.js.map +1 -1
- package/dist/tests/cases/integration/updateView.test.js +18 -18
- package/dist/tests/scripts/checkCreateConsistentMigrations.js +1 -1
- package/dist/tests/scripts/checkCreateConsistentMigrations.js.map +1 -1
- package/dist/tests/src/tests.d.ts.map +1 -1
- package/dist/tests/src/tests.js +10 -4
- package/dist/tests/src/tests.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -9
- package/src/MigrationDescriber.ts +11 -9
- package/src/SchemaDiffer.ts +12 -13
- package/src/SchemaMigrator.ts +1 -3
- package/src/modifications/ModificationHandler.ts +10 -5
- package/src/modifications/ModificationHandlerFactory.ts +12 -11
- package/src/modifications/ModificationVersions.ts +4 -3
- package/src/modifications/columns/CreateColumnModification.ts +19 -27
- package/src/modifications/columns/UpdateColumnDefinitionModification.ts +22 -4
- package/src/modifications/columns/columnUtils.ts +35 -0
- package/src/modifications/constraints/CreateUniqueConstraintModification.ts +31 -40
- package/src/modifications/constraints/RemoveUniqueConstraintModification.ts +60 -15
- package/src/modifications/constraints/utils.ts +36 -0
- package/src/modifications/entities/CreateEntityModification.ts +9 -8
- package/src/modifications/entities/CreateViewModification.ts +4 -3
- package/src/modifications/entities/RemoveEntityModification.ts +5 -5
- package/src/modifications/entities/ToggleEventLogModification.ts +4 -3
- package/src/modifications/entities/UpdateEntityNameModification.ts +10 -46
- package/src/modifications/fields/RemoveFieldModification.ts +1 -1
- package/src/modifications/fields/UpdateFieldNameModification.ts +30 -57
- package/src/modifications/indexes/CreateIndexModification.ts +35 -41
- package/src/modifications/indexes/RemoveIndexModification.ts +57 -17
- package/src/modifications/indexes/utils.ts +30 -0
- package/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.ts +7 -19
- package/src/modifications/relations/ConvertOneToManyRelationModification.ts +21 -22
- package/src/modifications/relations/CreateRelationModification.ts +20 -35
- package/src/modifications/relations/ToggleJunctionEventLogModification.ts +4 -5
- package/src/modifications/relations/UpdateRelationOnDeleteModification.ts +13 -5
- package/src/modifications/relations/helpers.ts +27 -22
- package/src/modifications/upgrade/RemoveIndexNamesModification.ts +46 -0
- package/src/modifications/utils/createJunctionTable.ts +8 -8
- package/src/modifications/utils/schemaUpdateUtils.ts +5 -17
- package/src/modifications/utils/stringArrayEquals.ts +4 -0
- package/src/tsconfig.json +0 -1
- package/src/utils/PartialEntity.ts +7 -1
- package/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.ts +1 -1
- package/tests/cases/integration/convertOneToManyRelation.test.ts +5 -5
- package/tests/cases/integration/createAndDropIndex.test.ts +4 -4
- package/tests/cases/integration/createColumn.test.ts +0 -2
- package/tests/cases/integration/createEntity.test.ts +6 -9
- package/tests/cases/integration/createManyHasMany.test.ts +3 -3
- package/tests/cases/integration/createManyHasOne.test.ts +4 -4
- package/tests/cases/integration/createOneHasMany.test.ts +6 -9
- package/tests/cases/integration/createOneHasOne.test.ts +6 -6
- package/tests/cases/integration/createRelationInverseSide.test.ts +1 -1
- package/tests/cases/integration/createView.test.ts +6 -6
- package/tests/cases/integration/removeField.test.ts +6 -6
- package/tests/cases/integration/updateColumnDefinition.test.ts +36 -4
- package/tests/cases/integration/updateEntityName.test.ts +1 -20
- package/tests/cases/integration/updateFieldName.test.ts +1 -21
- package/tests/cases/integration/updateRelationOnDelete.test.ts +2 -2
- package/tests/cases/integration/updateView.test.ts +18 -18
- package/tests/scripts/checkCreateConsistentMigrations.ts +1 -1
- package/tests/src/tests.ts +13 -8
- package/dist/src/modifications/utils/renameConstraintsHelper.d.ts +0 -8
- package/dist/src/modifications/utils/renameConstraintsHelper.d.ts.map +0 -1
- package/dist/src/modifications/utils/renameConstraintsHelper.js +0 -31
- package/dist/src/modifications/utils/renameConstraintsHelper.js.map +0 -1
- package/dist/src/modifications/utils/schemaMeta.d.ts +0 -8
- package/dist/src/modifications/utils/schemaMeta.d.ts.map +0 -1
- package/dist/src/modifications/utils/schemaMeta.js +0 -13
- package/dist/src/modifications/utils/schemaMeta.js.map +0 -1
- package/dist/tests/cases/integration/takenIndexName.test.d.ts +0 -2
- package/dist/tests/cases/integration/takenIndexName.test.d.ts.map +0 -1
- package/dist/tests/cases/integration/takenIndexName.test.js +0 -307
- package/dist/tests/cases/integration/takenIndexName.test.js.map +0 -1
- package/src/modifications/utils/renameConstraintsHelper.ts +0 -34
- package/src/modifications/utils/schemaMeta.ts +0 -18
- package/tests/cases/integration/takenIndexName.test.ts +0 -314
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contember/schema-migrations",
|
|
3
|
-
"version": "1.3.0-
|
|
3
|
+
"version": "1.3.0-beta.1",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"typings": "dist/src/index.d.ts",
|
|
@@ -9,21 +9,20 @@
|
|
|
9
9
|
"default": "./dist/src/index.js"
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
|
-
"test": "vitest"
|
|
12
|
+
"test": "vitest --dir ./tests/cases"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@contember/database": "
|
|
16
|
-
"@contember/
|
|
17
|
-
"@contember/
|
|
18
|
-
"@contember/schema": "
|
|
19
|
-
"@contember/schema-utils": "^1.3.0-alpha.7",
|
|
15
|
+
"@contember/database-migrations": "1.3.0-beta.1",
|
|
16
|
+
"@contember/engine-common": "1.3.0-beta.1",
|
|
17
|
+
"@contember/schema": "1.3.0-beta.1",
|
|
18
|
+
"@contember/schema-utils": "1.3.0-beta.1",
|
|
20
19
|
"fast-deep-equal": "^3.1.3",
|
|
21
20
|
"rfc6902": "^5.0.1"
|
|
22
21
|
},
|
|
23
22
|
"devDependencies": {
|
|
24
|
-
"@contember/schema-definition": "
|
|
23
|
+
"@contember/schema-definition": "1.3.0-beta.1"
|
|
25
24
|
},
|
|
26
25
|
"peerDependencies": {
|
|
27
26
|
"pg": "^8.9.0"
|
|
28
27
|
}
|
|
29
|
-
}
|
|
28
|
+
}
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
ModificationDescription,
|
|
5
5
|
ModificationDescriptionContext,
|
|
6
6
|
ModificationHandler,
|
|
7
|
+
ModificationHandlerCreateSqlOptions,
|
|
7
8
|
ModificationHandlerFactory,
|
|
8
9
|
ModificationHandlerOptions,
|
|
9
10
|
SchemaUpdateError,
|
|
@@ -14,23 +15,22 @@ import { Schema } from '@contember/schema'
|
|
|
14
15
|
|
|
15
16
|
export interface ModificationDescriptionResult {
|
|
16
17
|
modification: Migration.Modification
|
|
17
|
-
sql: string
|
|
18
18
|
schema: Schema
|
|
19
19
|
description: ModificationDescription
|
|
20
20
|
handler: ModificationHandler<any>
|
|
21
|
+
getSql: (options: ModificationHandlerCreateSqlOptions) => string
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
export class MigrationDescriber {
|
|
24
25
|
constructor(private readonly modificationHandlerFactory: ModificationHandlerFactory) {
|
|
25
26
|
}
|
|
26
27
|
|
|
27
|
-
public
|
|
28
|
+
public describeModification(
|
|
28
29
|
schema: Schema,
|
|
29
30
|
modification: Migration.Modification,
|
|
30
31
|
options: ModificationHandlerOptions,
|
|
31
32
|
modificationDescriptionContext: ModificationDescriptionContext = emptyModificationDescriptionContext,
|
|
32
|
-
):
|
|
33
|
-
const builder = createMigrationBuilder()
|
|
33
|
+
): ModificationDescriptionResult {
|
|
34
34
|
const modificationHandler = this.modificationHandlerFactory.create(
|
|
35
35
|
modification.modification,
|
|
36
36
|
modification,
|
|
@@ -45,29 +45,31 @@ export class MigrationDescriber {
|
|
|
45
45
|
}
|
|
46
46
|
throw new SchemaUpdateError(e.message + '\n for modification: \n' + JSON.stringify(modification))
|
|
47
47
|
}
|
|
48
|
-
await modificationHandler.createSql(builder)
|
|
49
48
|
return {
|
|
50
49
|
modification,
|
|
51
50
|
schema,
|
|
52
|
-
|
|
51
|
+
getSql: options => {
|
|
52
|
+
const builder = createMigrationBuilder()
|
|
53
|
+
modificationHandler.createSql(builder, options)
|
|
54
|
+
return builder.getSql()
|
|
55
|
+
},
|
|
53
56
|
description: modificationHandler.describe(modificationDescriptionContext),
|
|
54
57
|
handler: modificationHandler,
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
60
|
|
|
58
|
-
public
|
|
61
|
+
public describeModifications(schema: Schema, migration: Migration): ModificationDescriptionResult[] {
|
|
59
62
|
const result = []
|
|
60
63
|
const createdEntities = []
|
|
61
64
|
for (const modification of migration.modifications) {
|
|
62
65
|
if (modification.modification === createEntityModification.id) {
|
|
63
66
|
createdEntities.push(modification.entity.name)
|
|
64
67
|
}
|
|
65
|
-
const description =
|
|
68
|
+
const description = this.describeModification(
|
|
66
69
|
schema,
|
|
67
70
|
modification,
|
|
68
71
|
{
|
|
69
72
|
formatVersion: migration.formatVersion,
|
|
70
|
-
systemSchema,
|
|
71
73
|
},
|
|
72
74
|
{
|
|
73
75
|
createdEntities,
|
package/src/SchemaDiffer.ts
CHANGED
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
import { Schema } from '@contember/schema'
|
|
2
|
-
import {
|
|
3
|
-
deepCompare,
|
|
4
|
-
isInverseRelation,
|
|
5
|
-
isOwningRelation,
|
|
6
|
-
isRelation,
|
|
7
|
-
SchemaValidator,
|
|
8
|
-
ValidationError,
|
|
9
|
-
} from '@contember/schema-utils'
|
|
2
|
+
import { compareArraysIgnoreOrder, deepCompare, isInverseRelation, isOwningRelation, isRelation, SchemaValidator, ValidationError } from '@contember/schema-utils'
|
|
10
3
|
import { SchemaMigrator } from './SchemaMigrator'
|
|
11
4
|
import { Migration } from './Migration'
|
|
12
5
|
import { ImplementationException } from './exceptions'
|
|
@@ -34,22 +27,22 @@ import {
|
|
|
34
27
|
UpdateAclSchemaDiffer,
|
|
35
28
|
UpdateColumnDefinitionDiffer,
|
|
36
29
|
UpdateColumnNameDiffer,
|
|
30
|
+
UpdateEntityOrderByDiffer,
|
|
37
31
|
UpdateEntityTableNameDiffer,
|
|
38
32
|
UpdateEnumDiffer,
|
|
39
33
|
UpdateRelationOnDeleteDiffer,
|
|
40
34
|
UpdateRelationOrderByDiffer,
|
|
41
|
-
UpdateEntityOrderByDiffer,
|
|
42
35
|
UpdateValidationSchemaDiffer,
|
|
43
36
|
VERSION_LATEST,
|
|
44
37
|
} from './modifications'
|
|
45
38
|
import { ChangeViewNonViewDiffer, RemoveChangedFieldDiffer, RemoveChangedViewDiffer } from './modifications/differs'
|
|
46
39
|
import { CreateIndexDiffer, RemoveIndexDiffer } from './modifications/indexes'
|
|
47
|
-
import { SchemaWithMeta } from './modifications/utils/schemaMeta'
|
|
48
40
|
import { CreateTriggerDiffer, RemoveTriggerDiffer, UpdateTriggerDiffer } from './modifications/actions'
|
|
49
41
|
import { UpdateTargetDiffer } from './modifications/actions/UpdateTargetModification'
|
|
50
42
|
import { CreateTargetDiffer } from './modifications/actions/CreateTargetModification'
|
|
51
43
|
import { RemoveTargetDiffer } from './modifications/actions/RemoveTargetModification'
|
|
52
44
|
import { UpdateSettingsDiffer } from './modifications/settings'
|
|
45
|
+
import { RemoveIndexNamesDiffer } from './modifications/upgrade/RemoveIndexNamesModification'
|
|
53
46
|
|
|
54
47
|
type DiffOptions = { skipRecreateValidation?: boolean; skipInitialSchemaValidation?: boolean }
|
|
55
48
|
|
|
@@ -72,6 +65,7 @@ export class SchemaDiffer {
|
|
|
72
65
|
}
|
|
73
66
|
|
|
74
67
|
const differs: Differ[] = [
|
|
68
|
+
new RemoveIndexNamesDiffer(),
|
|
75
69
|
new UpdateSettingsDiffer(),
|
|
76
70
|
new ConvertOneToManyRelationDiffer(),
|
|
77
71
|
new ConvertOneHasManyToManyHasManyRelationDiffer(),
|
|
@@ -123,10 +117,15 @@ export class SchemaDiffer {
|
|
|
123
117
|
diffs.push(...differDiffs)
|
|
124
118
|
}
|
|
125
119
|
|
|
126
|
-
|
|
127
120
|
if (!skipRecreateValidation) {
|
|
128
|
-
const
|
|
129
|
-
|
|
121
|
+
const errors = deepCompare(updatedSchema, appliedDiffsSchema, [], path => {
|
|
122
|
+
if (path[0] === 'model' && path[1] === 'entities' && (path[3] === 'unique' || path[3] === 'index')) {
|
|
123
|
+
return (a, b) => {
|
|
124
|
+
return compareArraysIgnoreOrder(a, b, path)
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null
|
|
128
|
+
})
|
|
130
129
|
if (errors.length === 0) {
|
|
131
130
|
return diffs
|
|
132
131
|
}
|
package/src/SchemaMigrator.ts
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import { Schema } from '@contember/schema'
|
|
2
2
|
import { ModificationHandlerFactory } from './modifications'
|
|
3
3
|
import { Migration } from './Migration'
|
|
4
|
-
import { SchemaWithMeta } from './modifications/utils/schemaMeta'
|
|
5
4
|
|
|
6
5
|
export class SchemaMigrator {
|
|
7
6
|
constructor(private readonly modificationHandlerFactory: ModificationHandlerFactory) {}
|
|
8
7
|
|
|
9
|
-
public applyModifications(schema: Schema, diff: readonly Migration.Modification[], formatVersion: number):
|
|
8
|
+
public applyModifications(schema: Schema, diff: readonly Migration.Modification[], formatVersion: number): Schema {
|
|
10
9
|
for (const modification of diff) {
|
|
11
10
|
const { modification: name, ...data } = modification
|
|
12
11
|
const modificationHandler = this.modificationHandlerFactory.create(name, data, schema, {
|
|
13
12
|
formatVersion,
|
|
14
|
-
systemSchema: 'system', // not important here
|
|
15
13
|
})
|
|
16
14
|
schema = modificationHandler.getSchemaUpdater()({ schema })
|
|
17
15
|
}
|
|
@@ -2,7 +2,7 @@ import { MigrationBuilder } from '@contember/database-migrations'
|
|
|
2
2
|
import { SchemaUpdater } from './utils/schemaUpdateUtils'
|
|
3
3
|
import { Schema } from '@contember/schema'
|
|
4
4
|
import { Migration } from '../Migration'
|
|
5
|
-
import {
|
|
5
|
+
import { SchemaDatabaseMetadata } from '@contember/schema-utils'
|
|
6
6
|
|
|
7
7
|
export interface ModificationDescription {
|
|
8
8
|
message: string
|
|
@@ -14,20 +14,25 @@ export const emptyModificationDescriptionContext: ModificationDescriptionContext
|
|
|
14
14
|
export type ModificationDescriptionContext = { createdEntities: string[] }
|
|
15
15
|
|
|
16
16
|
export interface ModificationHandler<Data> {
|
|
17
|
-
createSql(builder: MigrationBuilder): void
|
|
17
|
+
createSql(builder: MigrationBuilder, options: ModificationHandlerCreateSqlOptions): void
|
|
18
18
|
|
|
19
19
|
getSchemaUpdater(): SchemaUpdater
|
|
20
20
|
|
|
21
21
|
describe(context: ModificationDescriptionContext): ModificationDescription
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
export interface ModificationHandlerCreateSqlOptions {
|
|
25
|
+
systemSchema: string
|
|
26
|
+
databaseMetadata: SchemaDatabaseMetadata
|
|
27
|
+
invalidateDatabaseMetadata: () => void
|
|
28
|
+
}
|
|
29
|
+
|
|
24
30
|
export interface ModificationHandlerOptions {
|
|
25
31
|
formatVersion: number
|
|
26
|
-
systemSchema: string
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
export interface ModificationHandlerConstructor<Data> {
|
|
30
|
-
new(data: Data, schema:
|
|
35
|
+
new(data: Data, schema: Schema, options: ModificationHandlerOptions): ModificationHandler<Data>
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
export interface Differ<Data = { [field: string]: any }> {
|
|
@@ -38,7 +43,7 @@ export interface Differ<Data = { [field: string]: any }> {
|
|
|
38
43
|
export interface ModificationType<Id extends String, Data> {
|
|
39
44
|
id: Id
|
|
40
45
|
createModification: (data: Data) => Migration.Modification<Data>
|
|
41
|
-
createHandler: (data: Data, schema:
|
|
46
|
+
createHandler: (data: Data, schema: Schema, options: ModificationHandlerOptions) => ModificationHandler<Data>
|
|
42
47
|
}
|
|
43
48
|
|
|
44
49
|
export const createModificationType = <Data, Id extends string>({ handler, id }: {
|
|
@@ -4,44 +4,44 @@ import { patchAclSchemaModification, updateAclSchemaModification } from './acl'
|
|
|
4
4
|
import { createColumnModification, updateColumnDefinitionModification, updateColumnNameModification } from './columns'
|
|
5
5
|
import { createUniqueConstraintModification, removeUniqueConstraintModification } from './constraints'
|
|
6
6
|
import {
|
|
7
|
-
createEntityModification,
|
|
8
|
-
|
|
7
|
+
createEntityModification,
|
|
8
|
+
createViewModification,
|
|
9
|
+
removeEntityModification,
|
|
10
|
+
toggleEventLogModification,
|
|
9
11
|
updateEntityNameModification,
|
|
10
12
|
updateEntityTableNameModification,
|
|
11
13
|
} from './entities'
|
|
12
14
|
import { updateViewModification } from './entities/UpdateViewModification'
|
|
13
|
-
import {
|
|
14
|
-
createEnumModification,
|
|
15
|
-
removeEnumModification,
|
|
16
|
-
updateEnumModification,
|
|
17
|
-
} from './enums'
|
|
15
|
+
import { createEnumModification, removeEnumModification, updateEnumModification } from './enums'
|
|
18
16
|
import { removeFieldModification, updateFieldNameModification } from './fields'
|
|
19
17
|
import {
|
|
20
18
|
convertOneHasManyToManyHasManyRelationModification,
|
|
21
19
|
convertOneToManyRelationModification,
|
|
22
20
|
createRelationInverseSideModification,
|
|
23
|
-
createRelationModification,
|
|
21
|
+
createRelationModification,
|
|
22
|
+
disableOrphanRemovalModification,
|
|
24
23
|
enableOrphanRemovalModification,
|
|
25
24
|
makeRelationNotNullModification,
|
|
26
|
-
makeRelationNullableModification,
|
|
25
|
+
makeRelationNullableModification,
|
|
26
|
+
toggleJunctionEventLogModification,
|
|
27
27
|
updateRelationOnDeleteModification,
|
|
28
28
|
updateRelationOrderByModification,
|
|
29
29
|
} from './relations'
|
|
30
30
|
import { patchValidationSchemaModification, updateValidationSchemaModification } from './validation'
|
|
31
31
|
import { createIndexModification, removeIndexModification } from './indexes'
|
|
32
|
-
import { SchemaWithMeta } from './utils/schemaMeta'
|
|
33
32
|
import { updateSettingsModification } from './settings'
|
|
34
33
|
import { createTriggerModification, removeTriggerModification, updateTriggerModification } from './actions'
|
|
35
34
|
import { createTargetModification } from './actions/CreateTargetModification'
|
|
36
35
|
import { removeTargetModification } from './actions/RemoveTargetModification'
|
|
37
36
|
import { updateTargetModification } from './actions/UpdateTargetModification'
|
|
38
37
|
import { updateEntityOrderByModification } from './entities/UpdateEntityOrderByModification'
|
|
38
|
+
import { removeIndexNamesModification } from './upgrade/RemoveIndexNamesModification'
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
class ModificationHandlerFactory {
|
|
42
42
|
constructor(private readonly map: Record<string, ModificationType<string, any>>) {}
|
|
43
43
|
|
|
44
|
-
public create<D>(name: string, data: D, schema:
|
|
44
|
+
public create<D>(name: string, data: D, schema: Schema, options: ModificationHandlerOptions): ModificationHandler<D> {
|
|
45
45
|
if (!this.map[name]) {
|
|
46
46
|
throw new Error(`Undefined modification handler for ${name}`)
|
|
47
47
|
}
|
|
@@ -53,6 +53,7 @@ namespace ModificationHandlerFactory {
|
|
|
53
53
|
type HandlerMap<D> = { [modificationName: string]: ModificationType<string, D> }
|
|
54
54
|
|
|
55
55
|
const handlers = [
|
|
56
|
+
removeIndexNamesModification,
|
|
56
57
|
updateSettingsModification,
|
|
57
58
|
updateAclSchemaModification,
|
|
58
59
|
patchAclSchemaModification,
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
export const VERSION_INITIAL = 1
|
|
2
|
-
export const VERSION_LATEST =
|
|
2
|
+
export const VERSION_LATEST = 5
|
|
3
3
|
|
|
4
4
|
export const VERSION_ACL_PATCH = 2
|
|
5
|
-
export const
|
|
5
|
+
export const VERSION_UPDATE_CONSTRAINT_FIELDS = 2
|
|
6
6
|
export const VERSION_REMOVE_RELATION_INVERSE_SIDE = 3
|
|
7
7
|
export const VERSION_REMOVE_REFERENCING_RELATIONS = 3
|
|
8
|
-
export const
|
|
8
|
+
export const _REMOVED_VERSION_UPDATE_CONSTRAINT_NAME_ONE_HAS_ONE = 4
|
|
9
|
+
export const VERSION_UPDATE_INDEX_FIELDS = 5
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Model, Schema } from '@contember/schema'
|
|
1
|
+
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
|
+
import { JSONValue, Model, Schema } from '@contember/schema'
|
|
3
3
|
import { addField, SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'
|
|
4
4
|
import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
|
|
5
|
-
import {
|
|
6
|
-
import { getColumnName, isColumn } from '@contember/schema-utils'
|
|
7
|
-
import { ImplementationException } from '../../exceptions'
|
|
5
|
+
import { isColumn } from '@contember/schema-utils'
|
|
8
6
|
import { createFields } from '../utils/diffUtils'
|
|
9
7
|
import { getColumnSqlType } from '../utils/columnUtils'
|
|
8
|
+
import { fillSeed } from './columnUtils'
|
|
10
9
|
|
|
11
10
|
export class CreateColumnModificationHandler implements ModificationHandler<CreateColumnModificationData> {
|
|
12
11
|
constructor(private readonly data: CreateColumnModificationData, private readonly schema: Schema) {}
|
|
@@ -18,34 +17,27 @@ export class CreateColumnModificationHandler implements ModificationHandler<Crea
|
|
|
18
17
|
}
|
|
19
18
|
const column = this.data.field
|
|
20
19
|
const hasSeed = this.data.fillValue !== undefined || this.data.copyValue !== undefined
|
|
20
|
+
const columnType = getColumnSqlType(column)
|
|
21
21
|
builder.addColumn(entity.tableName, {
|
|
22
22
|
[column.columnName]: {
|
|
23
|
-
type:
|
|
23
|
+
type: columnType,
|
|
24
24
|
notNull: !column.nullable && !hasSeed,
|
|
25
25
|
sequenceGenerated: column.sequence,
|
|
26
26
|
},
|
|
27
27
|
})
|
|
28
|
-
if (hasSeed) {
|
|
29
|
-
if (this.data.fillValue !== undefined) {
|
|
30
|
-
builder.sql(`UPDATE ${wrapIdentifier(entity.tableName)}
|
|
31
|
-
SET ${wrapIdentifier(column.columnName)} = ${escapeValue(this.data.fillValue)}`)
|
|
32
|
-
} else if (this.data.copyValue !== undefined) {
|
|
33
|
-
const copyFrom = getColumnName(this.schema.model, entity, this.data.copyValue)
|
|
34
|
-
builder.sql(`UPDATE ${wrapIdentifier(entity.tableName)}
|
|
35
|
-
SET ${wrapIdentifier(column.columnName)} = ${wrapIdentifier(copyFrom)}::${getColumnSqlType(column)}`)
|
|
36
|
-
} else {
|
|
37
|
-
throw new ImplementationException()
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// event applier defers constraint check, we need to fire them before ALTER
|
|
41
|
-
builder.sql(`SET CONSTRAINTS ALL IMMEDIATE`)
|
|
42
|
-
builder.sql(`SET CONSTRAINTS ALL DEFERRED`)
|
|
43
28
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
29
|
+
if (hasSeed) {
|
|
30
|
+
fillSeed({
|
|
31
|
+
builder,
|
|
32
|
+
type: 'creating',
|
|
33
|
+
model: this.schema.model,
|
|
34
|
+
entity,
|
|
35
|
+
columnName: column.columnName,
|
|
36
|
+
nullable: column.nullable,
|
|
37
|
+
columnType,
|
|
38
|
+
copyValue: this.data.copyValue,
|
|
39
|
+
fillValue: this.data.fillValue,
|
|
40
|
+
})
|
|
49
41
|
}
|
|
50
42
|
}
|
|
51
43
|
|
|
@@ -67,7 +59,7 @@ export class CreateColumnModificationHandler implements ModificationHandler<Crea
|
|
|
67
59
|
export interface CreateColumnModificationData {
|
|
68
60
|
entityName: string
|
|
69
61
|
field: Model.AnyColumn
|
|
70
|
-
fillValue?:
|
|
62
|
+
fillValue?: JSONValue
|
|
71
63
|
copyValue?: string
|
|
72
64
|
}
|
|
73
65
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { escapeValue, MigrationBuilder } from '@contember/database-migrations'
|
|
2
|
-
import { Model, Schema } from '@contember/schema'
|
|
2
|
+
import { JSONValue, Model, Schema } from '@contember/schema'
|
|
3
3
|
import { SchemaUpdater, updateEntity, updateField, updateModel } from '../utils/schemaUpdateUtils'
|
|
4
4
|
import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
|
|
5
5
|
import deepEqual from 'fast-deep-equal'
|
|
6
6
|
import { updateColumns } from '../utils/diffUtils'
|
|
7
|
-
import { wrapIdentifier } from '
|
|
7
|
+
import { wrapIdentifier } from '../../utils/dbHelpers'
|
|
8
8
|
import { getColumnSqlType } from '../utils/columnUtils'
|
|
9
|
-
import {
|
|
9
|
+
import { fillSeed } from './columnUtils'
|
|
10
10
|
|
|
11
11
|
export class UpdateColumnDefinitionModificationHandler implements ModificationHandler<UpdateColumnDefinitionModificationData> {
|
|
12
12
|
constructor(private readonly data: UpdateColumnDefinitionModificationData, private readonly schema: Schema) {}
|
|
@@ -25,9 +25,11 @@ export class UpdateColumnDefinitionModificationHandler implements ModificationHa
|
|
|
25
25
|
|
|
26
26
|
const usingCast = `${wrapIdentifier(oldColumn.columnName)}::${columnType}`
|
|
27
27
|
|
|
28
|
+
const hasSeed = this.data.fillValue !== undefined || this.data.copyValue !== undefined
|
|
29
|
+
|
|
28
30
|
builder.alterColumn(entity.tableName, oldColumn.columnName, {
|
|
29
31
|
type: hasNewSequence || hasNewType ? columnType : undefined,
|
|
30
|
-
notNull: oldColumn.nullable !== newColumn.nullable ? !newColumn.nullable : undefined,
|
|
32
|
+
notNull: oldColumn.nullable !== newColumn.nullable && (!hasSeed || newColumn.nullable) ? !newColumn.nullable : undefined,
|
|
31
33
|
using: hasNewSequence
|
|
32
34
|
? `COALESCE(${usingCast}, nextval(PG_GET_SERIAL_SEQUENCE(${escapeValue(entity.tableName)}, ${escapeValue(oldColumn.columnName)})))`
|
|
33
35
|
: hasNewType
|
|
@@ -36,6 +38,20 @@ export class UpdateColumnDefinitionModificationHandler implements ModificationHa
|
|
|
36
38
|
sequenceGenerated: oldColumn.sequence && !newColumn.sequence ? false : (!oldColumn.sequence ? newColumn.sequence : undefined),
|
|
37
39
|
})
|
|
38
40
|
|
|
41
|
+
if (hasSeed) {
|
|
42
|
+
fillSeed({
|
|
43
|
+
builder,
|
|
44
|
+
type: 'updating',
|
|
45
|
+
model: this.schema.model,
|
|
46
|
+
entity,
|
|
47
|
+
columnName: oldColumn.columnName,
|
|
48
|
+
nullable: newColumn.nullable,
|
|
49
|
+
columnType,
|
|
50
|
+
copyValue: this.data.copyValue,
|
|
51
|
+
fillValue: this.data.fillValue,
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
|
|
39
55
|
const seqAlter = []
|
|
40
56
|
if (oldColumn.sequence && newColumn.sequence) {
|
|
41
57
|
if (oldColumn.sequence.precedence !== newColumn.sequence.precedence) {
|
|
@@ -96,6 +112,8 @@ export interface UpdateColumnDefinitionModificationData {
|
|
|
96
112
|
entityName: string
|
|
97
113
|
fieldName: string
|
|
98
114
|
definition: ColumnDefinitionAlter
|
|
115
|
+
fillValue?: JSONValue
|
|
116
|
+
copyValue?: string
|
|
99
117
|
}
|
|
100
118
|
|
|
101
119
|
export const updateColumnDefinitionModification = createModificationType({
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { wrapIdentifier } from '../../utils/dbHelpers'
|
|
2
|
+
import { ImplementationException } from '../../exceptions'
|
|
3
|
+
import { JSONValue, Model } from '@contember/schema'
|
|
4
|
+
import { escapeValue, MigrationBuilder } from '@contember/database-migrations'
|
|
5
|
+
import { getColumnName } from '@contember/schema-utils'
|
|
6
|
+
|
|
7
|
+
export const fillSeed = ({ builder, fillValue, copyValue, entity, columnName, nullable, model, columnType, type }: {
|
|
8
|
+
model: Model.Schema
|
|
9
|
+
entity: Model.Entity
|
|
10
|
+
columnName: string
|
|
11
|
+
columnType: string
|
|
12
|
+
nullable: boolean
|
|
13
|
+
builder: MigrationBuilder
|
|
14
|
+
fillValue?: JSONValue
|
|
15
|
+
copyValue?: string
|
|
16
|
+
type: 'creating' | 'updating'
|
|
17
|
+
}) => {
|
|
18
|
+
const where = type === 'updating' ? ` WHERE ${wrapIdentifier(columnName)} IS NULL` : ''
|
|
19
|
+
if (fillValue !== undefined) {
|
|
20
|
+
builder.sql(`UPDATE ${wrapIdentifier(entity.tableName)}
|
|
21
|
+
SET ${wrapIdentifier(columnName)} = ${escapeValue(fillValue)}${where}`)
|
|
22
|
+
} else if (copyValue !== undefined) {
|
|
23
|
+
const copyFrom = getColumnName(model, entity, copyValue)
|
|
24
|
+
builder.sql(`UPDATE ${wrapIdentifier(entity.tableName)}
|
|
25
|
+
SET ${wrapIdentifier(columnName)} = ${wrapIdentifier(copyFrom)}::${columnType}${where}`)
|
|
26
|
+
} else {
|
|
27
|
+
throw new ImplementationException()
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (!nullable) {
|
|
31
|
+
builder.alterColumn(entity.tableName, columnName, {
|
|
32
|
+
notNull: true,
|
|
33
|
+
})
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -1,57 +1,48 @@
|
|
|
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 {
|
|
5
|
-
|
|
4
|
+
import {
|
|
5
|
+
createModificationType,
|
|
6
|
+
Differ,
|
|
7
|
+
ModificationHandler,
|
|
8
|
+
ModificationHandlerCreateSqlOptions,
|
|
9
|
+
} from '../ModificationHandler'
|
|
10
|
+
import { wrapIdentifier } from '../../utils/dbHelpers'
|
|
11
|
+
import { getUniqueConstraintColumns } from './utils'
|
|
12
|
+
import deepEqual from 'fast-deep-equal'
|
|
6
13
|
|
|
7
14
|
export class CreateUniqueConstraintModificationHandler implements ModificationHandler<CreateUniqueConstraintModificationData> {
|
|
8
15
|
constructor(private readonly data: CreateUniqueConstraintModificationData, 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
23
|
const fields = this.data.unique.fields
|
|
17
|
-
const columns =
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
},
|
|
22
|
-
visitManyHasOne: ({ relation }) => {
|
|
23
|
-
return relation.joiningColumn.columnName
|
|
24
|
-
},
|
|
25
|
-
visitOneHasMany: () => {
|
|
26
|
-
throw new Error(`Cannot create unique key on 1:m relation in ${entity.name}.${fieldName}`)
|
|
27
|
-
},
|
|
28
|
-
visitOneHasOneOwning: () => {
|
|
29
|
-
throw new Error(
|
|
30
|
-
`Cannot create unique key on 1:1 relation, this relation has unique key by default in ${entity.name}.${fieldName}`,
|
|
31
|
-
)
|
|
32
|
-
},
|
|
33
|
-
visitOneHasOneInverse: () => {
|
|
34
|
-
throw new Error(`Cannot create unique key on 1:1 inverse relation in ${entity.name}.${fieldName}`)
|
|
35
|
-
},
|
|
36
|
-
visitManyHasManyOwning: () => {
|
|
37
|
-
throw new Error(`Cannot create unique key on m:m relation in ${entity.name}.${fieldName}`)
|
|
38
|
-
},
|
|
39
|
-
visitManyHasManyInverse: () => {
|
|
40
|
-
throw new Error(`Cannot create unique key on m:m inverse relation in ${entity.name}.${fieldName}`)
|
|
41
|
-
},
|
|
42
|
-
})
|
|
24
|
+
const columns = getUniqueConstraintColumns({
|
|
25
|
+
entity,
|
|
26
|
+
model: this.schema.model,
|
|
27
|
+
fields,
|
|
43
28
|
})
|
|
44
|
-
|
|
29
|
+
|
|
30
|
+
const tableNameId = wrapIdentifier(entity.tableName)
|
|
31
|
+
const columnNameIds = columns.map(wrapIdentifier)
|
|
32
|
+
|
|
33
|
+
builder.sql(`ALTER TABLE ${tableNameId} ADD UNIQUE (${columnNameIds.join(', ')})`)
|
|
34
|
+
|
|
35
|
+
invalidateDatabaseMetadata()
|
|
45
36
|
}
|
|
46
37
|
|
|
47
38
|
public getSchemaUpdater(): SchemaUpdater {
|
|
48
39
|
return updateModel(
|
|
49
40
|
updateEntity(this.data.entityName, ({ entity }) => ({
|
|
50
41
|
...entity,
|
|
51
|
-
unique:
|
|
42
|
+
unique: [
|
|
52
43
|
...entity.unique,
|
|
53
|
-
|
|
54
|
-
|
|
44
|
+
this.data.unique,
|
|
45
|
+
],
|
|
55
46
|
})),
|
|
56
47
|
)
|
|
57
48
|
}
|
|
@@ -67,21 +58,21 @@ export class CreateUniqueConstraintModificationHandler implements ModificationHa
|
|
|
67
58
|
|
|
68
59
|
}
|
|
69
60
|
|
|
70
|
-
export interface CreateUniqueConstraintModificationData {
|
|
71
|
-
entityName: string
|
|
72
|
-
unique: Model.UniqueConstraint
|
|
73
|
-
}
|
|
74
|
-
|
|
75
61
|
export const createUniqueConstraintModification = createModificationType({
|
|
76
62
|
id: 'createUniqueConstraint',
|
|
77
63
|
handler: CreateUniqueConstraintModificationHandler,
|
|
78
64
|
})
|
|
79
65
|
|
|
66
|
+
export interface CreateUniqueConstraintModificationData {
|
|
67
|
+
entityName: string
|
|
68
|
+
unique: Model.UniqueConstraint
|
|
69
|
+
}
|
|
70
|
+
|
|
80
71
|
export class CreateUniqueConstraintDiffer implements Differ {
|
|
81
72
|
createDiff(originalSchema: Schema, updatedSchema: Schema) {
|
|
82
73
|
return Object.values(updatedSchema.model.entities).flatMap(entity =>
|
|
83
|
-
|
|
84
|
-
.filter(it => !originalSchema.model.entities[entity.name].unique
|
|
74
|
+
entity.unique
|
|
75
|
+
.filter(it => !originalSchema.model.entities[entity.name].unique.find(uniq => deepEqual(uniq.fields, it.fields)))
|
|
85
76
|
.map(unique => createUniqueConstraintModification.createModification({
|
|
86
77
|
entityName: entity.name,
|
|
87
78
|
unique,
|