From 9731bb6f07ce31b6f17d35f4ade1a95980708c96 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sun, 27 Apr 2025 23:27:02 +0100 Subject: [PATCH] perf: reduce queries when numbering issues --- packages/web/server/api/repos.get.ts | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/packages/web/server/api/repos.get.ts b/packages/web/server/api/repos.get.ts index 177a4b4..a43b145 100644 --- a/packages/web/server/api/repos.get.ts +++ b/packages/web/server/api/repos.get.ts @@ -1,14 +1,28 @@ -import { count, eq } from 'drizzle-orm' +import { count } from 'drizzle-orm' import { defineCachedCorsEventHandler } from '~~/server/utils/cached-cors' export default defineCachedCorsEventHandler(async () => { const drizzle = useDrizzle() - const repos = await drizzle.select().from(tables.repos).all() + const [repos, issueCounts] = await Promise.all([ + drizzle.select().from(tables.repos).all(), + drizzle + .select({ + repoId: tables.issues.repoId, + count: count(), + }) + .from(tables.issues) + .groupBy(tables.issues.repoId) + .all(), + ]) - return Promise.all(repos.map(async repo => ({ + const issueCountMap = new Map( + issueCounts.map(item => [item.repoId, item.count]), + ) + + return repos.map(repo => ({ repo: repo.full_name, - issuesIndexed: await drizzle.select({ count: count() }).from(tables.issues).where(eq(tables.issues.repoId, repo.id)).then(([r]) => r!.count), + issuesIndexed: issueCountMap.get(repo.id) || 0, indexed: repo.indexed === currentIndexVersion, - }))) + })) }, { swr: true, shouldBypassCache: () => !!import.meta.dev }) -- 2.54.0