@strapi/database 4.12.0-beta.4 → 4.12.0

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.
@@ -206,98 +206,114 @@ const cleanOrderColumns = async ({ id, attribute, db, inverseRelIds, transaction
206
206
 
207
207
  const { joinTable } = attribute;
208
208
  const { joinColumn, inverseJoinColumn, orderColumnName, inverseOrderColumnName } = joinTable;
209
- const update = [];
210
- const updateBinding = [];
211
- const select = ['??'];
212
- const selectBinding = ['id'];
213
- const where = [];
214
- const whereBinding = [];
215
209
 
216
- if (hasOrderColumn(attribute) && id) {
217
- update.push('?? = b.src_order');
218
- updateBinding.push(orderColumnName);
219
- select.push('ROW_NUMBER() OVER (PARTITION BY ?? ORDER BY ??) AS src_order');
220
- selectBinding.push(joinColumn.name, orderColumnName);
221
- where.push('?? = ?');
222
- whereBinding.push(joinColumn.name, id);
223
- }
224
-
225
- if (hasInverseOrderColumn(attribute) && !isEmpty(inverseRelIds)) {
226
- update.push('?? = b.inv_order');
227
- updateBinding.push(inverseOrderColumnName);
228
- select.push('ROW_NUMBER() OVER (PARTITION BY ?? ORDER BY ??) AS inv_order');
229
- selectBinding.push(inverseJoinColumn.name, inverseOrderColumnName);
230
- where.push(`?? IN (${inverseRelIds.map(() => '?').join(', ')})`);
231
- whereBinding.push(inverseJoinColumn.name, ...inverseRelIds);
232
- }
233
-
234
- switch (strapi.db.dialect.client) {
235
- case 'mysql':
236
- // Here it's MariaDB and MySQL 8
237
- await db
238
- .getConnection()
239
- .raw(
240
- `UPDATE
241
- ?? as a,
242
- (
243
- SELECT ${select.join(', ')}
244
- FROM ??
245
- WHERE ${where.join(' OR ')}
246
- ) AS b
247
- SET ${update.join(', ')}
248
- WHERE b.id = a.id`,
249
- [joinTable.name, ...selectBinding, joinTable.name, ...whereBinding, ...updateBinding]
250
- )
251
- .transacting(trx);
252
- break;
253
- /*
254
- UPDATE
255
- :joinTable: as a,
256
- (
257
- SELECT
258
- id,
259
- ROW_NUMBER() OVER ( PARTITION BY :joinColumn: ORDER BY :orderColumn:) AS src_order,
260
- ROW_NUMBER() OVER ( PARTITION BY :inverseJoinColumn: ORDER BY :inverseOrderColumn:) AS inv_order
261
- FROM :joinTable:
262
- WHERE :joinColumn: = :id OR :inverseJoinColumn: IN (:inverseRelIds)
263
- ) AS b
264
- SET :orderColumn: = b.src_order, :inverseOrderColumn: = b.inv_order
265
- WHERE b.id = a.id;
266
- */
267
- default: {
268
- const joinTableName = addSchema(joinTable.name);
269
-
270
- // raw query as knex doesn't allow updating from a subquery
271
- // https://github.com/knex/knex/issues/2504
272
- await db.connection
273
- .raw(
274
- `UPDATE ?? as a
275
- SET ${update.join(', ')}
276
- FROM (
277
- SELECT ${select.join(', ')}
278
- FROM ??
279
- WHERE ${where.join(' OR ')}
280
- ) AS b
281
- WHERE b.id = a.id`,
282
- [joinTableName, ...updateBinding, ...selectBinding, joinTableName, ...whereBinding]
283
- )
284
- .transacting(trx);
285
-
286
- /*
287
- UPDATE :joinTable: as a
288
- SET :orderColumn: = b.src_order, :inverseOrderColumn: = b.inv_order
289
- FROM (
290
- SELECT
291
- id,
292
- ROW_NUMBER() OVER ( PARTITION BY :joinColumn: ORDER BY :orderColumn:) AS src_order,
293
- ROW_NUMBER() OVER ( PARTITION BY :inverseJoinColumn: ORDER BY :inverseOrderColumn:) AS inv_order
294
- FROM :joinTable:
295
- WHERE :joinColumn: = :id OR :inverseJoinColumn: IN (:inverseRelIds)
296
- ) AS b
297
- WHERE b.id = a.id;
298
- */
210
+ /**
211
+ UPDATE :joinTable: as a,
212
+ (
213
+ SELECT
214
+ id,
215
+ ROW_NUMBER() OVER ( PARTITION BY :joinColumn: ORDER BY :orderColumn:) AS src_order,
216
+ FROM :joinTable:
217
+ WHERE :joinColumn: = :id
218
+ ) AS b
219
+ SET :orderColumn: = b.src_order
220
+ WHERE b.id = a.id;
221
+ */
222
+ const updateOrderColumn = async () => {
223
+ if (!hasOrderColumn(attribute) || !id) return;
224
+
225
+ const select = db
226
+ .connection(joinTable.name)
227
+ .select('id')
228
+ .rowNumber('src_order', orderColumnName, joinColumn.name)
229
+ .where(joinColumn.name, id)
230
+ .toSQL();
231
+
232
+ switch (strapi.db.dialect.client) {
233
+ case 'mysql':
234
+ // Here it's MariaDB and MySQL 8
235
+ await db
236
+ .getConnection()
237
+ .raw(
238
+ `UPDATE ?? as a, ( ${select.sql} ) AS b
239
+ SET ?? = b.src_order
240
+ WHERE b.id = a.id`,
241
+ [joinTable.name, ...select.bindings, orderColumnName]
242
+ )
243
+ .transacting(trx);
244
+
245
+ break;
246
+
247
+ default: {
248
+ const joinTableName = addSchema(joinTable.name);
249
+
250
+ // raw query as knex doesn't allow updating from a subquery
251
+ await db.connection
252
+ .raw(
253
+ `UPDATE ?? as a
254
+ SET ?? = b.src_order
255
+ FROM ( ${select.sql} ) AS b
256
+ WHERE b.id = a.id`,
257
+ [joinTableName, orderColumnName, ...select.bindings]
258
+ )
259
+ .transacting(trx);
260
+ }
299
261
  }
300
- }
262
+ };
263
+
264
+ /**
265
+ UPDATE :joinTable: as a,
266
+ (
267
+ SELECT
268
+ id,
269
+ ROW_NUMBER() OVER ( PARTITION BY :inverseJoinColumn: ORDER BY :inverseOrderColumn:) AS inv_order
270
+ FROM :joinTable:
271
+ WHERE :inverseJoinColumn: IN (:inverseRelIds)
272
+ ) AS b
273
+ SET :inverseOrderColumn: = b.inv_order
274
+ WHERE b.id = a.id;
275
+ */
276
+ const updateInverseOrderColumn = async () => {
277
+ if (!hasInverseOrderColumn(attribute) || isEmpty(inverseRelIds)) return;
278
+ const select = db
279
+ .connection(joinTable.name)
280
+ .select('id')
281
+ .rowNumber('inv_order', inverseOrderColumnName, inverseJoinColumn.name)
282
+ .where(inverseJoinColumn.name, 'in', inverseRelIds)
283
+ .toSQL();
284
+
285
+ switch (strapi.db.dialect.client) {
286
+ case 'mysql':
287
+ // Here it's MariaDB and MySQL 8
288
+ await db
289
+ .getConnection()
290
+ .raw(
291
+ `UPDATE ?? as a, ( ${select.sql} ) AS b
292
+ SET ?? = b.inv_order
293
+ WHERE b.id = a.id`,
294
+ [joinTable.name, ...select.bindings, inverseOrderColumnName]
295
+ )
296
+ .transacting(trx);
297
+ break;
298
+
299
+ default: {
300
+ const joinTableName = addSchema(joinTable.name);
301
+
302
+ // raw query as knex doesn't allow updating from a subquery
303
+ await db.connection
304
+ .raw(
305
+ `UPDATE ?? as a
306
+ SET ?? = b.inv_order
307
+ FROM ( ${select.sql} ) AS b
308
+ WHERE b.id = a.id`,
309
+ [joinTableName, inverseOrderColumnName, ...select.bindings]
310
+ )
311
+ .transacting(trx);
312
+ }
313
+ }
314
+ };
315
+
316
+ return Promise.all([updateOrderColumn(), updateInverseOrderColumn()]);
301
317
  };
302
318
 
303
319
  /*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/database",
3
- "version": "4.12.0-beta.4",
3
+ "version": "4.12.0",
4
4
  "description": "Strapi's database layer",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -33,7 +33,7 @@
33
33
  "lint": "run -T eslint ."
34
34
  },
35
35
  "dependencies": {
36
- "@strapi/utils": "4.12.0-beta.4",
36
+ "@strapi/utils": "4.12.0",
37
37
  "date-fns": "2.30.0",
38
38
  "debug": "4.3.4",
39
39
  "fs-extra": "10.0.0",
@@ -46,5 +46,5 @@
46
46
  "node": ">=14.19.1 <=18.x.x",
47
47
  "npm": ">=6.0.0"
48
48
  },
49
- "gitHead": "edcf86b496a7bee5189cdbfeb16f5a5c0abccc81"
49
+ "gitHead": "7f8109a1a736c1d997fbb445469b3b59550c7aeb"
50
50
  }