From 78ba1bae1a08b9452f5377bf33840b5312a15347 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 14 May 2025 17:12:31 +0200 Subject: [PATCH] lib/search: query readings for xrefs --- .../word_search/word_search_xref_entry.dart | 12 ++++ lib/search/word_search.dart | 62 ++++++++++++++++--- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/lib/models/word_search/word_search_xref_entry.dart b/lib/models/word_search/word_search_xref_entry.dart index 669a83a..fbe875d 100644 --- a/lib/models/word_search/word_search_xref_entry.dart +++ b/lib/models/word_search/word_search_xref_entry.dart @@ -3,6 +3,12 @@ class WordSearchXrefEntry { /// The ID of the entry that this entry cross-references to. final int entryId; + /// The base word of the cross-referenced entry. + final String baseWord; + + /// The furigana of the cross-referenced entry, if any. + final String? furigana; + /// Whether the entryId was ambiguous during the creation of the /// database (and hence might be incorrect). final bool ambiguous; @@ -10,16 +16,22 @@ class WordSearchXrefEntry { const WordSearchXrefEntry({ required this.entryId, required this.ambiguous, + required this.baseWord, + required this.furigana, }); Map toJson() => { 'entryId': entryId, 'ambiguous': ambiguous, + 'baseWord': baseWord, + 'furigana': furigana, }; factory WordSearchXrefEntry.fromJson(Map json) => WordSearchXrefEntry( entryId: json['entryId'] as int, ambiguous: json['ambiguous'] as bool, + baseWord: json['baseWord'] as String, + furigana: json['furigana'] as String?, ); } diff --git a/lib/search/word_search.dart b/lib/search/word_search.dart index 82a984e..32e9704 100644 --- a/lib/search/word_search.dart +++ b/lib/search/word_search.dart @@ -94,10 +94,29 @@ Future?> searchWordWithDbConnection( late final List> senseAntonyms; final Future>> senseAntonyms_query = - connection.query( - 'JMdict_SenseAntonym', - where: 'senseId IN (${senseIds.join(',')})', - ); + connection.rawQuery(""" + SELECT + JMdict_SenseAntonym.senseId, + JMdict_SenseAntonym.ambiguous, + JMdict_SenseAntonym.xrefEntryId, + JMdict_KanjiElementDistinct.reading AS kanji, + JMdict_ReadingElementDistinct.reading AS reading + FROM JMdict_SenseAntonym + LEFT JOIN + (SELECT entryId, reading FROM JMdict_KanjiElement GROUP BY entryId HAVING MIN(orderNum)) + AS JMdict_KanjiElementDistinct + ON JMdict_SenseAntonym.xrefEntryId = JMdict_KanjiElementDistinct.entryId + LEFT JOIN + (SELECT entryId, reading FROM JMdict_ReadingElement GROUP BY entryId HAVING MIN(orderNum)) + AS JMdict_ReadingElementDistinct + ON JMdict_SenseAntonym.xrefEntryId = JMdict_ReadingElementDistinct.entryId + WHERE senseId IN (${senseIds.join(',')}) + ORDER BY + JMdict_SenseAntonym.senseId, + JMdict_SenseAntonym.xrefEntryId, + JMdict_KanjiElementDistinct.reading, + JMdict_ReadingElementDistinct.reading + """); late final List> senseDialects; final Future>> senseDialects_query = @@ -160,10 +179,29 @@ Future?> searchWordWithDbConnection( late final List> senseSeeAlsos; final Future>> senseSeeAlsos_query = - connection.query( - 'JMdict_SenseSeeAlso', - where: 'senseId IN (${senseIds.join(',')})', - ); + connection.rawQuery(""" + SELECT + JMdict_SenseSeeAlso.senseId, + JMdict_SenseSeeAlso.ambiguous, + JMdict_SenseSeeAlso.xrefEntryId, + JMdict_KanjiElementDistinct.reading AS kanji, + JMdict_ReadingElementDistinct.reading AS reading + FROM JMdict_SenseSeeAlso + LEFT JOIN + (SELECT entryId, reading FROM JMdict_KanjiElement GROUP BY entryId HAVING MIN(orderNum)) + AS JMdict_KanjiElementDistinct + ON JMdict_SenseSeeAlso.xrefEntryId = JMdict_KanjiElementDistinct.entryId + LEFT JOIN + (SELECT entryId, reading FROM JMdict_ReadingElement GROUP BY entryId HAVING MIN(orderNum)) + AS JMdict_ReadingElementDistinct + ON JMdict_SenseSeeAlso.xrefEntryId = JMdict_ReadingElementDistinct.entryId + WHERE senseId IN (${senseIds.join(',')}) + ORDER BY + JMdict_SenseSeeAlso.senseId, + JMdict_SenseSeeAlso.xrefEntryId, + JMdict_KanjiElementDistinct.reading, + JMdict_ReadingElementDistinct.reading + """); late final List> exampleSentences; final Future>> exampleSentences_query = @@ -493,12 +531,20 @@ List _regroup_senses({ seeAlso: seeAlsos .map((e) => WordSearchXrefEntry( entryId: e['xrefEntryId'] as int, + baseWord: (e['kanji'] ?? e['reading']) as String, + furigana: (e['kanji'] != null) ? + (e['reading'] as String) : + null, ambiguous: e['ambiguous'] == 1, )) .toList(), antonyms: antonyms .map((e) => WordSearchXrefEntry( entryId: e['xrefEntryId'] as int, + baseWord: (e['kanji'] ?? e['reading']) as String, + furigana: (e['kanji'] != null) ? + (e['reading'] as String) : + null, ambiguous: e['ambiguous'] == 1, )) .toList(),