@mikro-orm/knex 6.6.2-dev.4 → 6.6.2-dev.6
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/AbstractSqlDriver.js
CHANGED
|
@@ -757,7 +757,7 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
|
|
|
757
757
|
}
|
|
758
758
|
const tableName = `${schema ?? '_'}.${pivotMeta.tableName}`;
|
|
759
759
|
const persister = groups[tableName] ??= new PivotCollectionPersister_1.PivotCollectionPersister(pivotMeta, this, options?.ctx, schema, options?.loggerContext);
|
|
760
|
-
persister.enqueueUpdate(coll.property, insertDiff, deleteDiff, pks);
|
|
760
|
+
persister.enqueueUpdate(coll.property, insertDiff, deleteDiff, pks, coll.isInitialized());
|
|
761
761
|
}
|
|
762
762
|
for (const persister of core_1.Utils.values(groups)) {
|
|
763
763
|
await this.rethrow(persister.execute());
|
|
@@ -6,14 +6,17 @@ export declare class PivotCollectionPersister<Entity extends object> {
|
|
|
6
6
|
private readonly ctx?;
|
|
7
7
|
private readonly schema?;
|
|
8
8
|
private readonly loggerContext?;
|
|
9
|
-
private readonly platform;
|
|
10
9
|
private readonly inserts;
|
|
10
|
+
private readonly upserts;
|
|
11
11
|
private readonly deletes;
|
|
12
12
|
private readonly batchSize;
|
|
13
13
|
private order;
|
|
14
14
|
constructor(meta: EntityMetadata<Entity>, driver: AbstractSqlDriver, ctx?: Transaction | undefined, schema?: string | undefined, loggerContext?: Dictionary | undefined);
|
|
15
|
-
enqueueUpdate(prop: EntityProperty<Entity>, insertDiff: Primary<Entity>[][], deleteDiff: Primary<Entity>[][] | boolean, pks: Primary<Entity>[]): void;
|
|
15
|
+
enqueueUpdate(prop: EntityProperty<Entity>, insertDiff: Primary<Entity>[][], deleteDiff: Primary<Entity>[][] | boolean, pks: Primary<Entity>[], isInitialized?: boolean): void;
|
|
16
16
|
private enqueueInsert;
|
|
17
|
+
private enqueueUpsert;
|
|
18
|
+
private createInsertStatement;
|
|
17
19
|
private enqueueDelete;
|
|
20
|
+
private collectStatements;
|
|
18
21
|
execute(): Promise<void>;
|
|
19
22
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PivotCollectionPersister = void 0;
|
|
4
|
-
const core_1 = require("@mikro-orm/core");
|
|
5
4
|
class InsertStatement {
|
|
6
5
|
keys;
|
|
7
6
|
data;
|
|
@@ -42,8 +41,8 @@ class PivotCollectionPersister {
|
|
|
42
41
|
ctx;
|
|
43
42
|
schema;
|
|
44
43
|
loggerContext;
|
|
45
|
-
platform;
|
|
46
44
|
inserts = new Map();
|
|
45
|
+
upserts = new Map();
|
|
47
46
|
deletes = new Map();
|
|
48
47
|
batchSize;
|
|
49
48
|
order = 0;
|
|
@@ -53,12 +52,16 @@ class PivotCollectionPersister {
|
|
|
53
52
|
this.ctx = ctx;
|
|
54
53
|
this.schema = schema;
|
|
55
54
|
this.loggerContext = loggerContext;
|
|
56
|
-
this.platform = this.driver.getPlatform();
|
|
57
55
|
this.batchSize = this.driver.config.get('batchSize');
|
|
58
56
|
}
|
|
59
|
-
enqueueUpdate(prop, insertDiff, deleteDiff, pks) {
|
|
57
|
+
enqueueUpdate(prop, insertDiff, deleteDiff, pks, isInitialized = true) {
|
|
60
58
|
if (insertDiff.length) {
|
|
61
|
-
|
|
59
|
+
if (isInitialized) {
|
|
60
|
+
this.enqueueInsert(prop, insertDiff, pks);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this.enqueueUpsert(prop, insertDiff, pks);
|
|
64
|
+
}
|
|
62
65
|
}
|
|
63
66
|
if (deleteDiff === true || (Array.isArray(deleteDiff) && deleteDiff.length)) {
|
|
64
67
|
this.enqueueDelete(prop, deleteDiff, pks);
|
|
@@ -66,17 +69,29 @@ class PivotCollectionPersister {
|
|
|
66
69
|
}
|
|
67
70
|
enqueueInsert(prop, insertDiff, pks) {
|
|
68
71
|
for (const fks of insertDiff) {
|
|
69
|
-
const
|
|
70
|
-
const keys = prop.owner
|
|
71
|
-
? [...prop.inverseJoinColumns, ...prop.joinColumns]
|
|
72
|
-
: [...prop.joinColumns, ...prop.inverseJoinColumns];
|
|
73
|
-
const statement = new InsertStatement(keys, data, this.order++);
|
|
72
|
+
const statement = this.createInsertStatement(prop, fks, pks);
|
|
74
73
|
const hash = statement.getHash();
|
|
75
74
|
if (prop.owner || !this.inserts.has(hash)) {
|
|
76
75
|
this.inserts.set(hash, statement);
|
|
77
76
|
}
|
|
78
77
|
}
|
|
79
78
|
}
|
|
79
|
+
enqueueUpsert(prop, insertDiff, pks) {
|
|
80
|
+
for (const fks of insertDiff) {
|
|
81
|
+
const statement = this.createInsertStatement(prop, fks, pks);
|
|
82
|
+
const hash = statement.getHash();
|
|
83
|
+
if (prop.owner || !this.upserts.has(hash)) {
|
|
84
|
+
this.upserts.set(hash, statement);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
createInsertStatement(prop, fks, pks) {
|
|
89
|
+
const data = prop.owner ? [...fks, ...pks] : [...pks, ...fks];
|
|
90
|
+
const keys = prop.owner
|
|
91
|
+
? [...prop.inverseJoinColumns, ...prop.joinColumns]
|
|
92
|
+
: [...prop.joinColumns, ...prop.inverseJoinColumns];
|
|
93
|
+
return new InsertStatement(keys, data, this.order++);
|
|
94
|
+
}
|
|
80
95
|
enqueueDelete(prop, deleteDiff, pks) {
|
|
81
96
|
if (deleteDiff === true) {
|
|
82
97
|
const statement = new DeleteStatement(prop.joinColumns, pks);
|
|
@@ -92,6 +107,13 @@ class PivotCollectionPersister {
|
|
|
92
107
|
this.deletes.set(statement.getHash(), statement);
|
|
93
108
|
}
|
|
94
109
|
}
|
|
110
|
+
collectStatements(statements) {
|
|
111
|
+
const items = [];
|
|
112
|
+
for (const statement of statements.values()) {
|
|
113
|
+
items[statement.order] = statement.getData();
|
|
114
|
+
}
|
|
115
|
+
return items.filter(Boolean);
|
|
116
|
+
}
|
|
95
117
|
async execute() {
|
|
96
118
|
if (this.deletes.size > 0) {
|
|
97
119
|
const deletes = [...this.deletes.values()];
|
|
@@ -108,18 +130,10 @@ class PivotCollectionPersister {
|
|
|
108
130
|
});
|
|
109
131
|
}
|
|
110
132
|
}
|
|
111
|
-
if (this.inserts.size
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
for (const insert of this.inserts.values()) {
|
|
116
|
-
items[insert.order] = insert.getData();
|
|
117
|
-
}
|
|
118
|
-
items = items.filter(i => i);
|
|
119
|
-
/* istanbul ignore else */
|
|
120
|
-
if (this.platform.allowsMultiInsert()) {
|
|
121
|
-
for (let i = 0; i < items.length; i += this.batchSize) {
|
|
122
|
-
const chunk = items.slice(i, i + this.batchSize);
|
|
133
|
+
if (this.inserts.size > 0) {
|
|
134
|
+
const filtered = this.collectStatements(this.inserts);
|
|
135
|
+
for (let i = 0; i < filtered.length; i += this.batchSize) {
|
|
136
|
+
const chunk = filtered.slice(i, i + this.batchSize);
|
|
123
137
|
await this.driver.nativeInsertMany(this.meta.className, chunk, {
|
|
124
138
|
ctx: this.ctx,
|
|
125
139
|
schema: this.schema,
|
|
@@ -129,13 +143,20 @@ class PivotCollectionPersister {
|
|
|
129
143
|
});
|
|
130
144
|
}
|
|
131
145
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
.
|
|
138
|
-
|
|
146
|
+
if (this.upserts.size > 0) {
|
|
147
|
+
const filtered = this.collectStatements(this.upserts);
|
|
148
|
+
for (let i = 0; i < filtered.length; i += this.batchSize) {
|
|
149
|
+
const chunk = filtered.slice(i, i + this.batchSize);
|
|
150
|
+
await this.driver.nativeUpdateMany(this.meta.className, [], chunk, {
|
|
151
|
+
ctx: this.ctx,
|
|
152
|
+
schema: this.schema,
|
|
153
|
+
convertCustomTypes: false,
|
|
154
|
+
processCollections: false,
|
|
155
|
+
upsert: true,
|
|
156
|
+
onConflictAction: 'ignore',
|
|
157
|
+
loggerContext: this.loggerContext,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
139
160
|
}
|
|
140
161
|
}
|
|
141
162
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mikro-orm/knex",
|
|
3
|
-
"version": "6.6.2-dev.
|
|
3
|
+
"version": "6.6.2-dev.6",
|
|
4
4
|
"description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"module": "index.mjs",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"@mikro-orm/core": "^6.6.1"
|
|
67
67
|
},
|
|
68
68
|
"peerDependencies": {
|
|
69
|
-
"@mikro-orm/core": "6.6.2-dev.
|
|
69
|
+
"@mikro-orm/core": "6.6.2-dev.6",
|
|
70
70
|
"better-sqlite3": "*",
|
|
71
71
|
"libsql": "*",
|
|
72
72
|
"mariadb": "*"
|