From b07fc8f4b3c0a961d4c585b723e65096bfafd5b1 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 14 May 2025 20:59:57 +0200 Subject: [PATCH] lib/word_search: calculate `isCommon` --- lib/models/word_search/word_search_result.dart | 6 ++++++ lib/search/word_search.dart | 16 ++++++++++++++++ migrations/0001_JMDict.sql | 14 ++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/lib/models/word_search/word_search_result.dart b/lib/models/word_search/word_search_result.dart index 941f945..38e73b6 100644 --- a/lib/models/word_search/word_search_result.dart +++ b/lib/models/word_search/word_search_result.dart @@ -10,6 +10,9 @@ class WordSearchResult { /// The ID of the entry in the database. final int entryId; + /// Whether the word is common or not. + final bool isCommon; + /// The variants of the word in Japanese. final List japanese; @@ -30,6 +33,7 @@ class WordSearchResult { const WordSearchResult({ required this.entryId, + required this.isCommon, required this.japanese, required this.kanjiInfo, required this.readingInfo, @@ -40,6 +44,7 @@ class WordSearchResult { Map toJson() => { 'entryId': entryId, + 'isCommon': isCommon, 'japanese': japanese.map((e) => e.toJson()).toList(), 'kanjiInfo': kanjiInfo.map((key, value) => MapEntry(key, value.toJson())), @@ -53,6 +58,7 @@ class WordSearchResult { factory WordSearchResult.fromJson(Map json) => WordSearchResult( entryId: json['entryId'] as int, + isCommon: json['isCommon'] as bool, japanese: (json['japanese'] as List) .map((e) => WordSearchRuby.fromJson(e)) .toList(), diff --git a/lib/search/word_search.dart b/lib/search/word_search.dart index a6a6bd3..3cb5f31 100644 --- a/lib/search/word_search.dart +++ b/lib/search/word_search.dart @@ -81,11 +81,19 @@ Future?> searchWordWithDbConnection( where: 'entryId IN (${entryIds.join(',')})', ); + late final List> commonEntries; + final Future>> commonEntries_query = + connection.query( + 'JMdict_EntryCommon', + where: 'entryId IN (${entryIds.join(',')})', + ); + await Future.wait([ senses_query.then((value) => senses = value), readingElements_query.then((value) => readingElements = value), kanjiElements_query.then((value) => kanjiElements = value), jlptTags_query.then((value) => jlptTags = value), + commonEntries_query.then((value) => commonEntries = value), ]); // Sense queries @@ -267,6 +275,7 @@ Future?> searchWordWithDbConnection( readingElements: readingElements, kanjiElements: kanjiElements, jlptTags: jlptTags, + commonEntries: commonEntries, senses: senses, senseAntonyms: senseAntonyms, senseDialects: senseDialects, @@ -291,6 +300,7 @@ List _regroupWordSearchResults({ required List> readingElements, required List> kanjiElements, required List> jlptTags, + required List> commonEntries, required List> senses, required List> senseAntonyms, required List> senseDialects, @@ -310,6 +320,9 @@ List _regroupWordSearchResults({ }) { final List results = []; + final commonEntryIds = + commonEntries.map((entry) => entry['entryId'] as int).toSet(); + for (final entryId in entryIds) { final List> entryReadingElements = readingElements .where((element) => element['entryId'] == entryId) @@ -328,6 +341,8 @@ List _regroupWordSearchResults({ .firstOrNull ?? JlptLevel.none; + final isCommon = commonEntryIds.contains(entryId); + final List> entrySenses = senses.where((element) => element['entryId'] == entryId).toList(); @@ -359,6 +374,7 @@ List _regroupWordSearchResults({ results.add( WordSearchResult( entryId: entryId, + isCommon: isCommon, japanese: entryReadingElementsGrouped.rubys, kanjiInfo: entryReadingElementsGrouped.kanjiInfos, readingInfo: entryReadingElementsGrouped.readingInfos, diff --git a/migrations/0001_JMDict.sql b/migrations/0001_JMDict.sql index b2b6218..491614e 100644 --- a/migrations/0001_JMDict.sql +++ b/migrations/0001_JMDict.sql @@ -281,3 +281,17 @@ SELECT FROM "JMdict_Entry" LEFT JOIN "JMdict_KanjiElement" USING("entryId") LEFT JOIN "JMdict_ReadingElement" USING("entryId"); + +CREATE VIEW "JMdict_EntryCommon"("entryId") +AS +SELECT DISTINCT "entryId" +FROM "JMdict_KanjiElement" +FULL OUTER JOIN "JMdict_ReadingElement" USING("entryId") +WHERE "JMdict_ReadingElement"."news" = 1 + OR "JMdict_ReadingElement"."ichi" = 1 + OR "JMdict_ReadingElement"."spec" = 1 + OR "JMdict_ReadingElement"."gai" = 1 + OR "JMdict_KanjiElement"."news" = 1 + OR "JMdict_KanjiElement"."ichi" = 1 + OR "JMdict_KanjiElement"."spec" = 1 + OR "JMdict_KanjiElement"."gai" = 1;