From ed55d17a3653ce87a585c4d5d20d5e098d97697c Mon Sep 17 00:00:00 2001 From: Pedro Guzman Date: Fri, 2 May 2025 08:36:33 +0200 Subject: [PATCH] fix: batch updates in upsertMany_ (#12333) --- .../src/dal/mikro-orm/mikro-orm-repository.ts | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/packages/core/utils/src/dal/mikro-orm/mikro-orm-repository.ts b/packages/core/utils/src/dal/mikro-orm/mikro-orm-repository.ts index aed2610c7c..8e67f7da73 100644 --- a/packages/core/utils/src/dal/mikro-orm/mikro-orm-repository.ts +++ b/packages/core/utils/src/dal/mikro-orm/mikro-orm-repository.ts @@ -967,28 +967,24 @@ export function mikroOrmBaseRepositoryFactory( } const promises: Promise[] = [] - const toInsert: unknown[] = [] - let shouldInsert = false + const toInsert: any[] = [] + const toUpdate: any[] = [] - entries.map(async (data) => { + entries.forEach((data) => { const existingEntity = existingEntitiesMap.get(data.id) orderedEntities.push(data) if (existingEntity) { if (skipUpdate) { return } - const update = manager.nativeUpdate(entityName, { id: data.id }, data) - promises.push(update) - performedActions.updated[entityName] ??= [] - performedActions.updated[entityName].push({ id: data.id }) + toUpdate.push(data) } else { - shouldInsert = true toInsert.push(data) } }) - if (shouldInsert) { + if (toInsert.length > 0) { let insertQb = manager.qb(entityName).insert(toInsert).returning("id") if (skipUpdate) { @@ -1005,6 +1001,26 @@ export function mikroOrmBaseRepositoryFactory( ) } + if (toUpdate.length > 0) { + promises.push( + manager + .getDriver() + .nativeUpdateMany( + entityName, + toUpdate.map((d) => ({ id: d.id })), + toUpdate, + { ctx: manager.getTransactionContext() } + ) + .then((res) => { + performedActions.updated[entityName] ??= [] + const updatedRows = res.rows ?? [] + performedActions.updated[entityName].push( + ...updatedRows.map((d) => ({ id: d.id })) + ) + }) + ) + } + await promiseAll(promises) return { orderedEntities, performedActions }