From f30465a33c0d1d3bfb6c9602cb2675ab9aad768f Mon Sep 17 00:00:00 2001 From: h7x4 Date: Mon, 14 Jul 2025 19:16:36 +0200 Subject: [PATCH] search: add function for fetching multiple word entries by id at once --- lib/search.dart | 6 ++++ lib/search/word_search/word_search.dart | 42 +++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/lib/search.dart b/lib/search.dart index f21a982..e95184c 100644 --- a/lib/search.dart +++ b/lib/search.dart @@ -45,6 +45,12 @@ extension JaDBConnection on DatabaseExecutor { Future jadbGetWordById(int id) => getWordByIdWithDbConnection(this, id); + /// Get a list of words by their IDs. + /// + /// IDs for which no result is found are omitted from the returned value. + Future> jadbGetManyWordsByIds(Set ids) => + getWordsByIdsWithDbConnection(this, ids); + /// Search for a word in the database, and return the count of results. Future jadbSearchWordCount( String word, { diff --git a/lib/search/word_search/word_search.dart b/lib/search/word_search/word_search.dart index 99544bc..e85d4ac 100644 --- a/lib/search/word_search/word_search.dart +++ b/lib/search/word_search/word_search.dart @@ -152,3 +152,45 @@ Future getWordByIdWithDbConnection( return result.firstOrNull; } + +Future> getWordsByIdsWithDbConnection( + DatabaseExecutor connection, + Set ids, +) async { + if (ids.isEmpty) { + return {}; + } + + final LinearWordQueryData linearWordQueryData = + await fetchLinearWordQueryData(connection, ids.toList()); + + final List entryIds = ids + .map((id) => ScoredEntryId(id, 0)) // Score is not used here + .toList(); + + final results = regroupWordSearchResults( + entryIds: entryIds, + readingElements: linearWordQueryData.readingElements, + kanjiElements: linearWordQueryData.kanjiElements, + jlptTags: linearWordQueryData.jlptTags, + commonEntries: linearWordQueryData.commonEntries, + senses: linearWordQueryData.senses, + senseAntonyms: linearWordQueryData.senseAntonyms, + senseDialects: linearWordQueryData.senseDialects, + senseFields: linearWordQueryData.senseFields, + senseGlossaries: linearWordQueryData.senseGlossaries, + senseInfos: linearWordQueryData.senseInfos, + senseLanguageSources: linearWordQueryData.senseLanguageSources, + senseMiscs: linearWordQueryData.senseMiscs, + sensePOSs: linearWordQueryData.sensePOSs, + senseRestrictedToKanjis: linearWordQueryData.senseRestrictedToKanjis, + senseRestrictedToReadings: linearWordQueryData.senseRestrictedToReadings, + senseSeeAlsos: linearWordQueryData.senseSeeAlsos, + exampleSentences: linearWordQueryData.exampleSentences, + readingElementInfos: linearWordQueryData.readingElementInfos, + readingElementRestrictions: linearWordQueryData.readingElementRestrictions, + kanjiElementInfos: linearWordQueryData.kanjiElementInfos, + ); + + return {for (var r in results) r.entryId: r}; +}