From 781e650f0b87dd8e19ab05d36cc7d2090e3c3562 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Tue, 24 Jun 2025 01:01:07 +0200 Subject: [PATCH] WIP: use ids for \{kanji,reading\}Element tables --- migrations/0001_JMDict.sql | 27 ++--- migrations/0003_JMDict_FTS5_Ttables.sql | 28 ++--- .../0005_JMDict_search_index_tables.sql | 100 ++++++++++++------ migrations/0010_Views.sql | 9 +- 4 files changed, 101 insertions(+), 63 deletions(-) diff --git a/migrations/0001_JMDict.sql b/migrations/0001_JMDict.sql index 1e60113..ba9e2cc 100644 --- a/migrations/0001_JMDict.sql +++ b/migrations/0001_JMDict.sql @@ -39,6 +39,7 @@ CREATE TABLE "JMdict_Entry" ( -- KanjiElement CREATE TABLE "JMdict_KanjiElement" ( + "elementId" INTEGER PRIMARY KEY, "entryId" INTEGER NOT NULL REFERENCES "JMdict_Entry"("entryId"), "orderNum" INTEGER NOT NULL, "reading" TEXT NOT NULL, @@ -47,7 +48,7 @@ CREATE TABLE "JMdict_KanjiElement" ( "spec" INTEGER CHECK ("spec" BETWEEN 1 AND 2), "gai" INTEGER CHECK ("gai" BETWEEN 1 AND 2), "nf" INTEGER CHECK ("nf" BETWEEN 1 AND 48), - PRIMARY KEY ("entryId", "reading"), + UNIQUE("entryId", "reading"), UNIQUE("entryId", "orderNum") ) WITHOUT ROWID; @@ -55,17 +56,15 @@ CREATE INDEX "JMdict_KanjiElement_byEntryId_byOrderNum" ON "JMdict_KanjiElement" CREATE INDEX "JMdict_KanjiElement_byReading" ON "JMdict_KanjiElement"("reading"); CREATE TABLE "JMdict_KanjiElementInfo" ( - "entryId" INTEGER NOT NULL, - "reading" TEXT NOT NULL, + "elementId" INTEGER NOT NULL REFERENCES "JMdict_KanjiElement"("elementId"), "info" TEXT NOT NULL REFERENCES "JMdict_InfoKanji"("id"), - FOREIGN KEY ("entryId", "reading") - REFERENCES "JMdict_KanjiElement"("entryId", "reading"), - PRIMARY KEY ("entryId", "reading", "info") + PRIMARY KEY ("elementId", "info") ) WITHOUT ROWID; -- ReadingElement CREATE TABLE "JMdict_ReadingElement" ( + "elementId" INTEGER PRIMARY KEY, "entryId" INTEGER NOT NULL REFERENCES "JMdict_Entry"("entryId"), "orderNum" INTEGER NOT NULL, "reading" TEXT NOT NULL, @@ -75,7 +74,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), - PRIMARY KEY ("entryId", "reading"), + UNIQUE("entryId", "reading"), UNIQUE("entryId", "orderNum") ) WITHOUT ROWID; @@ -83,21 +82,15 @@ CREATE INDEX "JMdict_ReadingElement_byEntryId_byOrderNum" ON "JMdict_ReadingElem CREATE INDEX "JMdict_ReadingElement_byReading" ON "JMdict_ReadingElement"("reading"); CREATE TABLE "JMdict_ReadingElementRestriction" ( - "entryId" INTEGER NOT NULL, - "reading" TEXT NOT NULL, + "elementId" INTEGER NOT NULL REFERENCES "JMdict_ReadingElement"("elementId"), "restriction" TEXT NOT NULL, - FOREIGN KEY ("entryId", "reading") - REFERENCES "JMdict_ReadingElement"("entryId", "reading"), - PRIMARY KEY ("entryId", "reading", "restriction") + PRIMARY KEY ("elementId", "restriction") ) WITHOUT ROWID; CREATE TABLE "JMdict_ReadingElementInfo" ( - "entryId" INTEGER NOT NULL, - "reading" TEXT NOT NULL, + "elementId" INTEGER NOT NULL REFERENCES "JMdict_ReadingElement"("elementId"), "info" TEXT NOT NULL REFERENCES "JMdict_InfoReading"("id"), - FOREIGN KEY ("entryId", "reading") - REFERENCES "JMdict_ReadingElement"("entryId", "reading"), - PRIMARY KEY ("entryId", "reading", "info") + PRIMARY KEY ("elementId", "info") ) WITHOUT ROWID; -- Sense diff --git a/migrations/0003_JMDict_FTS5_Ttables.sql b/migrations/0003_JMDict_FTS5_Ttables.sql index 33adf3c..1fcf540 100644 --- a/migrations/0003_JMDict_FTS5_Ttables.sql +++ b/migrations/0003_JMDict_FTS5_Ttables.sql @@ -1,55 +1,55 @@ -CREATE VIRTUAL TABLE "JMdict_KanjiElementFTS" USING FTS5("entryId" UNINDEXED, "reading"); +CREATE VIRTUAL TABLE "JMdict_KanjiElementFTS" USING FTS5("elementId" UNINDEXED, "reading"); CREATE TRIGGER "JMdict_KanjiElement_InsertFTS" AFTER INSERT ON "JMdict_KanjiElement" BEGIN - INSERT INTO "JMdict_KanjiElementFTS"("entryId", "reading") - VALUES (NEW."entryId", NEW."reading"); + INSERT INTO "JMdict_KanjiElementFTS"("elementId", "reading") + VALUES (NEW."elementId", NEW."reading"); END; CREATE TRIGGER "JMdict_KanjiElement_UpdateFTS" -AFTER UPDATE OF "entryId", "reading" +AFTER UPDATE OF "elementId", "reading" ON "JMdict_KanjiElement" BEGIN UPDATE "JMdict_KanjiElementFTS" SET - "entryId" = NEW."entryId", + "elementId" = NEW."elementId", "reading" = NEW."reading" - WHERE "entryId" = OLD."entryId"; + WHERE "elementId" = OLD."elementId"; END; CREATE TRIGGER "JMdict_KanjiElement_DeleteFTS" AFTER DELETE ON "JMdict_KanjiElement" BEGIN DELETE FROM "JMdict_KanjiElementFTS" - WHERE "entryId" = OLD."entryId"; + WHERE "elementId" = OLD."elementId"; END; -CREATE VIRTUAL TABLE "JMdict_ReadingElementFTS" USING FTS5("entryId" UNINDEXED, "reading"); +CREATE VIRTUAL TABLE "JMdict_ReadingElementFTS" USING FTS5("elementId" UNINDEXED, "reading"); CREATE TRIGGER "JMdict_ReadingElement_InsertFTS" AFTER INSERT ON "JMdict_ReadingElement" BEGIN - INSERT INTO "JMdict_ReadingElementFTS"("entryId", "reading") - VALUES (NEW."entryId", NEW."reading"); + INSERT INTO "JMdict_ReadingElementFTS"("elementId", "reading") + VALUES (NEW."elementId", NEW."reading"); END; CREATE TRIGGER "JMdict_ReadingElement_UpdateFTS" -AFTER UPDATE OF "entryId", "reading" +AFTER UPDATE OF "elementId", "reading" ON "JMdict_ReadingElement" BEGIN UPDATE "JMdict_ReadingElementFTS" SET - "entryId" = NEW."entryId", + "elementId" = NEW."elementId", "reading" = NEW."reading" - WHERE "entryId" = OLD."entryId"; + WHERE "elementId" = OLD."elementId"; END; CREATE TRIGGER "JMdict_ReadingElement_DeleteFTS" AFTER DELETE ON "JMdict_ReadingElement" BEGIN DELETE FROM "JMdict_ReadingElementFTS" - WHERE "entryId" = OLD."entryId"; + WHERE "elementId" = OLD."elementId"; END; diff --git a/migrations/0005_JMDict_search_index_tables.sql b/migrations/0005_JMDict_search_index_tables.sql index 909805e..4b49887 100644 --- a/migrations/0005_JMDict_search_index_tables.sql +++ b/migrations/0005_JMDict_search_index_tables.sql @@ -1,17 +1,16 @@ CREATE TABLE "JMdict_EntryScore" ( "type" TEXT NOT NULL CHECK ("type" IN ('reading', 'kanji')), - "entryId" INTEGER NOT NULL, - "reading" TEXT NOT NULL, + "elementId" INTEGER NOT NULL, "score" INTEGER NOT NULL DEFAULT 0, "common" BOOLEAN NOT NULL DEFAULT FALSE, - PRIMARY KEY ("type", "entryId", "reading") + PRIMARY KEY ("type", "elementId") ) WITHOUT ROWID; -CREATE INDEX "JMdict_EntryScore_byEntryId_byReading_byScore" ON "JMdict_EntryScore"("entryId", "reading", "score"); +CREATE INDEX "JMdict_EntryScore_byElementId_byScore" ON "JMdict_EntryScore"("elementId", "score"); CREATE INDEX "JMdict_EntryScore_byScore" ON "JMdict_EntryScore"("score"); CREATE INDEX "JMdict_EntryScore_byCommon" ON "JMdict_EntryScore"("common"); -CREATE INDEX "JMdict_EntryScore_byType_byEntryId_byReading_byScore" ON "JMdict_EntryScore"("type", "entryId", "reading", "score"); +CREATE INDEX "JMdict_EntryScore_byType_byElementId_byScore" ON "JMdict_EntryScore"("type", "elementId", "score"); CREATE INDEX "JMdict_EntryScore_byType_byScore" ON "JMdict_EntryScore"("type", "score"); CREATE INDEX "JMdict_EntryScore_byType_byCommon" ON "JMdict_EntryScore"("type", "common"); @@ -21,8 +20,7 @@ CREATE INDEX "JMdict_EntryScore_byType_byCommon" ON "JMdict_EntryScore"("type", CREATE VIEW "JMdict_EntryScoreView_Reading" AS SELECT 'reading' AS "type", - "JMdict_ReadingElement"."entryId", - "JMdict_ReadingElement"."reading", + "JMdict_ReadingElement"."elementId", ( "news" IS 1 OR "ichi" IS 1 @@ -53,8 +51,7 @@ LEFT JOIN "JMdict_JLPTTag" USING ("entryId"); CREATE VIEW "JMdict_EntryScoreView_Kanji" AS SELECT 'kanji' AS "type", - "JMdict_KanjiElement"."entryId", - "JMdict_KanjiElement"."reading", + "JMdict_KanjiElement"."elementId", ( "news" IS 1 OR "ichi" IS 1 @@ -97,15 +94,13 @@ AFTER INSERT ON "JMdict_ReadingElement" BEGIN INSERT INTO "JMdict_EntryScore" ( "type", - "entryId", - "reading", + "elementId", "score", "common" ) - SELECT "type", "entryId", "reading", "score", "common" + SELECT "type", "elementId", "score", "common" FROM "JMdict_EntryScoreView_Reading" - WHERE "entryId" = NEW."entryId" - AND "reading" = NEW."reading"; + WHERE "elementId" = NEW."elementId"; END; CREATE TRIGGER "JMdict_EntryScore_Update_JMdict_ReadingElement" @@ -117,8 +112,7 @@ BEGIN "score" = "JMdict_EntryScoreView_Reading"."score", "common" = "JMdict_EntryScoreView_Reading"."common" FROM "JMdict_EntryScoreView_Reading" - WHERE "entryId" = NEW."entryId" - AND "reading" = NEW."reading"; + WHERE "elementId" = NEW."elementId"; END; CREATE TRIGGER "JMdict_EntryScore_Delete_JMdict_ReadingElement" @@ -126,8 +120,7 @@ AFTER DELETE ON "JMdict_ReadingElement" BEGIN DELETE FROM "JMdict_EntryScore" WHERE "type" = 'reading' - AND "entryId" = OLD."entryId" - AND "reading" = OLD."reading"; + AND "elementId" = OLD."elementId"; END; --- JMdict_KanjiElement triggers @@ -137,15 +130,13 @@ AFTER INSERT ON "JMdict_KanjiElement" BEGIN INSERT INTO "JMdict_EntryScore" ( "type", - "entryId", - "reading", + "elementId", "score", "common" ) - SELECT "type", "entryId", "reading", "score", "common" + SELECT "type", "elementId", "score", "common" FROM "JMdict_EntryScoreView_Kanji" - WHERE "entryId" = NEW."entryId" - AND "reading" = NEW."reading"; + WHERE "elementId" = NEW."elementId"; END; CREATE TRIGGER "JMdict_EntryScore_Update_JMdict_KanjiElement" @@ -157,8 +148,7 @@ BEGIN "score" = "JMdict_EntryScoreView_Kanji"."score", "common" = "JMdict_EntryScoreView_Kanji"."common" FROM "JMdict_EntryScoreView_Kanji" - WHERE "entryId" = NEW."entryId" - AND "reading" = NEW."reading"; + WHERE "elementId" = NEW."elementId"; END; CREATE TRIGGER "JMdict_EntryScore_Delete_JMdict_KanjiElement" @@ -166,8 +156,7 @@ AFTER DELETE ON "JMdict_KanjiElement" BEGIN DELETE FROM "JMdict_EntryScore" WHERE "type" = 'kanji' - AND "entryId" = OLD."entryId" - AND "reading" = OLD."reading"; + AND "elementId" = OLD."elementId"; END; --- JMdict_JLPTTag triggers @@ -180,7 +169,24 @@ BEGIN "score" = "JMdict_EntryScoreView"."score", "common" = "JMdict_EntryScoreView"."common" FROM "JMdict_EntryScoreView" - WHERE "JMdict_EntryScoreView"."entryId" = NEW."entryId" + WHERE + ( + ( + "JMdict_EntryScoreView"."type" = 'kanji' + AND + "JMdict_EntryScoreView"."elementId" IN ( + SELECT "elementId" FROM "JMdict_KanjiElement" WHERE "entryId" = NEW."entryId" + ) + ) + OR + ( + "JMdict_EntryScoreView"."type" = 'reading' + AND + "JMdict_EntryScoreView"."elementId" IN ( + SELECT "elementId" FROM "JMdict_ReadingElement" WHERE "entryId" = NEW."entryId" + ) + ) + ) AND "JMdict_EntryScoreView"."entryId" = "JMdict_EntryScore"."entryId" AND "JMdict_EntryScoreView"."reading" = "JMdict_EntryScore"."reading"; END; @@ -194,7 +200,24 @@ BEGIN "score" = "JMdict_EntryScoreView"."score", "common" = "JMdict_EntryScoreView"."common" FROM "JMdict_EntryScoreView" - WHERE "JMdict_EntryScoreView"."entryId" = NEW."entryId" + WHERE + ( + ( + "JMdict_EntryScoreView"."type" = 'kanji' + AND + "JMdict_EntryScoreView"."elementId" IN ( + SELECT "elementId" FROM "JMdict_KanjiElement" WHERE "entryId" = NEW."entryId" + ) + ) + OR + ( + "JMdict_EntryScoreView"."type" = 'reading' + AND + "JMdict_EntryScoreView"."elementId" IN ( + SELECT "elementId" FROM "JMdict_ReadingElement" WHERE "entryId" = NEW."entryId" + ) + ) + ) AND "JMdict_EntryScoreView"."entryId" = "JMdict_EntryScore"."entryId" AND "JMdict_EntryScoreView"."reading" = "JMdict_EntryScore"."reading"; END; @@ -207,7 +230,24 @@ BEGIN "score" = "JMdict_EntryScoreView"."score", "common" = "JMdict_EntryScoreView"."common" FROM "JMdict_EntryScoreView" - WHERE "JMdict_EntryScoreView"."entryId" = NEW."entryId" + WHERE + ( + ( + "JMdict_EntryScoreView"."type" = 'kanji' + AND + "JMdict_EntryScoreView"."elementId" IN ( + SELECT "elementId" FROM "JMdict_KanjiElement" WHERE "entryId" = OLD."entryId" + ) + ) + OR + ( + "JMdict_EntryScoreView"."type" = 'reading' + AND + "JMdict_EntryScoreView"."elementId" IN ( + SELECT "elementId" FROM "JMdict_ReadingElement" WHERE "entryId" = OLD."entryId" + ) + ) + ) AND "JMdict_EntryScoreView"."entryId" = "JMdict_EntryScore"."entryId" AND "JMdict_EntryScoreView"."reading" = "JMdict_EntryScore"."reading"; END; diff --git a/migrations/0010_Views.sql b/migrations/0010_Views.sql index b0acf94..a3d0214 100644 --- a/migrations/0010_Views.sql +++ b/migrations/0010_Views.sql @@ -77,8 +77,13 @@ SELECT DISTINCT "radical" FROM "RADKFILE"; CREATE VIEW "JMdict_CombinedEntryScore" AS SELECT - "JMdict_EntryScore"."entryId", + CASE + WHEN "JMdict_EntryScore"."type" = 'kanji' + THEN (SELECT entryId FROM "JMdict_KanjiElement" WHERE "elementId" = "JMdict_EntryScore"."elementId") + WHEN "JMdict_EntryScore"."type" = 'reading' + THEN (SELECT entryId FROM "JMdict_ReadingElement" WHERE "elementId" = "JMdict_EntryScore"."elementId") + END AS "entryId", MAX("JMdict_EntryScore"."score") AS "score", MAX("JMdict_EntryScore"."common") AS "common" FROM "JMdict_EntryScore" -GROUP BY "JMdict_EntryScore"."entryId"; +GROUP BY "entryId";