From a222b2d9b8f67f96296a28423d5c6c767f163006 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 8 Apr 2026 19:57:07 +0900 Subject: [PATCH] jmdict: `elementId` instead of `reading` for element restriction tables --- lib/_data_ingestion/jmdict/seed_data.dart | 8 +++-- lib/search/word_search/data_query.dart | 40 ++++++++++++++++++----- lib/search/word_search/regrouping.dart | 2 +- migrations/0001_JMDict.sql | 12 +++---- 4 files changed, 43 insertions(+), 19 deletions(-) diff --git a/lib/_data_ingestion/jmdict/seed_data.dart b/lib/_data_ingestion/jmdict/seed_data.dart index 65edbba..950a810 100644 --- a/lib/_data_ingestion/jmdict/seed_data.dart +++ b/lib/_data_ingestion/jmdict/seed_data.dart @@ -148,13 +148,17 @@ Future seedJMDictData(List entries, Database db) async { for (final rk in s.restrictedToKanji) { b.insert(JMdictTableNames.senseRestrictedToKanji, { 'senseId': s.senseId, - 'kanji': rk, + 'kanjiElementId': e.kanji + .firstWhere((k) => k.reading == rk) + .elementId, }); } for (final rr in s.restrictedToReading) { b.insert(JMdictTableNames.senseRestrictedToReading, { 'senseId': s.senseId, - 'reading': rr, + 'readingElementId': e.readings + .firstWhere((r) => r.reading == rr) + .elementId, }); } for (final ls in s.languageSource) { diff --git a/lib/search/word_search/data_query.dart b/lib/search/word_search/data_query.dart index ab8b0f7..afffaf2 100644 --- a/lib/search/word_search/data_query.dart +++ b/lib/search/word_search/data_query.dart @@ -216,19 +216,43 @@ Future>> _sensepossQuery( Future>> _senserestrictedtokanjisQuery( DatabaseExecutor connection, List senseIds, -) => connection.query( - JMdictTableNames.senseRestrictedToKanji, - where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', - whereArgs: senseIds, +) => connection.rawQuery( + """ + SELECT + "${JMdictTableNames.senseRestrictedToKanji}".senseId, + "${JMdictTableNames.senseRestrictedToKanji}".kanjiElementId, + "${JMdictTableNames.kanjiElement}".reading + FROM "${JMdictTableNames.senseRestrictedToKanji}" + JOIN "${JMdictTableNames.kanjiElement}" + ON "${JMdictTableNames.senseRestrictedToKanji}"."kanjiElementId" = "${JMdictTableNames.kanjiElement}"."elementId" + WHERE + "senseId" IN (${List.filled(senseIds.length, '?').join(',')}) + ORDER BY + "${JMdictTableNames.senseRestrictedToKanji}"."senseId", + "${JMdictTableNames.senseRestrictedToKanji}"."kanjiElementId" + """, + [...senseIds], ); Future>> _senserestrictedtoreadingsQuery( DatabaseExecutor connection, List senseIds, -) => connection.query( - JMdictTableNames.senseRestrictedToReading, - where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', - whereArgs: senseIds, +) => connection.rawQuery( + """ + SELECT + "${JMdictTableNames.senseRestrictedToReading}".senseId, + "${JMdictTableNames.senseRestrictedToReading}".readingElementId, + "${JMdictTableNames.readingElement}".reading + FROM "${JMdictTableNames.senseRestrictedToReading}" + JOIN "${JMdictTableNames.readingElement}" + ON "${JMdictTableNames.senseRestrictedToReading}"."readingElementId" = "${JMdictTableNames.readingElement}"."elementId" + WHERE + "senseId" IN (${List.filled(senseIds.length, '?').join(',')}) + ORDER BY + "${JMdictTableNames.senseRestrictedToReading}"."senseId", + "${JMdictTableNames.senseRestrictedToReading}"."readingElementId" + """, + [...senseIds], ); Future>> _examplesentencesQuery( diff --git a/lib/search/word_search/regrouping.dart b/lib/search/word_search/regrouping.dart index 7f80b17..96a1d40 100644 --- a/lib/search/word_search/regrouping.dart +++ b/lib/search/word_search/regrouping.dart @@ -318,7 +318,7 @@ List _regroupSenses({ .map((e) => e['reading'] as String) .toList(), restrictedToKanji: restrictedToKanjis - .map((e) => e['kanji'] as String) + .map((e) => e['reading'] as String) .toList(), fields: fields .map((e) => JMdictField.fromId(e['field'] as String)) diff --git a/migrations/0001_JMDict.sql b/migrations/0001_JMDict.sql index e246c03..37f4ce0 100644 --- a/migrations/0001_JMDict.sql +++ b/migrations/0001_JMDict.sql @@ -116,18 +116,14 @@ CREATE TABLE "JMdict_Sense" ( CREATE TABLE "JMdict_SenseRestrictedToKanji" ( "senseId" INTEGER NOT NULL REFERENCES "JMdict_Sense"("senseId"), - "kanji" TEXT NOT NULL, - "entryId" INTEGER NOT NULL GENERATED ALWAYS AS ("senseId" / 100) VIRTUAL, - FOREIGN KEY ("entryId", "kanji") REFERENCES "JMdict_KanjiElement"("entryId", "reading"), - PRIMARY KEY ("senseId", "kanji") + "kanjiElementId" INTEGER NOT NULL REFERENCES "JMdict_KanjiElement"("elementId"), + PRIMARY KEY ("senseId", "kanjiElementId") ) WITHOUT ROWID; CREATE TABLE "JMdict_SenseRestrictedToReading" ( "senseId" INTEGER NOT NULL REFERENCES "JMdict_Sense"("senseId"), - "reading" TEXT NOT NULL, - "entryId" INTEGER NOT NULL GENERATED ALWAYS AS ("senseId" / 100) VIRTUAL, - FOREIGN KEY ("entryId", "reading") REFERENCES "JMdict_ReadingElement"("entryId", "reading"), - PRIMARY KEY ("senseId", "reading") + "readingElementId" INTEGER NOT NULL REFERENCES "JMdict_ReadingElement"("elementId"), + PRIMARY KEY ("senseId", "readingElementId") ) WITHOUT ROWID; -- In order to add xrefs, you will need to have added the entry to xref to.