diff --git a/packages/core/database/lib/entity-manager/index.js b/packages/core/database/lib/entity-manager/index.js index 7239f4a7a0..a9b153edc6 100644 --- a/packages/core/database/lib/entity-manager/index.js +++ b/packages/core/database/lib/entity-manager/index.js @@ -511,11 +511,7 @@ const createEntityManager = (db) => { for (const relToDelete of currentRelsToDelete) { if (relToDelete[orderColumnName] !== null) { await this.createQueryBuilder(joinTable.name) - .update({ - [orderColumnName]: db - .getConnection() - .raw('?? - 1', relToDelete[orderColumnName]), - }) + .decrement(orderColumnName, 1) .where({ [joinColumn.name]: relToDelete[joinColumn.name], [orderColumnName]: { $gt: relToDelete[orderColumnName] }, @@ -766,11 +762,7 @@ const createEntityManager = (db) => { for (const relToDelete of relsToDelete) { if (relToDelete[inverseOrderColumnName] !== null) { const updatePromise = this.createQueryBuilder(joinTable.name) - .update({ - [inverseOrderColumnName]: db - .getConnection() - .raw('?? - 1', relToDelete[inverseOrderColumnName]), - }) + .decrement(inverseOrderColumnName, 1) .where({ [inverseJoinColumn.name]: relToDelete[inverseJoinColumn.name], [inverseOrderColumnName]: { $gt: relToDelete[inverseOrderColumnName] }, @@ -831,11 +823,7 @@ const createEntityManager = (db) => { for (const relToDelete of relsToDelete) { if (relToDelete[orderColumnName] !== null) { await this.createQueryBuilder(joinTable.name) - .update({ - [orderColumnName]: db - .getConnection() - .raw('?? - 1', relToDelete[orderColumnName]), - }) + .decrement(orderColumnName, 1) .where({ [joinColumn.name]: id, [orderColumnName]: { $gt: relToDelete[orderColumnName] }, @@ -852,11 +840,7 @@ const createEntityManager = (db) => { for (const relToDelete of relsToDelete) { if (relToDelete[inverseOrderColumnName] !== null) { const updatePromise = this.createQueryBuilder(joinTable.name) - .update({ - [inverseOrderColumnName]: db - .getConnection() - .raw('?? - 1', relToDelete[inverseOrderColumnName]), - }) + .decrement(inverseOrderColumnName, 1) .where({ [inverseJoinColumn.name]: relToDelete[inverseJoinColumn.name], [inverseOrderColumnName]: { $gt: relToDelete[inverseOrderColumnName] }, @@ -911,11 +895,7 @@ const createEntityManager = (db) => { const currentOrderIsNull = currentRel[orderColumnName] === null; if (!currentOrderIsNull) { await this.createQueryBuilder(joinTable.name) - .update({ - [orderColumnName]: db - .getConnection() - .raw('?? - 1', currentRel[orderColumnName]), - }) + .decrement(orderColumnName, 1) .where({ [joinColumn.name]: id, [orderColumnName]: { $gt: currentRel[orderColumnName] }, @@ -1001,11 +981,7 @@ const createEntityManager = (db) => { for (const relToDelete of relsToDelete) { if (relToDelete[orderColumnName] !== null) { await this.createQueryBuilder(joinTable.name) - .update({ - [orderColumnName]: db - .getConnection() - .raw('?? - 1', relToDelete[orderColumnName]), - }) + .decrement(orderColumnName, 1) .where({ [joinColumn.name]: id, [orderColumnName]: { $gt: relToDelete[orderColumnName] }, @@ -1023,11 +999,7 @@ const createEntityManager = (db) => { for (const relToDelete of relsToDelete) { if (relToDelete[inverseOrderColumnName] !== null) { const updatePromise = this.createQueryBuilder(joinTable.name) - .update({ - [inverseOrderColumnName]: db - .getConnection() - .raw('?? - 1', relToDelete[inverseOrderColumnName]), - }) + .decrement(inverseOrderColumnName, 1) .where({ [inverseJoinColumn.name]: relToDelete[inverseJoinColumn.name], [inverseOrderColumnName]: { $gt: relToDelete[inverseOrderColumnName] }, @@ -1123,11 +1095,7 @@ const createEntityManager = (db) => { for (const relToDelete of currentRelsToDelete) { if (relToDelete[orderColumnName] !== null) { await this.createQueryBuilder(joinTable.name) - .update({ - [orderColumnName]: db - .getConnection() - .raw('?? - 1', relToDelete[orderColumnName]), - }) + .decrement(orderColumnName, 1) .where({ [joinColumn.name]: relToDelete[joinColumn.name], [orderColumnName]: { $gt: relToDelete[orderColumnName] }, @@ -1289,11 +1257,7 @@ const createEntityManager = (db) => { for (const relToDelete of relsToDelete) { if (relToDelete[inverseOrderColumnName] !== null) { const updatePromise = this.createQueryBuilder(joinTable.name) - .update({ - [inverseOrderColumnName]: db - .getConnection() - .raw('?? - 1', relToDelete[inverseOrderColumnName]), - }) + .decrement(inverseOrderColumnName, 1) .where({ [inverseJoinColumn.name]: relToDelete[inverseJoinColumn.name], [inverseOrderColumnName]: { $gt: relToDelete[inverseOrderColumnName] }, diff --git a/packages/core/database/lib/query/query-builder.js b/packages/core/database/lib/query/query-builder.js index ff2e1399dd..f9aea4e312 100644 --- a/packages/core/database/lib/query/query-builder.js +++ b/packages/core/database/lib/query/query-builder.js @@ -25,6 +25,8 @@ const createQueryBuilder = (uid, db, initialState = {}) => { forUpdate: false, orderBy: [], groupBy: [], + increments: [], + decrements: [], aliasCounter: 0, }, initialState @@ -84,6 +86,20 @@ const createQueryBuilder = (uid, db, initialState = {}) => { return this; }, + increment(column, amount = 1) { + state.type = 'update'; + state.increments.push({ column, amount }); + + return this; + }, + + decrement(column, amount = 1) { + state.type = 'update'; + state.decrements.push({ column, amount }); + + return this; + }, + count(count = 'id') { state.type = 'count'; state.count = count; @@ -349,7 +365,9 @@ const createQueryBuilder = (uid, db, initialState = {}) => { break; } case 'update': { - qb.update(state.data); + if (state.data) { + qb.update(state.data); + } break; } case 'delete': { @@ -374,6 +392,14 @@ const createQueryBuilder = (uid, db, initialState = {}) => { qb.forUpdate(); } + if (!_.isEmpty(state.increments)) { + state.increments.forEach((incr) => qb.increment(incr.column, incr.amount)); + } + + if (!_.isEmpty(state.decrements)) { + state.decrements.forEach((decr) => qb.decrement(decr.column, decr.amount)); + } + if (state.limit) { qb.limit(state.limit); }