1 Commits

Author SHA1 Message Date
781e650f0b WIP: use ids for \{kanji,reading\}Element tables 2025-06-24 01:01:07 +02:00
4 changed files with 101 additions and 63 deletions

View File

@@ -39,6 +39,7 @@ CREATE TABLE "JMdict_Entry" (
-- KanjiElement -- KanjiElement
CREATE TABLE "JMdict_KanjiElement" ( CREATE TABLE "JMdict_KanjiElement" (
"elementId" INTEGER PRIMARY KEY,
"entryId" INTEGER NOT NULL REFERENCES "JMdict_Entry"("entryId"), "entryId" INTEGER NOT NULL REFERENCES "JMdict_Entry"("entryId"),
"orderNum" INTEGER NOT NULL, "orderNum" INTEGER NOT NULL,
"reading" TEXT NOT NULL, "reading" TEXT NOT NULL,
@@ -47,7 +48,7 @@ CREATE TABLE "JMdict_KanjiElement" (
"spec" INTEGER CHECK ("spec" BETWEEN 1 AND 2), "spec" INTEGER CHECK ("spec" BETWEEN 1 AND 2),
"gai" INTEGER CHECK ("gai" BETWEEN 1 AND 2), "gai" INTEGER CHECK ("gai" BETWEEN 1 AND 2),
"nf" INTEGER CHECK ("nf" BETWEEN 1 AND 48), "nf" INTEGER CHECK ("nf" BETWEEN 1 AND 48),
PRIMARY KEY ("entryId", "reading"), UNIQUE("entryId", "reading"),
UNIQUE("entryId", "orderNum") UNIQUE("entryId", "orderNum")
) WITHOUT ROWID; ) 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 INDEX "JMdict_KanjiElement_byReading" ON "JMdict_KanjiElement"("reading");
CREATE TABLE "JMdict_KanjiElementInfo" ( CREATE TABLE "JMdict_KanjiElementInfo" (
"entryId" INTEGER NOT NULL, "elementId" INTEGER NOT NULL REFERENCES "JMdict_KanjiElement"("elementId"),
"reading" TEXT NOT NULL,
"info" TEXT NOT NULL REFERENCES "JMdict_InfoKanji"("id"), "info" TEXT NOT NULL REFERENCES "JMdict_InfoKanji"("id"),
FOREIGN KEY ("entryId", "reading") PRIMARY KEY ("elementId", "info")
REFERENCES "JMdict_KanjiElement"("entryId", "reading"),
PRIMARY KEY ("entryId", "reading", "info")
) WITHOUT ROWID; ) WITHOUT ROWID;
-- ReadingElement -- ReadingElement
CREATE TABLE "JMdict_ReadingElement" ( CREATE TABLE "JMdict_ReadingElement" (
"elementId" INTEGER PRIMARY KEY,
"entryId" INTEGER NOT NULL REFERENCES "JMdict_Entry"("entryId"), "entryId" INTEGER NOT NULL REFERENCES "JMdict_Entry"("entryId"),
"orderNum" INTEGER NOT NULL, "orderNum" INTEGER NOT NULL,
"reading" TEXT NOT NULL, "reading" TEXT NOT NULL,
@@ -75,7 +74,7 @@ CREATE TABLE "JMdict_ReadingElement" (
"spec" INTEGER CHECK ("spec" BETWEEN 1 AND 2), "spec" INTEGER CHECK ("spec" BETWEEN 1 AND 2),
"gai" INTEGER CHECK ("gai" BETWEEN 1 AND 2), "gai" INTEGER CHECK ("gai" BETWEEN 1 AND 2),
"nf" INTEGER CHECK ("nf" BETWEEN 1 AND 48), "nf" INTEGER CHECK ("nf" BETWEEN 1 AND 48),
PRIMARY KEY ("entryId", "reading"), UNIQUE("entryId", "reading"),
UNIQUE("entryId", "orderNum") UNIQUE("entryId", "orderNum")
) WITHOUT ROWID; ) 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 INDEX "JMdict_ReadingElement_byReading" ON "JMdict_ReadingElement"("reading");
CREATE TABLE "JMdict_ReadingElementRestriction" ( CREATE TABLE "JMdict_ReadingElementRestriction" (
"entryId" INTEGER NOT NULL, "elementId" INTEGER NOT NULL REFERENCES "JMdict_ReadingElement"("elementId"),
"reading" TEXT NOT NULL,
"restriction" TEXT NOT NULL, "restriction" TEXT NOT NULL,
FOREIGN KEY ("entryId", "reading") PRIMARY KEY ("elementId", "restriction")
REFERENCES "JMdict_ReadingElement"("entryId", "reading"),
PRIMARY KEY ("entryId", "reading", "restriction")
) WITHOUT ROWID; ) WITHOUT ROWID;
CREATE TABLE "JMdict_ReadingElementInfo" ( CREATE TABLE "JMdict_ReadingElementInfo" (
"entryId" INTEGER NOT NULL, "elementId" INTEGER NOT NULL REFERENCES "JMdict_ReadingElement"("elementId"),
"reading" TEXT NOT NULL,
"info" TEXT NOT NULL REFERENCES "JMdict_InfoReading"("id"), "info" TEXT NOT NULL REFERENCES "JMdict_InfoReading"("id"),
FOREIGN KEY ("entryId", "reading") PRIMARY KEY ("elementId", "info")
REFERENCES "JMdict_ReadingElement"("entryId", "reading"),
PRIMARY KEY ("entryId", "reading", "info")
) WITHOUT ROWID; ) WITHOUT ROWID;
-- Sense -- Sense

View File

@@ -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" CREATE TRIGGER "JMdict_KanjiElement_InsertFTS"
AFTER INSERT ON "JMdict_KanjiElement" AFTER INSERT ON "JMdict_KanjiElement"
BEGIN BEGIN
INSERT INTO "JMdict_KanjiElementFTS"("entryId", "reading") INSERT INTO "JMdict_KanjiElementFTS"("elementId", "reading")
VALUES (NEW."entryId", NEW."reading"); VALUES (NEW."elementId", NEW."reading");
END; END;
CREATE TRIGGER "JMdict_KanjiElement_UpdateFTS" CREATE TRIGGER "JMdict_KanjiElement_UpdateFTS"
AFTER UPDATE OF "entryId", "reading" AFTER UPDATE OF "elementId", "reading"
ON "JMdict_KanjiElement" ON "JMdict_KanjiElement"
BEGIN BEGIN
UPDATE "JMdict_KanjiElementFTS" UPDATE "JMdict_KanjiElementFTS"
SET SET
"entryId" = NEW."entryId", "elementId" = NEW."elementId",
"reading" = NEW."reading" "reading" = NEW."reading"
WHERE "entryId" = OLD."entryId"; WHERE "elementId" = OLD."elementId";
END; END;
CREATE TRIGGER "JMdict_KanjiElement_DeleteFTS" CREATE TRIGGER "JMdict_KanjiElement_DeleteFTS"
AFTER DELETE ON "JMdict_KanjiElement" AFTER DELETE ON "JMdict_KanjiElement"
BEGIN BEGIN
DELETE FROM "JMdict_KanjiElementFTS" DELETE FROM "JMdict_KanjiElementFTS"
WHERE "entryId" = OLD."entryId"; WHERE "elementId" = OLD."elementId";
END; 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" CREATE TRIGGER "JMdict_ReadingElement_InsertFTS"
AFTER INSERT ON "JMdict_ReadingElement" AFTER INSERT ON "JMdict_ReadingElement"
BEGIN BEGIN
INSERT INTO "JMdict_ReadingElementFTS"("entryId", "reading") INSERT INTO "JMdict_ReadingElementFTS"("elementId", "reading")
VALUES (NEW."entryId", NEW."reading"); VALUES (NEW."elementId", NEW."reading");
END; END;
CREATE TRIGGER "JMdict_ReadingElement_UpdateFTS" CREATE TRIGGER "JMdict_ReadingElement_UpdateFTS"
AFTER UPDATE OF "entryId", "reading" AFTER UPDATE OF "elementId", "reading"
ON "JMdict_ReadingElement" ON "JMdict_ReadingElement"
BEGIN BEGIN
UPDATE "JMdict_ReadingElementFTS" UPDATE "JMdict_ReadingElementFTS"
SET SET
"entryId" = NEW."entryId", "elementId" = NEW."elementId",
"reading" = NEW."reading" "reading" = NEW."reading"
WHERE "entryId" = OLD."entryId"; WHERE "elementId" = OLD."elementId";
END; END;
CREATE TRIGGER "JMdict_ReadingElement_DeleteFTS" CREATE TRIGGER "JMdict_ReadingElement_DeleteFTS"
AFTER DELETE ON "JMdict_ReadingElement" AFTER DELETE ON "JMdict_ReadingElement"
BEGIN BEGIN
DELETE FROM "JMdict_ReadingElementFTS" DELETE FROM "JMdict_ReadingElementFTS"
WHERE "entryId" = OLD."entryId"; WHERE "elementId" = OLD."elementId";
END; END;

View File

@@ -1,17 +1,16 @@
CREATE TABLE "JMdict_EntryScore" ( CREATE TABLE "JMdict_EntryScore" (
"type" TEXT NOT NULL CHECK ("type" IN ('reading', 'kanji')), "type" TEXT NOT NULL CHECK ("type" IN ('reading', 'kanji')),
"entryId" INTEGER NOT NULL, "elementId" INTEGER NOT NULL,
"reading" TEXT NOT NULL,
"score" INTEGER NOT NULL DEFAULT 0, "score" INTEGER NOT NULL DEFAULT 0,
"common" BOOLEAN NOT NULL DEFAULT FALSE, "common" BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY ("type", "entryId", "reading") PRIMARY KEY ("type", "elementId")
) WITHOUT ROWID; ) 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_byScore" ON "JMdict_EntryScore"("score");
CREATE INDEX "JMdict_EntryScore_byCommon" ON "JMdict_EntryScore"("common"); 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_byScore" ON "JMdict_EntryScore"("type", "score");
CREATE INDEX "JMdict_EntryScore_byType_byCommon" ON "JMdict_EntryScore"("type", "common"); 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 CREATE VIEW "JMdict_EntryScoreView_Reading" AS
SELECT SELECT
'reading' AS "type", 'reading' AS "type",
"JMdict_ReadingElement"."entryId", "JMdict_ReadingElement"."elementId",
"JMdict_ReadingElement"."reading",
( (
"news" IS 1 "news" IS 1
OR "ichi" IS 1 OR "ichi" IS 1
@@ -53,8 +51,7 @@ LEFT JOIN "JMdict_JLPTTag" USING ("entryId");
CREATE VIEW "JMdict_EntryScoreView_Kanji" AS CREATE VIEW "JMdict_EntryScoreView_Kanji" AS
SELECT SELECT
'kanji' AS "type", 'kanji' AS "type",
"JMdict_KanjiElement"."entryId", "JMdict_KanjiElement"."elementId",
"JMdict_KanjiElement"."reading",
( (
"news" IS 1 "news" IS 1
OR "ichi" IS 1 OR "ichi" IS 1
@@ -97,15 +94,13 @@ AFTER INSERT ON "JMdict_ReadingElement"
BEGIN BEGIN
INSERT INTO "JMdict_EntryScore" ( INSERT INTO "JMdict_EntryScore" (
"type", "type",
"entryId", "elementId",
"reading",
"score", "score",
"common" "common"
) )
SELECT "type", "entryId", "reading", "score", "common" SELECT "type", "elementId", "score", "common"
FROM "JMdict_EntryScoreView_Reading" FROM "JMdict_EntryScoreView_Reading"
WHERE "entryId" = NEW."entryId" WHERE "elementId" = NEW."elementId";
AND "reading" = NEW."reading";
END; END;
CREATE TRIGGER "JMdict_EntryScore_Update_JMdict_ReadingElement" CREATE TRIGGER "JMdict_EntryScore_Update_JMdict_ReadingElement"
@@ -117,8 +112,7 @@ BEGIN
"score" = "JMdict_EntryScoreView_Reading"."score", "score" = "JMdict_EntryScoreView_Reading"."score",
"common" = "JMdict_EntryScoreView_Reading"."common" "common" = "JMdict_EntryScoreView_Reading"."common"
FROM "JMdict_EntryScoreView_Reading" FROM "JMdict_EntryScoreView_Reading"
WHERE "entryId" = NEW."entryId" WHERE "elementId" = NEW."elementId";
AND "reading" = NEW."reading";
END; END;
CREATE TRIGGER "JMdict_EntryScore_Delete_JMdict_ReadingElement" CREATE TRIGGER "JMdict_EntryScore_Delete_JMdict_ReadingElement"
@@ -126,8 +120,7 @@ AFTER DELETE ON "JMdict_ReadingElement"
BEGIN BEGIN
DELETE FROM "JMdict_EntryScore" DELETE FROM "JMdict_EntryScore"
WHERE "type" = 'reading' WHERE "type" = 'reading'
AND "entryId" = OLD."entryId" AND "elementId" = OLD."elementId";
AND "reading" = OLD."reading";
END; END;
--- JMdict_KanjiElement triggers --- JMdict_KanjiElement triggers
@@ -137,15 +130,13 @@ AFTER INSERT ON "JMdict_KanjiElement"
BEGIN BEGIN
INSERT INTO "JMdict_EntryScore" ( INSERT INTO "JMdict_EntryScore" (
"type", "type",
"entryId", "elementId",
"reading",
"score", "score",
"common" "common"
) )
SELECT "type", "entryId", "reading", "score", "common" SELECT "type", "elementId", "score", "common"
FROM "JMdict_EntryScoreView_Kanji" FROM "JMdict_EntryScoreView_Kanji"
WHERE "entryId" = NEW."entryId" WHERE "elementId" = NEW."elementId";
AND "reading" = NEW."reading";
END; END;
CREATE TRIGGER "JMdict_EntryScore_Update_JMdict_KanjiElement" CREATE TRIGGER "JMdict_EntryScore_Update_JMdict_KanjiElement"
@@ -157,8 +148,7 @@ BEGIN
"score" = "JMdict_EntryScoreView_Kanji"."score", "score" = "JMdict_EntryScoreView_Kanji"."score",
"common" = "JMdict_EntryScoreView_Kanji"."common" "common" = "JMdict_EntryScoreView_Kanji"."common"
FROM "JMdict_EntryScoreView_Kanji" FROM "JMdict_EntryScoreView_Kanji"
WHERE "entryId" = NEW."entryId" WHERE "elementId" = NEW."elementId";
AND "reading" = NEW."reading";
END; END;
CREATE TRIGGER "JMdict_EntryScore_Delete_JMdict_KanjiElement" CREATE TRIGGER "JMdict_EntryScore_Delete_JMdict_KanjiElement"
@@ -166,8 +156,7 @@ AFTER DELETE ON "JMdict_KanjiElement"
BEGIN BEGIN
DELETE FROM "JMdict_EntryScore" DELETE FROM "JMdict_EntryScore"
WHERE "type" = 'kanji' WHERE "type" = 'kanji'
AND "entryId" = OLD."entryId" AND "elementId" = OLD."elementId";
AND "reading" = OLD."reading";
END; END;
--- JMdict_JLPTTag triggers --- JMdict_JLPTTag triggers
@@ -180,7 +169,24 @@ BEGIN
"score" = "JMdict_EntryScoreView"."score", "score" = "JMdict_EntryScoreView"."score",
"common" = "JMdict_EntryScoreView"."common" "common" = "JMdict_EntryScoreView"."common"
FROM "JMdict_EntryScoreView" 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"."entryId" = "JMdict_EntryScore"."entryId"
AND "JMdict_EntryScoreView"."reading" = "JMdict_EntryScore"."reading"; AND "JMdict_EntryScoreView"."reading" = "JMdict_EntryScore"."reading";
END; END;
@@ -194,7 +200,24 @@ BEGIN
"score" = "JMdict_EntryScoreView"."score", "score" = "JMdict_EntryScoreView"."score",
"common" = "JMdict_EntryScoreView"."common" "common" = "JMdict_EntryScoreView"."common"
FROM "JMdict_EntryScoreView" 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"."entryId" = "JMdict_EntryScore"."entryId"
AND "JMdict_EntryScoreView"."reading" = "JMdict_EntryScore"."reading"; AND "JMdict_EntryScoreView"."reading" = "JMdict_EntryScore"."reading";
END; END;
@@ -207,7 +230,24 @@ BEGIN
"score" = "JMdict_EntryScoreView"."score", "score" = "JMdict_EntryScoreView"."score",
"common" = "JMdict_EntryScoreView"."common" "common" = "JMdict_EntryScoreView"."common"
FROM "JMdict_EntryScoreView" 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"."entryId" = "JMdict_EntryScore"."entryId"
AND "JMdict_EntryScoreView"."reading" = "JMdict_EntryScore"."reading"; AND "JMdict_EntryScoreView"."reading" = "JMdict_EntryScore"."reading";
END; END;

View File

@@ -77,8 +77,13 @@ SELECT DISTINCT "radical" FROM "RADKFILE";
CREATE VIEW "JMdict_CombinedEntryScore" CREATE VIEW "JMdict_CombinedEntryScore"
AS AS
SELECT 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"."score") AS "score",
MAX("JMdict_EntryScore"."common") AS "common" MAX("JMdict_EntryScore"."common") AS "common"
FROM "JMdict_EntryScore" FROM "JMdict_EntryScore"
GROUP BY "JMdict_EntryScore"."entryId"; GROUP BY "entryId";