From dfb5ceb9264313b51083b53076b84d037df2f82a Mon Sep 17 00:00:00 2001 From: AI Assistant Date: Sat, 28 Mar 2026 10:17:57 +0200 Subject: [PATCH] fix(parcel-sync): batch deleteMany to avoid PostgreSQL 32767 bind variable limit Cluj-Napoca sync failed with 62,307 removed features exceeding the limit. Batch deletions in chunks of 30,000 in both sync-service and no-geom-sync. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../parcel-sync/services/no-geom-sync.ts | 9 ++++++--- .../parcel-sync/services/sync-service.ts | 19 +++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/modules/parcel-sync/services/no-geom-sync.ts b/src/modules/parcel-sync/services/no-geom-sync.ts index 37020af..0270303 100644 --- a/src/modules/parcel-sync/services/no-geom-sync.ts +++ b/src/modules/parcel-sync/services/no-geom-sync.ts @@ -537,9 +537,12 @@ export async function syncNoGeometryParcels( } if (staleIds.length > 0) { - await prisma.gisFeature.deleteMany({ - where: { id: { in: staleIds } }, - }); + const BATCH = 30_000; + for (let i = 0; i < staleIds.length; i += BATCH) { + await prisma.gisFeature.deleteMany({ + where: { id: { in: staleIds.slice(i, i + BATCH) } }, + }); + } console.log( `[no-geom-sync] Cleanup: removed ${staleIds.length} stale/invalid no-geom records`, ); diff --git a/src/modules/parcel-sync/services/sync-service.ts b/src/modules/parcel-sync/services/sync-service.ts index c81bd66..f627749 100644 --- a/src/modules/parcel-sync/services/sync-service.ts +++ b/src/modules/parcel-sync/services/sync-service.ts @@ -318,16 +318,19 @@ export async function syncLayer( // PostGIS not available yet — not critical, skip silently } - // Mark removed features + // Mark removed features (batch to avoid PostgreSQL 32767 bind variable limit) if (removedObjIds.length > 0) { push({ phase: "Marcare șterse" }); - await prisma.gisFeature.deleteMany({ - where: { - layerId, - siruta, - objectId: { in: removedObjIds }, - }, - }); + const BATCH = 30_000; + for (let i = 0; i < removedObjIds.length; i += BATCH) { + await prisma.gisFeature.deleteMany({ + where: { + layerId, + siruta, + objectId: { in: removedObjIds.slice(i, i + BATCH) }, + }, + }); + } } // Update sync run