From 1445dee93321b9c0d75d2f4c1ef80437d4bdf886 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 25 Apr 2024 22:20:56 +0800 Subject: [PATCH] batching labels --- Makefile | 12 ++++++++ packages/api/package.json | 2 +- .../api/src/resolvers/function_resolvers.ts | 8 ++--- packages/api/src/services/labels.ts | 30 +++++++++++-------- yarn.lock | 7 ++++- 5 files changed, 41 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 1688ff4af..aec0605b2 100644 --- a/Makefile +++ b/Makefile @@ -20,3 +20,15 @@ webview_gen: yarn workspace @omnivore/appreader build cp packages/appreader/build/bundle.js apple/OmnivoreKit/Sources/Views/Resources/bundle.js cp packages/appreader/build/bundle.js android/Omnivore/app/src/main/assets/bundle.js + +api: + yarn workspace @omnivore/api dev + +web: + yarn workspace @omnivore/web dev + +qp: + yarn workspace @omnivore/api dev_qp + +content: + yarn workspace @omnivore/content_fetch start diff --git a/packages/api/package.json b/packages/api/package.json index cea023808..554e99f45 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -56,7 +56,7 @@ "cookie-parser": "^1.4.5", "cors": "^2.8.5", "csv-stringify": "^6.4.0", - "dataloader": "^2.0.0", + "dataloader": "^2.2.2", "diff-match-patch": "^1.0.5", "dompurify": "^2.0.17", "dot-case": "^3.0.4", diff --git a/packages/api/src/resolvers/function_resolvers.ts b/packages/api/src/resolvers/function_resolvers.ts index d65d054c8..a3a0d7f2a 100644 --- a/packages/api/src/resolvers/function_resolvers.ts +++ b/packages/api/src/resolvers/function_resolvers.ts @@ -25,7 +25,7 @@ import { import { getAISummary } from '../services/ai-summaries' import { findUserFeatures } from '../services/features' import { findHighlightsByLibraryItemId } from '../services/highlights' -import { findLabelsByLibraryItemId } from '../services/labels' +import { labelsLoader } from '../services/labels' import { findRecommendationsByLibraryItemId } from '../services/recommendation' import { findUploadFileById } from '../services/upload_file' import { @@ -439,7 +439,7 @@ export const functionResolvers = { ) { if (article.labels) return article.labels - return findLabelsByLibraryItemId(article.id, ctx.uid) + return labelsLoader.load(article.id) }, ...readingProgressHandlers, }, @@ -505,13 +505,13 @@ export const functionResolvers = { return item.siteIcon }, async labels( - item: { id: string; labels?: Label[] }, + item: { id: string; labels?: Label[]; labelNames?: string[] }, _: unknown, ctx: WithDataSourcesContext ) { if (item.labels) return item.labels - return findLabelsByLibraryItemId(item.id, ctx.uid) + return labelsLoader.load(item.id) }, async recommendations( item: { diff --git a/packages/api/src/services/labels.ts b/packages/api/src/services/labels.ts index 21b66fa4c..2d0d5c0af 100644 --- a/packages/api/src/services/labels.ts +++ b/packages/api/src/services/labels.ts @@ -1,7 +1,9 @@ +import DataLoader from 'dataloader' import { DeepPartial, FindOptionsWhere, In } from 'typeorm' import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity' import { EntityLabel, LabelSource } from '../entity/entity_label' import { Label } from '../entity/label' +import { LibraryItem } from '../entity/library_item' import { createPubSubClient, EntityEvent, @@ -22,20 +24,24 @@ export type LabelEvent = Merge< EntityEvent > -// const batchGetLabelsFromLinkIds = async ( -// linkIds: readonly string[] -// ): Promise => { -// const links = await getRepository(Link).find({ -// where: { id: In(linkIds as string[]) }, -// relations: ['labels'], -// }) +const batchGetLabelsFromLibraryItemIds = async ( + libraryItemIds: readonly string[] +): Promise => { + const libraryItems = await authTrx((tx) => + tx.getRepository(LibraryItem).find({ + where: { id: In(libraryItemIds as string[]) }, + relations: ['labels'], + }) + ) -// return linkIds.map( -// (linkId) => links.find((link) => link.id === linkId)?.labels || [] -// ) -// } + return libraryItemIds.map( + (libraryItemId) => + libraryItems.find((libraryItem) => libraryItem.id === libraryItemId) + ?.labels || [] + ) +} -// export const labelsLoader = new DataLoader(batchGetLabelsFromLinkIds) +export const labelsLoader = new DataLoader(batchGetLabelsFromLibraryItemIds) export const findOrCreateLabels = async ( labels: CreateLabelInput[], diff --git a/yarn.lock b/yarn.lock index 9c651f55f..08b76b456 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13348,11 +13348,16 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -dataloader@2.1.0, dataloader@^2.0.0: +dataloader@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.1.0.tgz#c69c538235e85e7ac6c6c444bae8ecabf5de9df7" integrity sha512-qTcEYLen3r7ojZNgVUaRggOI+KM7jrKxXeSHhogh/TWxYMeONEMqY+hmkobiYQozsGIyg9OYVzO4ZIfoB4I0pQ== +dataloader@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" + integrity sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g== + date-fns@2.x: version "2.29.3" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8"