@contember/schema-migrations 1.0.0-rc.13 → 1.0.0-rc.16
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/SchemaDiffer.d.ts.map +1 -1
- package/dist/src/SchemaDiffer.js +1 -0
- package/dist/src/SchemaDiffer.js.map +1 -1
- package/dist/src/modifications/ModificationHandlerFactory.d.ts.map +1 -1
- package/dist/src/modifications/ModificationHandlerFactory.js +1 -0
- package/dist/src/modifications/ModificationHandlerFactory.js.map +1 -1
- package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts +10 -0
- package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts.map +1 -0
- package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js +84 -0
- package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js.map +1 -0
- package/dist/src/modifications/relations/CreateRelationModification.d.ts.map +1 -1
- package/dist/src/modifications/relations/CreateRelationModification.js +4 -30
- package/dist/src/modifications/relations/CreateRelationModification.js.map +1 -1
- package/dist/src/modifications/relations/index.d.ts +1 -0
- package/dist/src/modifications/relations/index.d.ts.map +1 -1
- package/dist/src/modifications/relations/index.js +1 -0
- package/dist/src/modifications/relations/index.js.map +1 -1
- package/dist/src/modifications/utils/createJunctionTable.d.ts +4 -0
- package/dist/src/modifications/utils/createJunctionTable.d.ts.map +1 -0
- package/dist/src/modifications/utils/createJunctionTable.js +33 -0
- package/dist/src/modifications/utils/createJunctionTable.js.map +1 -0
- package/dist/src/modifications/utils/getPrimaryColumnType.d.ts +3 -0
- package/dist/src/modifications/utils/getPrimaryColumnType.d.ts.map +1 -0
- package/dist/src/modifications/utils/getPrimaryColumnType.js +9 -0
- package/dist/src/modifications/utils/getPrimaryColumnType.js.map +1 -0
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.d.ts +2 -0
- package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.js +92 -0
- package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.js.map +1 -0
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/src/SchemaDiffer.ts +2 -0
- package/src/modifications/ModificationHandlerFactory.ts +2 -0
- package/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.ts +109 -0
- package/src/modifications/relations/CreateRelationModification.ts +4 -34
- package/src/modifications/relations/index.ts +1 -0
- package/src/modifications/utils/createJunctionTable.ts +40 -0
- package/src/modifications/utils/getPrimaryColumnType.ts +6 -0
- package/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.ts +81 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createEventTrigger, createEventTrxTrigger } from './sqlUpdateUtils'
|
|
2
|
+
import { MigrationBuilder } from '@contember/database-migrations'
|
|
3
|
+
import { Model } from '@contember/schema'
|
|
4
|
+
import { getPrimaryColumnType } from './getPrimaryColumnType'
|
|
5
|
+
|
|
6
|
+
export const createJunctionTableSql = (
|
|
7
|
+
builder: MigrationBuilder,
|
|
8
|
+
entity: Model.Entity,
|
|
9
|
+
targetEntity: Model.Entity,
|
|
10
|
+
relation: Model.ManyHasManyOwningRelation,
|
|
11
|
+
) => {
|
|
12
|
+
const primaryColumns = [
|
|
13
|
+
relation.joiningTable.joiningColumn.columnName,
|
|
14
|
+
relation.joiningTable.inverseJoiningColumn.columnName,
|
|
15
|
+
]
|
|
16
|
+
builder.createTable(
|
|
17
|
+
relation.joiningTable.tableName,
|
|
18
|
+
{
|
|
19
|
+
[relation.joiningTable.joiningColumn.columnName]: {
|
|
20
|
+
type: getPrimaryColumnType(entity),
|
|
21
|
+
notNull: true,
|
|
22
|
+
references: `"${entity.tableName}"("${entity.primaryColumn}")`,
|
|
23
|
+
onDelete: 'CASCADE',
|
|
24
|
+
},
|
|
25
|
+
[relation.joiningTable.inverseJoiningColumn.columnName]: {
|
|
26
|
+
type: getPrimaryColumnType(targetEntity),
|
|
27
|
+
notNull: true,
|
|
28
|
+
references: `"${targetEntity.tableName}"("${targetEntity.primaryColumn}")`,
|
|
29
|
+
onDelete: 'CASCADE',
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
constraints: {
|
|
34
|
+
primaryKey: primaryColumns,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
)
|
|
38
|
+
createEventTrigger(builder, relation.joiningTable.tableName, primaryColumns)
|
|
39
|
+
createEventTrxTrigger(builder, relation.joiningTable.tableName)
|
|
40
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { testMigrations } from '../../src/tests'
|
|
2
|
+
import { SQL } from '../../src/tags'
|
|
3
|
+
import { SchemaDefinition as def } from '@contember/schema-definition'
|
|
4
|
+
|
|
5
|
+
namespace ConvertOHMToMHMSchemaOrig {
|
|
6
|
+
export class Article {
|
|
7
|
+
title = def.stringColumn()
|
|
8
|
+
category = def.manyHasOne(Category, 'articles')
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class Category {
|
|
12
|
+
articles = def.oneHasMany(Article, 'category')
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
namespace ConvertOHMToMHMSchemaOrigUpdated {
|
|
17
|
+
export class Article {
|
|
18
|
+
title = def.stringColumn()
|
|
19
|
+
categories = def.manyHasMany(Category, 'articles')
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class Category {
|
|
23
|
+
articles = def.manyHasManyInverse(Article, 'categories')
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
testMigrations('convert one has many to many has many', {
|
|
29
|
+
originalSchema: def.createModel(ConvertOHMToMHMSchemaOrig),
|
|
30
|
+
updatedSchema: def.createModel(ConvertOHMToMHMSchemaOrigUpdated),
|
|
31
|
+
diff: [
|
|
32
|
+
{
|
|
33
|
+
modification: 'convertOneHasManyToManyHasManyRelation',
|
|
34
|
+
entityName: 'Article',
|
|
35
|
+
fieldName: 'category',
|
|
36
|
+
owningSide: {
|
|
37
|
+
type: 'ManyHasMany',
|
|
38
|
+
name: 'categories',
|
|
39
|
+
inversedBy: 'articles',
|
|
40
|
+
target: 'Category',
|
|
41
|
+
joiningTable: {
|
|
42
|
+
tableName: 'article_categories',
|
|
43
|
+
joiningColumn: {
|
|
44
|
+
columnName: 'article_id',
|
|
45
|
+
onDelete: 'cascade',
|
|
46
|
+
},
|
|
47
|
+
inverseJoiningColumn: {
|
|
48
|
+
columnName: 'category_id',
|
|
49
|
+
onDelete: 'cascade',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
inverseSide: {
|
|
54
|
+
name: 'articles',
|
|
55
|
+
ownedBy: 'categories',
|
|
56
|
+
target: 'Article',
|
|
57
|
+
type: 'ManyHasMany',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
sql: SQL`
|
|
62
|
+
CREATE TABLE "article_categories" (
|
|
63
|
+
"article_id" uuid NOT NULL REFERENCES "article"("id") ON DELETE CASCADE,
|
|
64
|
+
"category_id" uuid NOT NULL REFERENCES "category"("id") ON DELETE CASCADE, CONSTRAINT
|
|
65
|
+
"article_categories_pkey" PRIMARY KEY ("article_id", "category_id")
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
CREATE TRIGGER "log_event" AFTER INSERT OR UPDATE OR DELETE
|
|
69
|
+
ON "article_categories" FOR EACH ROW
|
|
70
|
+
EXECUTE PROCEDURE "system"."trigger_event"($pga$article_id$pga$, $pga$category_id$pga$);
|
|
71
|
+
|
|
72
|
+
CREATE CONSTRAINT TRIGGER "log_event_trx" AFTER INSERT OR UPDATE OR DELETE
|
|
73
|
+
ON "article_categories" DEFERRABLE INITIALLY DEFERRED FOR EACH ROW
|
|
74
|
+
EXECUTE PROCEDURE "system"."trigger_event_commit"();
|
|
75
|
+
|
|
76
|
+
INSERT INTO "article_categories" ( "article_id", "category_id" )
|
|
77
|
+
SELECT "id", "category_id" FROM "article" WHERE "category_id" IS NOT NULL;
|
|
78
|
+
|
|
79
|
+
ALTER TABLE "article" DROP "category_id";
|
|
80
|
+
`,
|
|
81
|
+
})
|