From f6de8680ad04f2535aa0be88eabe65e1380b7d5c Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 8 Apr 2026 17:37:52 +0900 Subject: [PATCH] jmdict: infer `entryId` from element ids --- lib/_data_ingestion/jmdict/seed_data.dart | 17 +++----------- migrations/0001_JMDict.sql | 23 +++++++++++-------- .../0005_JMDict_search_index_tables.sql | 11 +++++---- 3 files changed, 22 insertions(+), 29 deletions(-) diff --git a/lib/_data_ingestion/jmdict/seed_data.dart b/lib/_data_ingestion/jmdict/seed_data.dart index 433a61d..65edbba 100644 --- a/lib/_data_ingestion/jmdict/seed_data.dart +++ b/lib/_data_ingestion/jmdict/seed_data.dart @@ -88,10 +88,7 @@ Future seedJMDictData(List entries, Database db) async { b.insert(JMdictTableNames.entry, e.sqlValue); for (final k in e.kanji) { - b.insert( - JMdictTableNames.kanjiElement, - k.sqlValue..addAll({'entryId': e.entryId}), - ); + b.insert(JMdictTableNames.kanjiElement, k.sqlValue); for (final i in k.info) { b.insert(JMdictTableNames.kanjiInfo, { @@ -102,10 +99,7 @@ Future seedJMDictData(List entries, Database db) async { } for (final r in e.readings) { - b.insert( - JMdictTableNames.readingElement, - r.sqlValue..addAll({'entryId': e.entryId}), - ); + b.insert(JMdictTableNames.readingElement, r.sqlValue); for (final i in r.info) { b.insert(JMdictTableNames.readingInfo, { @@ -129,10 +123,7 @@ Future seedJMDictData(List entries, Database db) async { for (final e in entries) { for (final s in e.senses) { - b.insert( - JMdictTableNames.sense, - s.sqlValue..addAll({'entryId': e.entryId}), - ); + b.insert(JMdictTableNames.sense, s.sqlValue); for (final d in s.dialects) { b.insert(JMdictTableNames.senseDialect, { 'senseId': s.senseId, @@ -156,14 +147,12 @@ Future seedJMDictData(List entries, Database db) async { } for (final rk in s.restrictedToKanji) { b.insert(JMdictTableNames.senseRestrictedToKanji, { - 'entryId': e.entryId, 'senseId': s.senseId, 'kanji': rk, }); } for (final rr in s.restrictedToReading) { b.insert(JMdictTableNames.senseRestrictedToReading, { - 'entryId': e.entryId, 'senseId': s.senseId, 'reading': rr, }); diff --git a/migrations/0001_JMDict.sql b/migrations/0001_JMDict.sql index b1bef6c..36567ed 100644 --- a/migrations/0001_JMDict.sql +++ b/migrations/0001_JMDict.sql @@ -53,14 +53,15 @@ CREATE TABLE "JMdict_Entry" ( CREATE TABLE "JMdict_KanjiElement" ( "elementId" INTEGER PRIMARY KEY, - "orderNum" INTEGER GENERATED ALWAYS AS ("elementId" % 100) VIRTUAL, - "entryId" INTEGER NOT NULL REFERENCES "JMdict_Entry"("entryId"), + "entryId" INTEGER NOT NULL GENERATED ALWAYS AS ("elementId" / 100) STORED, + "orderNum" INTEGER NOT NULL GENERATED ALWAYS AS ("elementId" % 100) VIRTUAL, "reading" TEXT NOT NULL, "news" INTEGER CHECK ("news" BETWEEN 1 AND 2), "ichi" INTEGER CHECK ("ichi" BETWEEN 1 AND 2), "spec" INTEGER CHECK ("spec" BETWEEN 1 AND 2), "gai" INTEGER CHECK ("gai" BETWEEN 1 AND 2), "nf" INTEGER CHECK ("nf" BETWEEN 1 AND 48), + FOREIGN KEY ("entryId") REFERENCES "JMdict_Entry"("entryId"), UNIQUE("entryId", "reading") ) WITHOUT ROWID; @@ -76,8 +77,8 @@ CREATE TABLE "JMdict_KanjiElementInfo" ( CREATE TABLE "JMdict_ReadingElement" ( "elementId" INTEGER PRIMARY KEY, - "orderNum" INTEGER GENERATED ALWAYS AS ("elementId" % 100) VIRTUAL, - "entryId" INTEGER NOT NULL REFERENCES "JMdict_Entry"("entryId"), + "entryId" INTEGER NOT NULL GENERATED ALWAYS AS ("elementId" / 100) STORED, + "orderNum" INTEGER NOT NULL GENERATED ALWAYS AS ("elementId" % 100) VIRTUAL, "reading" TEXT NOT NULL, "readingDoesNotMatchKanji" BOOLEAN NOT NULL DEFAULT FALSE, "news" INTEGER CHECK ("news" BETWEEN 1 AND 2), @@ -85,6 +86,7 @@ CREATE TABLE "JMdict_ReadingElement" ( "spec" INTEGER CHECK ("spec" BETWEEN 1 AND 2), "gai" INTEGER CHECK ("gai" BETWEEN 1 AND 2), "nf" INTEGER CHECK ("nf" BETWEEN 1 AND 48), + FOREIGN KEY ("entryId") REFERENCES "JMdict_Entry"("entryId"), UNIQUE("entryId", "reading") ) WITHOUT ROWID; @@ -106,25 +108,26 @@ CREATE TABLE "JMdict_ReadingElementInfo" ( CREATE TABLE "JMdict_Sense" ( "senseId" INTEGER PRIMARY KEY, - "orderNum" INTEGER GENERATED ALWAYS AS ("senseId" % 100) VIRTUAL, - "entryId" INTEGER NOT NULL REFERENCES "JMdict_Entry"("entryId"), + "entryId" INTEGER NOT NULL GENERATED ALWAYS AS ("senseId" / 100) STORED, + "orderNum" INTEGER NOT NULL GENERATED ALWAYS AS ("senseId" % 100) VIRTUAL, + FOREIGN KEY ("entryId") REFERENCES "JMdict_Entry"("entryId"), UNIQUE("entryId", "orderNum") ); CREATE TABLE "JMdict_SenseRestrictedToKanji" ( - "entryId" INTEGER NOT NULL, "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 ("entryId", "senseId", "kanji") + PRIMARY KEY ("senseId", "kanji") ) WITHOUT ROWID; CREATE TABLE "JMdict_SenseRestrictedToReading" ( - "entryId" INTEGER NOT NULL, "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 ("entryId", "senseId", "reading") + PRIMARY KEY ("senseId", "reading") ) WITHOUT ROWID; -- In order to add xrefs, you will need to have added the entry to xref to. diff --git a/migrations/0005_JMDict_search_index_tables.sql b/migrations/0005_JMDict_search_index_tables.sql index ea11436..01075e9 100644 --- a/migrations/0005_JMDict_search_index_tables.sql +++ b/migrations/0005_JMDict_search_index_tables.sql @@ -1,9 +1,12 @@ CREATE TABLE "JMdict_EntryScore" ( "type" CHAR(1) NOT NULL CHECK ("type" IN ('r', 'k')), - "entryId" INTEGER NOT NULL REFERENCES "JMdict_Entry"("entryId"), "elementId" INTEGER NOT NULL, "score" INTEGER NOT NULL DEFAULT 0, "common" BOOLEAN NOT NULL DEFAULT FALSE, + + "entryId" INTEGER NOT NULL GENERATED ALWAYS AS ("elementId" / 100) STORED, + + FOREIGN KEY ("entryId") REFERENCES "JMdict_Entry"("entryId"), PRIMARY KEY ("type", "elementId") ) WITHOUT ROWID; @@ -97,12 +100,11 @@ AFTER INSERT ON "JMdict_ReadingElement" BEGIN INSERT INTO "JMdict_EntryScore" ( "type", - "entryId", "elementId", "score", "common" ) - SELECT "type", "entryId", "elementId", "score", "common" + SELECT "type", "elementId", "score", "common" FROM "JMdict_EntryScoreView_Reading" WHERE "elementId" = NEW."elementId"; END; @@ -134,12 +136,11 @@ AFTER INSERT ON "JMdict_KanjiElement" BEGIN INSERT INTO "JMdict_EntryScore" ( "type", - "entryId", "elementId", "score", "common" ) - SELECT "type", "entryId", "elementId", "score", "common" + SELECT "type", "elementId", "score", "common" FROM "JMdict_EntryScoreView_Kanji" WHERE "elementId" = NEW."elementId"; END;