@strapi/database 4.12.0-beta.5 → 4.12.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.
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const { map, isEmpty } = require('lodash/fp');
4
3
  const { randomBytes } = require('crypto');
4
+ const { map, isEmpty } = require('lodash/fp');
5
5
 
6
6
  const {
7
7
  isBidirectional,
@@ -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
-
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
209
 
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/lib/index.d.ts CHANGED
@@ -14,6 +14,7 @@ type LogicalOperators<T> = {
14
14
  type AttributeOperators<T, K extends keyof T> = {
15
15
  $eq?: T[K] | Array<T[K]>;
16
16
  $ne?: T[K] | Array<T[K]>;
17
+ $nei?: T[K] | Array<T[K]>;
17
18
  $in?: T[K][];
18
19
  $notIn?: T[K][];
19
20
  $lt?: T[K];
@@ -204,6 +204,14 @@ const applyOperator = (qb, column, operator, value) => {
204
204
  qb.where(column, '<>', value);
205
205
  break;
206
206
  }
207
+ case '$nei': {
208
+ if (value === null) {
209
+ qb.whereNotNull(column);
210
+ break;
211
+ }
212
+ qb.whereRaw(`${fieldLowerFn(qb)} NOT LIKE LOWER(?)`, [column, `${value}`]);
213
+ break;
214
+ }
207
215
  case '$gt': {
208
216
  qb.where(column, '>', value);
209
217
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/database",
3
- "version": "4.12.0-beta.5",
3
+ "version": "4.12.1",
4
4
  "description": "Strapi's database layer",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -33,18 +33,18 @@
33
33
  "lint": "run -T eslint ."
34
34
  },
35
35
  "dependencies": {
36
- "@strapi/utils": "4.12.0-beta.5",
36
+ "@strapi/utils": "4.12.1",
37
37
  "date-fns": "2.30.0",
38
38
  "debug": "4.3.4",
39
39
  "fs-extra": "10.0.0",
40
40
  "knex": "2.5.0",
41
41
  "lodash": "4.17.21",
42
- "semver": "7.5.2",
42
+ "semver": "7.5.4",
43
43
  "umzug": "3.2.1"
44
44
  },
45
45
  "engines": {
46
- "node": ">=14.19.1 <=18.x.x",
46
+ "node": ">=16.0.0 <=20.x.x",
47
47
  "npm": ">=6.0.0"
48
48
  },
49
- "gitHead": "690c85458416da815f0e944fa8fc6dbe0fb2d001"
49
+ "gitHead": "be8985fa20cb357981bca97bc65ee5c1b843f801"
50
50
  }