From bc0bf894cd175ab6610162323bda8698b42e54f0 Mon Sep 17 00:00:00 2001 From: Ben Senescu <44480372+bensenescu@users.noreply.github.com> Date: Thu, 16 Apr 2026 12:21:08 -0400 Subject: [PATCH] fix: avoid D1 param limit in getEarliestSnapshotsForKeywords (#121) --- .../rank-tracking/repositories/snapshotQueries.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/server/features/rank-tracking/repositories/snapshotQueries.ts b/src/server/features/rank-tracking/repositories/snapshotQueries.ts index 9d83cdc..33b9b7b 100644 --- a/src/server/features/rank-tracking/repositories/snapshotQueries.ts +++ b/src/server/features/rank-tracking/repositories/snapshotQueries.ts @@ -92,7 +92,9 @@ export async function getEarliestSnapshotsForKeywords( ), ); - const CHUNK_SIZE = 900; + // D1 caps bound parameters at 100 per statement. The query binds N keyword + // IDs plus 4 params from the completedRunIds subquery (referenced twice). + const CHUNK_SIZE = 90; const allResults: Awaited> = []; for (let i = 0; i < keywordIds.length; i += CHUNK_SIZE) { @@ -135,12 +137,7 @@ export async function getEarliestSnapshotsForKeywords( eq(rankSnapshots.checkedAt, grouped.targetCheckedAt), ), ) - .where( - and( - inArray(rankSnapshots.runId, completedRunIds), - inArray(rankSnapshots.trackingKeywordId, chunk), - ), - ); + .where(inArray(rankSnapshots.runId, completedRunIds)); allResults.push(...rows); }