@mikro-orm/knex 6.6.2-dev.5 → 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.
@@ -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
- this.enqueueInsert(prop, insertDiff, pks);
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 data = prop.owner ? [...fks, ...pks] : [...pks, ...fks];
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 === 0) {
112
- return;
113
- }
114
- let items = [];
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
- else {
133
- await core_1.Utils.runSerial(items, item => {
134
- return this.driver.createQueryBuilder(this.meta.className, this.ctx, 'write', false, this.loggerContext)
135
- .withSchema(this.schema)
136
- .insert(item)
137
- .execute('run', false);
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.5",
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.5",
69
+ "@mikro-orm/core": "6.6.2-dev.6",
70
70
  "better-sqlite3": "*",
71
71
  "libsql": "*",
72
72
  "mariadb": "*"