migrations: combine score tables

This commit is contained in:
2025-05-23 15:27:56 +02:00
parent 03a8e11d91
commit f819280268
3 changed files with 141 additions and 157 deletions

View File

@@ -41,28 +41,31 @@ SearchMode _determineSearchMode(String word) {
"${tableName}FTS"."entryId",
100
+ (("${tableName}FTS"."reading" = ?) * 50)
+ "${tableName}Score"."score"
+ "JMdict_EntryScore"."score"
AS "score"
FROM "${tableName}FTS"
JOIN "${tableName}" USING ("entryId", "reading")
JOIN "${tableName}Score" USING ("entryId", "reading")
JOIN "JMdict_EntryScore" USING ("entryId", "reading")
WHERE "${tableName}FTS"."reading" MATCH ? || '*'
ORDER BY "score" DESC
AND "JMdict_EntryScore"."type" = '${tableName == JMdictTableNames.kanjiElement ? 'kanji' : 'reading'}'
ORDER BY
"JMdict_EntryScore"."score" DESC
${!countOnly ? 'LIMIT ?' : ''}
),
non_fts_results AS (
SELECT DISTINCT
"entryId",
"${tableName}"."entryId",
50
+ "${tableName}Score"."score"
+ "JMdict_EntryScore"."score"
AS "score"
FROM "${tableName}"
JOIN "${tableName}Score" USING ("entryId", "reading")
JOIN "JMdict_EntryScore" USING ("entryId", "reading")
WHERE "reading" LIKE '%' || ? || '%'
AND "entryId" NOT IN (SELECT "entryId" FROM "fts_results")
AND "JMdict_EntryScore"."type" = '${tableName == JMdictTableNames.kanjiElement ? 'kanji' : 'reading'}'
ORDER BY
"score" DESC,
"entryId" ASC
"JMdict_EntryScore"."score" DESC,
"${tableName}"."entryId" ASC
${!countOnly ? 'LIMIT ?' : ''}
)

View File

