@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
|
@@ -1,26 +1,45 @@
|
|
|
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 {
|
|
4
|
+
import {
|
|
5
|
+
createModificationType,
|
|
6
|
+
Differ,
|
|
7
|
+
ModificationHandler,
|
|
8
|
+
ModificationHandlerCreateSqlOptions,
|
|
9
|
+
} from '../ModificationHandler'
|
|
5
10
|
import deepEqual from 'fast-deep-equal'
|
|
11
|
+
import { getIndexColumns } from './utils'
|
|
12
|
+
import { wrapIdentifier } from '../../utils/dbHelpers'
|
|
6
13
|
|
|
7
14
|
export class RemoveIndexModificationHandler implements ModificationHandler<RemoveIndexModificationData> {
|
|
8
15
|
constructor(private readonly data: RemoveIndexModificationData, 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
|
-
|
|
16
|
-
|
|
22
|
+
const fields = this.getFields()
|
|
23
|
+
|
|
24
|
+
const columns = getIndexColumns({
|
|
25
|
+
entity,
|
|
26
|
+
fields,
|
|
27
|
+
model: this.schema.model,
|
|
17
28
|
})
|
|
29
|
+
|
|
30
|
+
const indexNames = databaseMetadata.getIndexNames({ tableName: entity.tableName, columnNames: columns })
|
|
31
|
+
|
|
32
|
+
for (const name of indexNames) {
|
|
33
|
+
builder.sql(`DROP INDEX ${wrapIdentifier(name)}`)
|
|
34
|
+
}
|
|
35
|
+
invalidateDatabaseMetadata()
|
|
18
36
|
}
|
|
19
37
|
|
|
20
38
|
public getSchemaUpdater(): SchemaUpdater {
|
|
39
|
+
const fields = this.getFields()
|
|
21
40
|
return updateModel(
|
|
22
41
|
updateEntity(this.data.entityName, ({ entity }) => {
|
|
23
|
-
const
|
|
42
|
+
const indexes = entity.indexes.filter(it => !deepEqual(it.fields, fields))
|
|
24
43
|
return {
|
|
25
44
|
...entity,
|
|
26
45
|
indexes,
|
|
@@ -30,9 +49,20 @@ export class RemoveIndexModificationHandler implements ModificationHandler<Remov
|
|
|
30
49
|
}
|
|
31
50
|
|
|
32
51
|
describe() {
|
|
33
|
-
const fields = this.
|
|
52
|
+
const fields = this.getFields()
|
|
34
53
|
return { message: `Remove index (${fields.join(', ')}) on entity ${this.data.entityName}` }
|
|
35
54
|
}
|
|
55
|
+
|
|
56
|
+
getFields() {
|
|
57
|
+
const entity = this.schema.model.entities[this.data.entityName]
|
|
58
|
+
const fields = 'indexName' in this.data
|
|
59
|
+
? entity.indexes.find(it => it.name === this.data.indexName)?.fields
|
|
60
|
+
: this.data.fields
|
|
61
|
+
if (!fields) {
|
|
62
|
+
throw new Error()
|
|
63
|
+
}
|
|
64
|
+
return fields
|
|
65
|
+
}
|
|
36
66
|
}
|
|
37
67
|
|
|
38
68
|
export const removeIndexModification = createModificationType({
|
|
@@ -41,28 +71,38 @@ export const removeIndexModification = createModificationType({
|
|
|
41
71
|
})
|
|
42
72
|
|
|
43
73
|
|
|
74
|
+
export type RemoveIndexModificationData =
|
|
75
|
+
| {
|
|
76
|
+
entityName: string
|
|
77
|
+
indexName: string
|
|
78
|
+
fields?: never
|
|
79
|
+
}
|
|
80
|
+
| {
|
|
81
|
+
entityName: string
|
|
82
|
+
fields: readonly string[]
|
|
83
|
+
indexName?: never
|
|
84
|
+
}
|
|
85
|
+
|
|
44
86
|
export class RemoveIndexDiffer implements Differ {
|
|
45
87
|
|
|
46
88
|
createDiff(originalSchema: Schema, updatedSchema: Schema) {
|
|
47
89
|
return Object.values(originalSchema.model.entities).flatMap(entity =>
|
|
48
|
-
|
|
90
|
+
entity.indexes
|
|
49
91
|
.filter(
|
|
50
|
-
it =>
|
|
51
|
-
updatedSchema.model.entities[entity.name]
|
|
52
|
-
(!
|
|
53
|
-
|
|
92
|
+
it => {
|
|
93
|
+
const updatedEntity = updatedSchema.model.entities[entity.name]
|
|
94
|
+
if (!updatedEntity) {
|
|
95
|
+
return false
|
|
96
|
+
}
|
|
97
|
+
return !updatedEntity.indexes.find(index => deepEqual(index.fields, it.fields))
|
|
98
|
+
},
|
|
54
99
|
)
|
|
55
100
|
.map(index =>
|
|
56
101
|
removeIndexModification.createModification({
|
|
57
102
|
entityName: entity.name,
|
|
58
|
-
|
|
103
|
+
fields: index.fields,
|
|
59
104
|
}),
|
|
60
105
|
),
|
|
61
106
|
)
|
|
62
107
|
}
|
|
63
108
|
}
|
|
64
|
-
|
|
65
|
-
export interface RemoveIndexModificationData {
|
|
66
|
-
entityName: string
|
|
67
|
-
indexName: string
|
|
68
|
-
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { acceptFieldVisitor } from '@contember/schema-utils'
|
|
2
|
+
import { Model } from '@contember/schema'
|
|
3
|
+
|
|
4
|
+
export const getIndexColumns = ({ entity, fields, model }: { fields: readonly string[]; model: Model.Schema; entity: Model.Entity }) => {
|
|
5
|
+
return fields.map(fieldName => {
|
|
6
|
+
return acceptFieldVisitor(model, entity, fieldName, {
|
|
7
|
+
visitColumn: ({ column }) => {
|
|
8
|
+
return column.columnName
|
|
9
|
+
},
|
|
10
|
+
visitManyHasOne: ({ relation }) => {
|
|
11
|
+
return relation.joiningColumn.columnName
|
|
12
|
+
},
|
|
13
|
+
visitOneHasOneOwning: ({ relation }) => {
|
|
14
|
+
return relation.joiningColumn.columnName
|
|
15
|
+
},
|
|
16
|
+
visitOneHasMany: () => {
|
|
17
|
+
throw new Error(`Cannot create index on 1:m relation in ${entity.name}.${fieldName}`)
|
|
18
|
+
},
|
|
19
|
+
visitOneHasOneInverse: () => {
|
|
20
|
+
throw new Error(`Cannot create index on 1:1 inverse relation in ${entity.name}.${fieldName}`)
|
|
21
|
+
},
|
|
22
|
+
visitManyHasManyOwning: () => {
|
|
23
|
+
throw new Error(`Cannot create index on m:m relation in ${entity.name}.${fieldName}`)
|
|
24
|
+
},
|
|
25
|
+
visitManyHasManyInverse: () => {
|
|
26
|
+
throw new Error(`Cannot create index on m:m inverse relation in ${entity.name}.${fieldName}`)
|
|
27
|
+
},
|
|
28
|
+
})
|
|
29
|
+
})
|
|
30
|
+
}
|
|
@@ -1,33 +1,25 @@
|
|
|
1
1
|
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
2
|
import { Model, Schema } from '@contember/schema'
|
|
3
|
-
import {
|
|
4
|
-
addField,
|
|
5
|
-
addTakenIndexName,
|
|
6
|
-
SchemaUpdater,
|
|
7
|
-
updateEntity,
|
|
8
|
-
updateModel,
|
|
9
|
-
updateSchema,
|
|
10
|
-
} from '../utils/schemaUpdateUtils'
|
|
3
|
+
import { addField, SchemaUpdater, updateEntity, updateModel, updateSchema } from '../utils/schemaUpdateUtils'
|
|
11
4
|
import {
|
|
12
5
|
createModificationType,
|
|
13
6
|
Differ,
|
|
14
|
-
ModificationHandler,
|
|
7
|
+
ModificationHandler, ModificationHandlerCreateSqlOptions,
|
|
15
8
|
ModificationHandlerOptions,
|
|
16
9
|
} from '../ModificationHandler'
|
|
17
|
-
import { isInverseRelation, isOwningRelation
|
|
10
|
+
import { isInverseRelation, isOwningRelation } from '@contember/schema-utils'
|
|
18
11
|
import { updateRelations } from '../utils/diffUtils'
|
|
19
12
|
import { createJunctionTableSql } from '../utils/createJunctionTable'
|
|
20
|
-
import { wrapIdentifier } from '
|
|
13
|
+
import { wrapIdentifier } from '../../utils/dbHelpers'
|
|
21
14
|
import { normalizeManyHasManyRelation, PartialManyHasManyRelation } from './normalization'
|
|
22
15
|
import { updateFieldNameModification } from '../fields'
|
|
23
|
-
import { SchemaWithMeta } from '../utils/schemaMeta'
|
|
24
16
|
|
|
25
17
|
export class ConvertOneHasManyToManyHasManyRelationModificationHandler implements ModificationHandler<ConvertOneHasManyToManyHasManyRelationModificationData> {
|
|
26
18
|
private subModification: ModificationHandler<any>
|
|
27
19
|
|
|
28
20
|
constructor(
|
|
29
21
|
private readonly data: ConvertOneHasManyToManyHasManyRelationModificationData,
|
|
30
|
-
private readonly schema:
|
|
22
|
+
private readonly schema: Schema,
|
|
31
23
|
private readonly options: ModificationHandlerOptions,
|
|
32
24
|
) {
|
|
33
25
|
this.subModification = updateFieldNameModification.createHandler(
|
|
@@ -41,12 +33,12 @@ export class ConvertOneHasManyToManyHasManyRelationModificationHandler implement
|
|
|
41
33
|
)
|
|
42
34
|
}
|
|
43
35
|
|
|
44
|
-
public createSql(builder: MigrationBuilder): void {
|
|
36
|
+
public createSql(builder: MigrationBuilder, { systemSchema }: ModificationHandlerCreateSqlOptions): void {
|
|
45
37
|
const targetEntity = this.schema.model.entities[this.data.owningSide.target]
|
|
46
38
|
const { relation: oldRelation } = this.getRelation()
|
|
47
39
|
const entity = this.schema.model.entities[this.data.entityName]
|
|
48
40
|
|
|
49
|
-
createJunctionTableSql(builder,
|
|
41
|
+
createJunctionTableSql(builder, systemSchema, this.schema, entity, targetEntity, normalizeManyHasManyRelation(this.data.owningSide))
|
|
50
42
|
const joiningTable = this.data.owningSide.joiningTable
|
|
51
43
|
builder.sql(`
|
|
52
44
|
INSERT INTO ${wrapIdentifier(joiningTable.tableName)} (
|
|
@@ -66,7 +58,6 @@ export class ConvertOneHasManyToManyHasManyRelationModificationHandler implement
|
|
|
66
58
|
this.subModification.getSchemaUpdater(),
|
|
67
59
|
updateModel(updateEntity(entityName, addField(normalizeManyHasManyRelation(this.data.owningSide)))),
|
|
68
60
|
this.data.inverseSide ? updateModel(updateEntity(this.data.owningSide.target, addField(this.data.inverseSide))) : undefined,
|
|
69
|
-
addTakenIndexName(NamingHelper.createJunctionTablePrimaryConstraintName(this.data.owningSide.joiningTable.tableName)),
|
|
70
61
|
)
|
|
71
62
|
}
|
|
72
63
|
|
|
@@ -76,9 +67,6 @@ export class ConvertOneHasManyToManyHasManyRelationModificationHandler implement
|
|
|
76
67
|
}
|
|
77
68
|
}
|
|
78
69
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
70
|
private getRelation(): { entity: Model.Entity; relation: Model.ManyHasOneRelation } {
|
|
83
71
|
const entity = this.schema.model.entities[this.data.entityName]
|
|
84
72
|
const relation = entity.fields[this.data.fieldName]
|
|
@@ -1,31 +1,25 @@
|
|
|
1
1
|
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
2
|
import { Model, Schema } from '@contember/schema'
|
|
3
|
-
import {
|
|
4
|
-
addTakenIndexName,
|
|
5
|
-
SchemaUpdater,
|
|
6
|
-
updateEntity,
|
|
7
|
-
updateField,
|
|
8
|
-
updateModel,
|
|
9
|
-
updateSchema,
|
|
10
|
-
} from '../utils/schemaUpdateUtils'
|
|
3
|
+
import { SchemaUpdater, updateEntity, updateField, updateModel, updateSchema } from '../utils/schemaUpdateUtils'
|
|
11
4
|
import {
|
|
12
5
|
createModificationType,
|
|
13
6
|
Differ,
|
|
14
7
|
ModificationHandler,
|
|
8
|
+
ModificationHandlerCreateSqlOptions,
|
|
15
9
|
ModificationHandlerOptions,
|
|
16
10
|
} from '../ModificationHandler'
|
|
17
|
-
import { isOwningRelation
|
|
11
|
+
import { isOwningRelation } from '@contember/schema-utils'
|
|
18
12
|
import { updateRelations } from '../utils/diffUtils'
|
|
19
13
|
import { NoopModification } from '../NoopModification'
|
|
20
14
|
import { updateFieldNameModification } from '../fields'
|
|
21
|
-
import {
|
|
15
|
+
import { wrapIdentifier } from '../../utils/dbHelpers'
|
|
22
16
|
|
|
23
17
|
export class ConvertOneToManyRelationModificationHandler implements ModificationHandler<ConvertOneToManyRelationModificationData> {
|
|
24
18
|
private subModification: ModificationHandler<any>
|
|
25
19
|
|
|
26
20
|
constructor(
|
|
27
21
|
private readonly data: ConvertOneToManyRelationModificationData,
|
|
28
|
-
private readonly schema:
|
|
22
|
+
private readonly schema: Schema,
|
|
29
23
|
private readonly options: ModificationHandlerOptions,
|
|
30
24
|
) {
|
|
31
25
|
const { relation } = this.getRelation()
|
|
@@ -42,24 +36,30 @@ export class ConvertOneToManyRelationModificationHandler implements Modification
|
|
|
42
36
|
: new NoopModification()
|
|
43
37
|
}
|
|
44
38
|
|
|
45
|
-
public createSql(builder: MigrationBuilder): void {
|
|
39
|
+
public createSql(builder: MigrationBuilder, options: ModificationHandlerCreateSqlOptions): void {
|
|
46
40
|
const { entity, relation } = this.getRelation()
|
|
47
41
|
const columnName = relation.joiningColumn.columnName
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
42
|
+
|
|
43
|
+
const tableNameId = wrapIdentifier(entity.tableName)
|
|
44
|
+
const columnNameId = wrapIdentifier(columnName)
|
|
45
|
+
builder.sql(`CREATE INDEX ON ${tableNameId} (${columnNameId})`)
|
|
46
|
+
|
|
47
|
+
const uniqueConstraintNames = options.databaseMetadata.getUniqueConstraintNames({
|
|
48
|
+
tableName: entity.tableName,
|
|
49
|
+
columnNames: [relation.joiningColumn.columnName],
|
|
52
50
|
})
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
for (const name of uniqueConstraintNames) {
|
|
52
|
+
builder.sql(`ALTER TABLE ${wrapIdentifier(entity.tableName)} DROP CONSTRAINT ${wrapIdentifier(name)}`)
|
|
53
|
+
}
|
|
54
|
+
options.invalidateDatabaseMetadata()
|
|
55
|
+
|
|
56
|
+
this.subModification.createSql(builder, options)
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
public getSchemaUpdater(): SchemaUpdater {
|
|
59
60
|
const { relation } = this.getRelation()
|
|
60
61
|
const { entityName, fieldName } = this.data
|
|
61
|
-
|
|
62
|
-
const field = entity.fields[fieldName] as Model.OneHasOneOwningRelation
|
|
62
|
+
|
|
63
63
|
return updateSchema(
|
|
64
64
|
updateModel(
|
|
65
65
|
updateEntity(
|
|
@@ -87,7 +87,6 @@ export class ConvertOneToManyRelationModificationHandler implements Modification
|
|
|
87
87
|
),
|
|
88
88
|
),
|
|
89
89
|
) : undefined,
|
|
90
|
-
addTakenIndexName(NamingHelper.createForeignKeyIndexName(entity.tableName, field.joiningColumn.columnName)),
|
|
91
90
|
)
|
|
92
91
|
}
|
|
93
92
|
|
|
@@ -1,24 +1,11 @@
|
|
|
1
1
|
import { Model, Schema } from '@contember/schema'
|
|
2
|
-
import {
|
|
3
|
-
acceptRelationTypeVisitor,
|
|
4
|
-
isInverseRelation,
|
|
5
|
-
isOwningRelation,
|
|
6
|
-
isRelation,
|
|
7
|
-
NamingHelper,
|
|
8
|
-
} from '@contember/schema-utils'
|
|
2
|
+
import { acceptRelationTypeVisitor, isInverseRelation, isOwningRelation, isRelation } from '@contember/schema-utils'
|
|
9
3
|
import { MigrationBuilder } from '@contember/database-migrations'
|
|
10
|
-
import {
|
|
11
|
-
addField,
|
|
12
|
-
addTakenIndexName,
|
|
13
|
-
SchemaUpdater,
|
|
14
|
-
updateEntity,
|
|
15
|
-
updateModel,
|
|
16
|
-
updateSchema,
|
|
17
|
-
} from '../utils/schemaUpdateUtils'
|
|
4
|
+
import { addField, SchemaUpdater, updateEntity, updateModel, updateSchema } from '../utils/schemaUpdateUtils'
|
|
18
5
|
import {
|
|
19
6
|
createModificationType,
|
|
20
7
|
Differ,
|
|
21
|
-
ModificationHandler,
|
|
8
|
+
ModificationHandler, ModificationHandlerCreateSqlOptions,
|
|
22
9
|
ModificationHandlerOptions,
|
|
23
10
|
} from '../ModificationHandler'
|
|
24
11
|
import { isIt } from '../../utils/isIt'
|
|
@@ -26,19 +13,23 @@ import { createFields } from '../utils/diffUtils'
|
|
|
26
13
|
import { getPrimaryColumnType } from '../utils/getPrimaryColumnType'
|
|
27
14
|
import { createJunctionTableSql } from '../utils/createJunctionTable'
|
|
28
15
|
import { normalizeManyHasManyRelation, PartialManyHasManyRelation } from './normalization'
|
|
29
|
-
import { resolveIndexName, SchemaWithMeta } from '../utils/schemaMeta'
|
|
30
16
|
import { addForeignKeyConstraint } from './helpers'
|
|
17
|
+
import { wrapIdentifier } from '../../utils/dbHelpers'
|
|
31
18
|
|
|
32
19
|
|
|
33
20
|
export class CreateRelationModificationHandler implements ModificationHandler<CreateRelationModificationData> {
|
|
34
21
|
|
|
35
22
|
constructor(
|
|
36
23
|
private readonly data: CreateRelationModificationData,
|
|
37
|
-
private readonly schema:
|
|
24
|
+
private readonly schema: Schema,
|
|
38
25
|
private readonly options: ModificationHandlerOptions,
|
|
39
26
|
) {}
|
|
40
27
|
|
|
41
|
-
public createSql(builder: MigrationBuilder
|
|
28
|
+
public createSql(builder: MigrationBuilder, {
|
|
29
|
+
databaseMetadata,
|
|
30
|
+
systemSchema,
|
|
31
|
+
invalidateDatabaseMetadata,
|
|
32
|
+
}: ModificationHandlerCreateSqlOptions): void {
|
|
42
33
|
const entity = this.schema.model.entities[this.data.entityName]
|
|
43
34
|
if (entity.view) {
|
|
44
35
|
return
|
|
@@ -51,34 +42,34 @@ export class CreateRelationModificationHandler implements ModificationHandler<Cr
|
|
|
51
42
|
notNull: !relation.nullable,
|
|
52
43
|
},
|
|
53
44
|
})
|
|
54
|
-
addForeignKeyConstraint({ builder, entity, targetEntity, relation })
|
|
45
|
+
addForeignKeyConstraint({ builder, entity, targetEntity, relation, databaseMetadata, invalidateDatabaseMetadata })
|
|
55
46
|
}
|
|
56
47
|
acceptRelationTypeVisitor(this.schema.model, entity, this.getNormalizedOwningSide(), {
|
|
57
48
|
visitManyHasOne: ({ relation }) => {
|
|
58
49
|
createOwningSide(relation)
|
|
59
50
|
const columnName = relation.joiningColumn.columnName
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
builder.
|
|
63
|
-
|
|
64
|
-
})
|
|
51
|
+
const tableNameId = wrapIdentifier(entity.tableName)
|
|
52
|
+
const columnNameId = wrapIdentifier(columnName)
|
|
53
|
+
builder.sql(`CREATE INDEX ON ${tableNameId} (${columnNameId})`)
|
|
54
|
+
invalidateDatabaseMetadata()
|
|
65
55
|
},
|
|
66
56
|
visitOneHasMany: () => {},
|
|
67
57
|
visitOneHasOneOwning: ({ relation }) => {
|
|
68
58
|
createOwningSide(relation)
|
|
69
|
-
const
|
|
70
|
-
|
|
59
|
+
const tableNameId = wrapIdentifier(entity.tableName)
|
|
60
|
+
const columnNameId = wrapIdentifier(relation.joiningColumn.columnName)
|
|
61
|
+
builder.sql(`ALTER TABLE ${tableNameId} ADD UNIQUE (${columnNameId})`)
|
|
62
|
+
invalidateDatabaseMetadata()
|
|
71
63
|
},
|
|
72
64
|
visitOneHasOneInverse: () => {},
|
|
73
65
|
visitManyHasManyOwning: ({ relation }) => {
|
|
74
|
-
createJunctionTableSql(builder,
|
|
66
|
+
createJunctionTableSql(builder, systemSchema, this.schema, entity, targetEntity, relation)
|
|
75
67
|
},
|
|
76
68
|
visitManyHasManyInverse: () => {},
|
|
77
69
|
})
|
|
78
70
|
}
|
|
79
71
|
|
|
80
72
|
public getSchemaUpdater(): SchemaUpdater {
|
|
81
|
-
const entity = this.schema.model.entities[this.data.entityName]
|
|
82
73
|
return updateSchema(
|
|
83
74
|
updateModel(
|
|
84
75
|
updateEntity(this.data.entityName, addField(this.getNormalizedOwningSide())),
|
|
@@ -86,12 +77,6 @@ export class CreateRelationModificationHandler implements ModificationHandler<Cr
|
|
|
86
77
|
? updateEntity(this.data.owningSide.target, addField(this.data.inverseSide))
|
|
87
78
|
: undefined,
|
|
88
79
|
),
|
|
89
|
-
this.data.owningSide.type === Model.RelationType.ManyHasOne
|
|
90
|
-
? addTakenIndexName(NamingHelper.createForeignKeyIndexName(entity.tableName, this.data.owningSide.joiningColumn.columnName))
|
|
91
|
-
: undefined,
|
|
92
|
-
this.data.owningSide.type === Model.RelationType.ManyHasMany && isOwningRelation(this.data.owningSide)
|
|
93
|
-
? addTakenIndexName(NamingHelper.createJunctionTablePrimaryConstraintName(this.data.owningSide.joiningTable.tableName))
|
|
94
|
-
: undefined,
|
|
95
80
|
)
|
|
96
81
|
}
|
|
97
82
|
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
createModificationType,
|
|
6
6
|
Differ,
|
|
7
7
|
ModificationHandler,
|
|
8
|
-
|
|
8
|
+
ModificationHandlerCreateSqlOptions,
|
|
9
9
|
} from '../ModificationHandler'
|
|
10
10
|
import {
|
|
11
11
|
createEventTrigger,
|
|
@@ -22,11 +22,10 @@ export class ToggleJunctionEventLogModificationHandler implements ModificationHa
|
|
|
22
22
|
constructor(
|
|
23
23
|
private readonly data: ToggleJunctionEventLogModificationData,
|
|
24
24
|
private readonly schema: Schema,
|
|
25
|
-
private readonly options: ModificationHandlerOptions,
|
|
26
25
|
) {
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
public createSql(builder: MigrationBuilder): void {
|
|
28
|
+
public createSql(builder: MigrationBuilder, { systemSchema }: ModificationHandlerCreateSqlOptions): void {
|
|
30
29
|
const entity = this.schema.model.entities[this.data.entityName]
|
|
31
30
|
const relation = entity.fields[this.data.fieldName]
|
|
32
31
|
if (!isRelation(relation) || relation.type !== Model.RelationType.ManyHasMany || !isOwningRelation(relation)) {
|
|
@@ -38,8 +37,8 @@ export class ToggleJunctionEventLogModificationHandler implements ModificationHa
|
|
|
38
37
|
relation.joiningTable.joiningColumn.columnName,
|
|
39
38
|
relation.joiningTable.inverseJoiningColumn.columnName,
|
|
40
39
|
]
|
|
41
|
-
createEventTrigger(builder,
|
|
42
|
-
createEventTrxTrigger(builder,
|
|
40
|
+
createEventTrigger(builder, systemSchema, tableName, primaryColumns)
|
|
41
|
+
createEventTrxTrigger(builder, systemSchema, tableName)
|
|
43
42
|
} else {
|
|
44
43
|
dropEventTrigger(builder, tableName)
|
|
45
44
|
dropEventTrxTrigger(builder, tableName)
|
|
@@ -1,26 +1,34 @@
|
|
|
1
1
|
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
2
|
import { Model, Schema } from '@contember/schema'
|
|
3
3
|
import { SchemaUpdater, updateEntity, updateField, updateModel } from '../utils/schemaUpdateUtils'
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
createModificationType,
|
|
6
|
+
Differ,
|
|
7
|
+
ModificationHandler,
|
|
8
|
+
ModificationHandlerCreateSqlOptions,
|
|
9
|
+
} from '../ModificationHandler'
|
|
5
10
|
import { isIt } from '../../utils/isIt'
|
|
6
11
|
import { updateRelations } from '../utils/diffUtils'
|
|
7
12
|
import { acceptRelationTypeVisitor } from '@contember/schema-utils'
|
|
8
13
|
import { addForeignKeyConstraint } from './helpers'
|
|
9
14
|
|
|
10
15
|
export class UpdateRelationOnDeleteModificationHandler implements ModificationHandler<UpdateRelationOnDeleteModificationData> {
|
|
11
|
-
constructor(
|
|
16
|
+
constructor(
|
|
17
|
+
private readonly data: UpdateRelationOnDeleteModificationData,
|
|
18
|
+
private readonly schema: Schema,
|
|
19
|
+
) {}
|
|
12
20
|
|
|
13
|
-
public createSql(builder: MigrationBuilder): void {
|
|
21
|
+
public createSql(builder: MigrationBuilder, { databaseMetadata, invalidateDatabaseMetadata }: ModificationHandlerCreateSqlOptions): void {
|
|
14
22
|
const entity = this.schema.model.entities[this.data.entityName]
|
|
15
23
|
if (entity.view) {
|
|
16
24
|
return
|
|
17
25
|
}
|
|
18
26
|
acceptRelationTypeVisitor(this.schema.model, entity, this.data.fieldName, {
|
|
19
27
|
visitManyHasOne: ({ entity, relation, targetEntity }) => {
|
|
20
|
-
addForeignKeyConstraint({ builder, entity, targetEntity, relation, recreate: true })
|
|
28
|
+
addForeignKeyConstraint({ builder, entity, targetEntity, relation, recreate: true, databaseMetadata, invalidateDatabaseMetadata })
|
|
21
29
|
},
|
|
22
30
|
visitOneHasOneOwning: ({ entity, relation, targetEntity }) => {
|
|
23
|
-
addForeignKeyConstraint({ builder, entity, targetEntity, relation, recreate: true })
|
|
31
|
+
addForeignKeyConstraint({ builder, entity, targetEntity, relation, recreate: true, databaseMetadata, invalidateDatabaseMetadata })
|
|
24
32
|
},
|
|
25
33
|
visitOneHasMany: () => {},
|
|
26
34
|
visitOneHasOneInverse: () => {},
|
|
@@ -1,34 +1,39 @@
|
|
|
1
1
|
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
|
-
import { NamingHelper } from '@contember/schema-utils'
|
|
3
2
|
import { Model } from '@contember/schema'
|
|
3
|
+
import { wrapIdentifier } from '../../utils/dbHelpers'
|
|
4
|
+
import { SchemaDatabaseMetadata } from '@contember/schema-utils'
|
|
4
5
|
|
|
5
|
-
export const addForeignKeyConstraint = ({ builder, entity, relation, targetEntity, recreate = false }: {
|
|
6
|
+
export const addForeignKeyConstraint = ({ builder, entity, relation, targetEntity, recreate = false, databaseMetadata, invalidateDatabaseMetadata }: {
|
|
6
7
|
recreate?: boolean
|
|
7
8
|
builder: MigrationBuilder
|
|
8
9
|
entity: Model.Entity
|
|
9
10
|
targetEntity: Model.Entity
|
|
10
11
|
relation: Model.OneHasOneOwningRelation | Model.ManyHasOneRelation
|
|
12
|
+
databaseMetadata: SchemaDatabaseMetadata
|
|
13
|
+
invalidateDatabaseMetadata: () => void
|
|
11
14
|
}) => {
|
|
12
|
-
const fkName = NamingHelper.createForeignKeyName(
|
|
13
|
-
entity.tableName,
|
|
14
|
-
relation.joiningColumn.columnName,
|
|
15
|
-
targetEntity.tableName,
|
|
16
|
-
targetEntity.primaryColumn,
|
|
17
|
-
)
|
|
18
15
|
if (recreate) {
|
|
19
|
-
|
|
16
|
+
const fkNames = databaseMetadata.getForeignKeyConstraintNames(
|
|
17
|
+
{
|
|
18
|
+
fromTable: entity.tableName,
|
|
19
|
+
fromColumn: relation.joiningColumn.columnName,
|
|
20
|
+
toTable: targetEntity.tableName,
|
|
21
|
+
toColumn: targetEntity.primaryColumn,
|
|
22
|
+
},
|
|
23
|
+
)
|
|
24
|
+
for (const name of fkNames) {
|
|
25
|
+
builder.sql(`ALTER TABLE ${wrapIdentifier(entity.tableName)} DROP CONSTRAINT ${wrapIdentifier(name)}`)
|
|
26
|
+
}
|
|
20
27
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
deferred: false,
|
|
33
|
-
})
|
|
28
|
+
|
|
29
|
+
const onDelete = ({
|
|
30
|
+
[Model.OnDelete.setNull]: 'SET NULL',
|
|
31
|
+
[Model.OnDelete.cascade]: 'CASCADE',
|
|
32
|
+
[Model.OnDelete.restrict]: 'NO ACTION',
|
|
33
|
+
} as const)[relation.joiningColumn.onDelete]
|
|
34
|
+
builder.sql(`ALTER TABLE ${wrapIdentifier(entity.tableName)}
|
|
35
|
+
ADD FOREIGN KEY (${wrapIdentifier(relation.joiningColumn.columnName)})
|
|
36
|
+
REFERENCES ${wrapIdentifier(targetEntity.tableName)}(${wrapIdentifier(targetEntity.primaryColumn)}) ON DELETE ${onDelete} DEFERRABLE INITIALLY IMMEDIATE`)
|
|
37
|
+
|
|
38
|
+
invalidateDatabaseMetadata()
|
|
34
39
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Schema } from '@contember/schema'
|
|
2
|
+
import { SchemaUpdater, updateEveryEntity, updateModel } from '../utils/schemaUpdateUtils'
|
|
3
|
+
import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
|
|
4
|
+
|
|
5
|
+
export class RemoveIndexNamesModificationHandler implements ModificationHandler<RemoveIndexNamesModificationData> {
|
|
6
|
+
constructor() {}
|
|
7
|
+
|
|
8
|
+
public createSql(): void {
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
public getSchemaUpdater(): SchemaUpdater {
|
|
12
|
+
return updateModel(
|
|
13
|
+
updateEveryEntity(({ entity }) => {
|
|
14
|
+
return {
|
|
15
|
+
...entity,
|
|
16
|
+
indexes: entity.indexes.map(({ name, ...other }) => other),
|
|
17
|
+
unique: entity.unique.map(({ name, ...other }) => other),
|
|
18
|
+
}
|
|
19
|
+
}),
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
describe() {
|
|
24
|
+
return { message: `Schema upgrade: remove names of indexes and unique constraints` }
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const removeIndexNamesModification = createModificationType({
|
|
29
|
+
id: 'removeIndexNames',
|
|
30
|
+
handler: RemoveIndexNamesModificationHandler,
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
export type RemoveIndexNamesModificationData = {}
|
|
35
|
+
|
|
36
|
+
export class RemoveIndexNamesDiffer implements Differ {
|
|
37
|
+
createDiff(originalSchema: Schema) {
|
|
38
|
+
const hasNames = !!Object.values(originalSchema.model.entities).find(it => {
|
|
39
|
+
return it.indexes.find(it => !!it.name) || it.unique.find(it => !!it.name)
|
|
40
|
+
})
|
|
41
|
+
if (hasNames) {
|
|
42
|
+
return [removeIndexNamesModification.createModification({})]
|
|
43
|
+
}
|
|
44
|
+
return []
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { createEventTrigger, createEventTrxTrigger } from './sqlUpdateUtils'
|
|
2
2
|
import { MigrationBuilder } from '@contember/database-migrations'
|
|
3
|
-
import { Model } from '@contember/schema'
|
|
3
|
+
import { Model, Schema } from '@contember/schema'
|
|
4
4
|
import { getPrimaryColumnType } from './getPrimaryColumnType'
|
|
5
|
-
import {
|
|
5
|
+
import { wrapIdentifier } from '../../utils/dbHelpers'
|
|
6
6
|
|
|
7
7
|
export const createJunctionTableSql = (
|
|
8
8
|
builder: MigrationBuilder,
|
|
9
9
|
systemSchema: string,
|
|
10
|
-
schema:
|
|
10
|
+
schema: Schema,
|
|
11
11
|
entity: Model.Entity,
|
|
12
12
|
targetEntity: Model.Entity,
|
|
13
13
|
relation: Model.ManyHasManyOwningRelation,
|
|
@@ -33,11 +33,11 @@ export const createJunctionTableSql = (
|
|
|
33
33
|
},
|
|
34
34
|
},
|
|
35
35
|
)
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
|
|
37
|
+
const tableNameId = wrapIdentifier(relation.joiningTable.tableName)
|
|
38
|
+
const columnNameId = primaryColumns.map(wrapIdentifier)
|
|
39
|
+
builder.sql(`ALTER TABLE ${tableNameId} ADD PRIMARY KEY (${columnNameId.join(', ')})`)
|
|
40
|
+
|
|
41
41
|
if (relation.joiningTable.eventLog.enabled) {
|
|
42
42
|
createEventTrigger(builder, systemSchema, relation.joiningTable.tableName, primaryColumns)
|
|
43
43
|
createEventTrxTrigger(builder, systemSchema, relation.joiningTable.tableName)
|