@@ -1,16 +1,26 @@
CREATE TABLE JMdict_ReadingElementScore (
CREATE TABLE "JMdict_EntryScore" (
"type" TEXT NOT NULL CHECK ("type" IN ('reading', 'kanji')),
"entryId" INTEGER NOT NULL,
"reading" TEXT NOT NULL,
"score" INTEGER NOT NULL DEFAULT 0,
"common" BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY (entryId, reading)
PRIMARY KEY ("type", "entryId", "reading")
) WITHOUT ROWID;
CREATE INDEX "JMdict_ReadingElementScore_byEntryId_byReading_byScore" ON "JMdict_ReadingElementScore"("entryId", "reading", "score");
CREATE INDEX "JMdict_ReadingElementScore_byScore" ON "JMdict_ReadingElementScore"("score");
CREATE INDEX "JMdict_EntryScore_byEntryId_byReading_byScore" ON "JMdict_EntryScore"("entryId", "reading", "score");
CREATE INDEX "JMdict_EntryScore_byScore" ON "JMdict_EntryScore"("score");
CREATE INDEX "JMdict_EntryScore_byCommon" ON "JMdict_EntryScore"("common");
CREATE VIEW "JMdict_ReadingElementScoreView" AS
CREATE INDEX "JMdict_EntryScore_byType_byEntryId_byReading_byScore" ON "JMdict_EntryScore"("type", "entryId", "reading", "score");
CREATE INDEX "JMdict_EntryScore_byType_byScore" ON "JMdict_EntryScore"("type", "score");
CREATE INDEX "JMdict_EntryScore_byType_byCommon" ON "JMdict_EntryScore"("type", "common");
-- NOTE: these views are deduplicated in order not to perform an unnecessary
-- UNION on every trigger
CREATE VIEW "JMdict_EntryScoreView_Reading" AS
SELECT
'reading' AS "type",
"JMdict_ReadingElement"."entryId",
"JMdict_ReadingElement"."reading",
(
@@ -20,7 +30,12 @@ SELECT
OR "gai" IS 1
)
AS "common",
("common" * 50)
((
"news" IS 1
OR "ichi" IS 1
OR "spec" IS 1
OR "gai" IS 1
) * 50)
+ (("news" IS 1) * 10)
+ (("news" IS 2) * 5)
+ (("ichi" IS 1) * 10)
@@ -35,98 +50,9 @@ SELECT
FROM "JMdict_ReadingElement"
LEFT JOIN "JMdict_JLPTTag" USING ("entryId");
-- JMdict_ReadingElement triggers
CREATE TRIGGER "JMdict_ReadingElementScore_Insert"
AFTER INSERT ON "JMdict_ReadingElement"
BEGIN
INSERT INTO "JMdict_ReadingElementScore" (
"entryId",
"reading",
"score",
"common"
)
SELECT "entryId", "reading", "score", "common"
FROM "JMdict_ReadingElementScoreView"
WHERE "entryId" = NEW."entryId" AND "reading" = NEW."reading";
END;
CREATE TRIGGER "JMdict_ReadingElementScore_Update_JMdict_ReadingElement"
AFTER UPDATE OF "news", "ichi", "spec", "gai", "nf", "orderNum"
ON "JMdict_ReadingElement"
BEGIN
UPDATE "JMdict_ReadingElementScore"
SET
"score" = "JMdict_ReadingElementScoreView"."score",
"common" = "JMdict_ReadingElementScoreView"."common"
FROM "JMdict_ReadingElementScoreView"
WHERE "entryId" = NEW."entryId" AND "reading" = NEW."reading";
END;
CREATE TRIGGER "JMdict_ReadingElementScore_Delete_JMdict_ReadingElement"
AFTER DELETE ON "JMdict_ReadingElement"
BEGIN
DELETE FROM "JMdict_ReadingElementScore"
WHERE "entryId" = OLD."entryId" AND "reading" = OLD."reading";
END;
-- JMdict_JLPTTag triggers
CREATE TRIGGER "JMdict_ReadingElementScore_Insert_JMdict_JLPTTag"
AFTER INSERT ON "JMdict_JLPTTag"
BEGIN
UPDATE "JMdict_ReadingElementScore"
SET
"score" = "JMdict_ReadingElementScoreView"."score",
"common" = "JMdict_ReadingElementScoreView"."common"
FROM "JMdict_ReadingElementScoreView"
WHERE "JMdict_ReadingElementScoreView"."entryId" = NEW."entryId"
AND "JMdict_ReadingElementScoreView"."entryId" = "JMdict_ReadingElementScore"."entryId"
AND "JMdict_ReadingElementScoreView"."reading" = "JMdict_ReadingElementScore"."reading";
END;
CREATE TRIGGER "JMdict_ReadingElementScore_Update_JMdict_JLPTTag"
AFTER UPDATE OF "jlptLevel"
ON "JMdict_JLPTTag"
BEGIN
UPDATE "JMdict_ReadingElementScore"
SET
"score" = "JMdict_ReadingElementScoreView"."score",
"common" = "JMdict_ReadingElementScoreView"."common"
FROM "JMdict_ReadingElementScoreView"
WHERE "JMdict_ReadingElementScoreView"."entryId" = NEW."entryId"
AND "JMdict_ReadingElementScoreView"."entryId" = "JMdict_ReadingElementScore"."entryId"
AND "JMdict_ReadingElementScoreView"."reading" = "JMdict_ReadingElementScore"."reading";
END;
CREATE TRIGGER "JMdict_ReadingElementScore_Delete_JMdict_JLPTTag"
AFTER DELETE ON "JMdict_JLPTTag"
BEGIN
UPDATE "JMdict_ReadingElementScore"
SET
"score" = "JMdict_ReadingElementScoreView"."score",
"common" = "JMdict_ReadingElementScoreView"."common"
FROM "JMdict_ReadingElementScoreView"
WHERE "JMdict_ReadingElementScoreView"."entryId" = NEW."entryId"
AND "JMdict_ReadingElementScoreView"."entryId" = "JMdict_ReadingElementScore"."entryId"
AND "JMdict_ReadingElementScoreView"."reading" = "JMdict_ReadingElementScore"."reading";
END;
---
CREATE TABLE JMdict_KanjiElementScore (
"entryId" INTEGER NOT NULL,
"reading" TEXT NOT NULL,
"score" INTEGER NOT NULL DEFAULT 0,
"common" BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY (entryId, reading)
) WITHOUT ROWID;
CREATE INDEX "JMdict_KanjiElementScore_byEntryId_byReading_byScore" ON "JMdict_KanjiElementScore"("entryId", "reading", "score");
CREATE INDEX "JMdict_KanjiElementScore_byScore" ON "JMdict_KanjiElementScore"("score");
CREATE VIEW "JMdict_KanjiElementScoreView" AS
CREATE VIEW "JMdict_EntryScoreView_Kanji" AS
SELECT
'kanji' AS "type",
"JMdict_KanjiElement"."entryId",
"JMdict_KanjiElement"."reading",
(
@@ -136,7 +62,12 @@ SELECT
OR "gai" IS 1
)
AS "common",
("common" * 50)
((
"news" IS 1
OR "ichi" IS 1
OR "spec" IS 1
OR "gai" IS 1
) * 50)
+ (("news" IS 1) * 10)
+ (("news" IS 2) * 5)
+ (("ichi" IS 1) * 10)
@@ -151,79 +82,132 @@ SELECT
FROM "JMdict_KanjiElement"
LEFT JOIN "JMdict_JLPTTag" USING ("entryId");
-- JMdict_KanjiElement triggers
CREATE VIEW "JMdict_EntryScoreView" AS
SELECT *
FROM "JMdict_EntryScoreView_Kanji"
UNION ALL
SELECT *
FROM "JMdict_EntryScoreView_Reading";
CREATE TRIGGER "JMdict_KanjiElementScore_Insert"
AFTER INSERT ON "JMdict_KanjiElement"
--- JMdict_ReadingElement triggers
CREATE TRIGGER "JMdict_EntryScore_Insert_JMdict_ReadingElement"
AFTER INSERT ON "JMdict_ReadingElement"
BEGIN
INSERT INTO "JMdict_KanjiElementScore" (
INSERT INTO "JMdict_EntryScore" (
"type",
"entryId",
"reading",
"score",
"common"
)
SELECT "entryId", "reading", "score", "common"
FROM "JMdict_KanjiElementScoreView"
WHERE "entryId" = NEW."entryId" AND "reading" = NEW."reading";
SELECT "type", "entryId", "reading", "score", "common"
FROM "JMdict_EntryScoreView_Reading"
WHERE "entryId" = NEW."entryId"
AND "reading" = NEW."reading";
END;
CREATE TRIGGER "JMdict_KanjiElementScore_Update_JMdict_KanjiElement"
CREATE TRIGGER "JMdict_EntryScore_Update_JMdict_ReadingElement"
AFTER UPDATE OF "news", "ichi", "spec", "gai", "nf", "orderNum"
ON "JMdict_ReadingElement"
BEGIN
UPDATE "JMdict_EntryScore"
SET
"score" = "JMdict_EntryScoreView_Reading"."score",
"common" = "JMdict_EntryScoreView_Reading"."common"
FROM "JMdict_EntryScoreView_Reading"
WHERE "entryId" = NEW."entryId"
AND "reading" = NEW."reading";
END;
CREATE TRIGGER "JMdict_EntryScore_Delete_JMdict_ReadingElement"
AFTER DELETE ON "JMdict_ReadingElement"
BEGIN
DELETE FROM "JMdict_EntryScore"
WHERE "type" = 'reading'
AND "entryId" = OLD."entryId"
AND "reading" = OLD."reading";
END;
--- JMdict_KanjiElement triggers
CREATE TRIGGER "JMdict_EntryScore_Insert_JMdict_KanjiElement"
AFTER INSERT ON "JMdict_KanjiElement"
BEGIN
INSERT INTO "JMdict_EntryScore" (
"type",
"entryId",
"reading",
"score",
"common"
)
SELECT "type", "entryId", "reading", "score", "common"
FROM "JMdict_EntryScoreView_Kanji"
WHERE "entryId" = NEW."entryId"
AND "reading" = NEW."reading";
END;
CREATE TRIGGER "JMdict_EntryScore_Update_JMdict_KanjiElement"
AFTER UPDATE OF "news", "ichi", "spec", "gai", "nf", "orderNum"
ON "JMdict_KanjiElement"
BEGIN
UPDATE "JMdict_KanjiElementScore"
UPDATE "JMdict_EntryScore"
SET
"score" = "JMdict_KanjiElementScoreView"."score",
"common" = "JMdict_KanjiElementScoreView"."common"
FROM "JMdict_KanjiElementScoreView"
WHERE "entryId" = NEW."entryId" AND "reading" = NEW."reading";
"score" = "JMdict_EntryScoreView_Kanji"."score",
"common" = "JMdict_EntryScoreView_Kanji"."common"
FROM "JMdict_EntryScoreView_Kanji"
WHERE "entryId" = NEW."entryId"
AND "reading" = NEW."reading";
END;
CREATE TRIGGER "JMdict_KanjiElementScore_Delete_JMdict_KanjiElement"
CREATE TRIGGER "JMdict_EntryScore_Delete_JMdict_KanjiElement"
AFTER DELETE ON "JMdict_KanjiElement"
BEGIN
DELETE FROM "JMdict_KanjiElementScore"
WHERE "entryId" = OLD."entryId" AND "reading" = OLD."reading";
DELETE FROM "JMdict_EntryScore"
WHERE "type" = 'kanji'
AND "entryId" = OLD."entryId"
AND "reading" = OLD."reading";
END;
-- JMdict_JLPTTag triggers
--- JMdict_JLPTTag triggers
CREATE TRIGGER "JMdict_KanjiElementScore_Insert_JMdict_JLPTTag"
CREATE TRIGGER "JMdict_EntryScore_Insert_JMdict_JLPTTag"
AFTER INSERT ON "JMdict_JLPTTag"
BEGIN
UPDATE "JMdict_KanjiElementScore"
UPDATE "JMdict_EntryScore"
SET
"score" = "JMdict_KanjiElementScoreView"."score",
"common" = "JMdict_KanjiElementScoreView"."common"
FROM "JMdict_KanjiElementScoreView"
WHERE "JMdict_KanjiElementScoreView"."entryId" = NEW."entryId"
AND "JMdict_KanjiElementScoreView"."entryId" = "JMdict_KanjiElementScore"."entryId"
AND "JMdict_KanjiElementScoreView"."reading" = "JMdict_KanjiElementScore"."reading";
"score" = "JMdict_EntryScoreView"."score",
"common" = "JMdict_EntryScoreView"."common"
FROM "JMdict_EntryScoreView"
WHERE "JMdict_EntryScoreView"."entryId" = NEW."entryId"
AND "JMdict_EntryScoreView"."entryId" = "JMdict_EntryScore"."entryId"
AND "JMdict_EntryScoreView"."reading" = "JMdict_EntryScore"."reading";
END;
CREATE TRIGGER "JMdict_KanjiElementScore_Update_JMdict_JLPTTag"
CREATE TRIGGER "JMdict_EntryScore_Update_JMdict_JLPTTag"
AFTER UPDATE OF "jlptLevel"
ON "JMdict_JLPTTag"
BEGIN
UPDATE "JMdict_KanjiElementScore"
UPDATE "JMdict_EntryScore"
SET
"score" = "JMdict_KanjiElementScoreView"."score",
"common" = "JMdict_KanjiElementScoreView"."common"
FROM "JMdict_KanjiElementScoreView"
WHERE "JMdict_KanjiElementScoreView"."entryId" = NEW."entryId"
AND "JMdict_KanjiElementScoreView"."entryId" = "JMdict_KanjiElementScore"."entryId"
AND "JMdict_KanjiElementScoreView"."reading" = "JMdict_KanjiElementScore"."reading";
"score" = "JMdict_EntryScoreView"."score",
"common" = "JMdict_EntryScoreView"."common"
FROM "JMdict_EntryScoreView"
WHERE "JMdict_EntryScoreView"."entryId" = NEW."entryId"
AND "JMdict_EntryScoreView"."entryId" = "JMdict_EntryScore"."entryId"
AND "JMdict_EntryScoreView"."reading" = "JMdict_EntryScore"."reading";
END;
CREATE TRIGGER "JMdict_KanjiElementScore_Delete_JMdict_JLPTTag"
CREATE TRIGGER "JMdict_EntryScore_Delete_JMdict_JLPTTag"
AFTER DELETE ON "JMdict_JLPTTag"
BEGIN
UPDATE "JMdict_KanjiElementScore"
UPDATE "JMdict_EntryScore"
SET
"score" = "JMdict_KanjiElementScoreView"."score",
"common" = "JMdict_KanjiElementScoreView"."common"
FROM "JMdict_KanjiElementScoreView"
WHERE "JMdict_KanjiElementScoreView"."entryId" = NEW."entryId"
AND "JMdict_KanjiElementScoreView"."entryId" = "JMdict_KanjiElementScore"."entryId"
AND "JMdict_KanjiElementScoreView"."reading" = "JMdict_KanjiElementScore"."reading";
"score" = "JMdict_EntryScoreView"."score",
"common" = "JMdict_EntryScoreView"."common"
FROM "JMdict_EntryScoreView"
WHERE "JMdict_EntryScoreView"."entryId" = NEW."entryId"
AND "JMdict_EntryScoreView"."entryId" = "JMdict_EntryScore"."entryId"
AND "JMdict_EntryScoreView"."reading" = "JMdict_EntryScore"."reading";
END;

View File

@@ -42,15 +42,11 @@ FROM "JMdict_Entry"
LEFT JOIN "JMdict_KanjiElement" USING("entryId")
LEFT JOIN "JMdict_ReadingElement" USING("entryId");
CREATE VIEW "JMdict_EntryCommon"("entryId")
AS
SELECT DISTINCT "entryId"
FROM "JMdict_KanjiElementScore"
FULL OUTER JOIN "JMdict_ReadingElementScore" USING("entryId")
WHERE "JMdict_ReadingElementScore"."common" = 1
OR "JMdict_KanjiElementScore"."common" = 1;
FROM "JMdict_EntryScore"
WHERE "JMdict_EntryScore"."common" = 1;
-- TODO: Make it possible to match words that contain the
-- kanji as an infix
@@ -68,10 +64,11 @@ JOIN "JMdict_KanjiElementFTS"
JOIN "JMdict_KanjiElement"
ON "JMdict_KanjiElementFTS"."entryId" = "JMdict_KanjiElement"."entryId"
AND "JMdict_KanjiElementFTS"."reading" LIKE '%' || "JMdict_KanjiElement"."reading"
JOIN "JMdict_KanjiElementScore"
ON "JMdict_KanjiElement"."entryId" = "JMdict_KanjiElementScore"."entryId"
AND "JMdict_KanjiElement"."reading" = "JMdict_KanjiElementScore"."reading"
WHERE "JMdict_KanjiElementScore"."common";
JOIN "JMdict_EntryScore"
ON "JMdict_EntryScore"."type" = 'kanji'
AND "JMdict_KanjiElement"."entryId" = "JMdict_EntryScore"."entryId"
AND "JMdict_KanjiElement"."reading" = "JMdict_EntryScore"."reading"
WHERE "JMdict_EntryScore"."common" = 1;
CREATE VIEW "RADKFILE_Radicals" AS