migrations: add view for base/furigana queries

This commit is contained in:
2025-05-14 17:12:31 +02:00
parent 78ba1bae1a
commit 8299572225
2 changed files with 57 additions and 38 deletions

View File

@@ -99,23 +99,19 @@ Future<List<WordSearchResult>?> searchWordWithDbConnection(
JMdict_SenseAntonym.senseId,
JMdict_SenseAntonym.ambiguous,
JMdict_SenseAntonym.xrefEntryId,
JMdict_KanjiElementDistinct.reading AS kanji,
JMdict_ReadingElementDistinct.reading AS reading
JMdict_BaseAndFurigana.base,
JMdict_BaseAndFurigana.furigana
FROM JMdict_SenseAntonym
LEFT JOIN
(SELECT entryId, reading FROM JMdict_KanjiElement GROUP BY entryId HAVING MIN(orderNum))
AS JMdict_KanjiElementDistinct
ON JMdict_SenseAntonym.xrefEntryId = JMdict_KanjiElementDistinct.entryId
LEFT JOIN
(SELECT entryId, reading FROM JMdict_ReadingElement GROUP BY entryId HAVING MIN(orderNum))
AS JMdict_ReadingElementDistinct
ON JMdict_SenseAntonym.xrefEntryId = JMdict_ReadingElementDistinct.entryId
WHERE senseId IN (${senseIds.join(',')})
JOIN "JMdict_BaseAndFurigana"
ON JMdict_SenseAntonym.xrefEntryId = JMdict_BaseAndFurigana.entryId
WHERE
senseId IN (${senseIds.join(',')})
AND COALESCE("JMdict_BaseAndFurigana"."kanjiOrderNum", 1)
+ "JMdict_BaseAndFurigana"."readingOrderNum"
= 2
ORDER BY
JMdict_SenseAntonym.senseId,
JMdict_SenseAntonym.xrefEntryId,
JMdict_KanjiElementDistinct.reading,
JMdict_ReadingElementDistinct.reading
JMdict_SenseAntonym.xrefEntryId
""");
late final List<Map<String, Object?>> senseDialects;
@@ -184,23 +180,19 @@ Future<List<WordSearchResult>?> searchWordWithDbConnection(
JMdict_SenseSeeAlso.senseId,
JMdict_SenseSeeAlso.ambiguous,
JMdict_SenseSeeAlso.xrefEntryId,
JMdict_KanjiElementDistinct.reading AS kanji,
JMdict_ReadingElementDistinct.reading AS reading
JMdict_BaseAndFurigana.base,
JMdict_BaseAndFurigana.furigana
FROM JMdict_SenseSeeAlso
LEFT JOIN
(SELECT entryId, reading FROM JMdict_KanjiElement GROUP BY entryId HAVING MIN(orderNum))
AS JMdict_KanjiElementDistinct
ON JMdict_SenseSeeAlso.xrefEntryId = JMdict_KanjiElementDistinct.entryId
LEFT JOIN
(SELECT entryId, reading FROM JMdict_ReadingElement GROUP BY entryId HAVING MIN(orderNum))
AS JMdict_ReadingElementDistinct
ON JMdict_SenseSeeAlso.xrefEntryId = JMdict_ReadingElementDistinct.entryId
WHERE senseId IN (${senseIds.join(',')})
JOIN "JMdict_BaseAndFurigana"
ON JMdict_SenseSeeAlso.xrefEntryId = JMdict_BaseAndFurigana.entryId
WHERE
senseId IN (${senseIds.join(',')})
AND COALESCE("JMdict_BaseAndFurigana"."kanjiOrderNum", 1)
+ "JMdict_BaseAndFurigana"."readingOrderNum"
= 2
ORDER BY
JMdict_SenseSeeAlso.senseId,
JMdict_SenseSeeAlso.xrefEntryId,
JMdict_KanjiElementDistinct.reading,
JMdict_ReadingElementDistinct.reading
JMdict_SenseSeeAlso.xrefEntryId
""");
late final List<Map<String, Object?>> exampleSentences;
@@ -531,20 +523,16 @@ List<WordSearchSense> _regroup_senses({
seeAlso: seeAlsos
.map((e) => WordSearchXrefEntry(
entryId: e['xrefEntryId'] as int,
baseWord: (e['kanji'] ?? e['reading']) as String,
furigana: (e['kanji'] != null) ?
(e['reading'] as String) :
null,
baseWord: e['base'] as String,
furigana: e['furigana'] as String?,
ambiguous: e['ambiguous'] == 1,
))
.toList(),
antonyms: antonyms
.map((e) => WordSearchXrefEntry(
entryId: e['xrefEntryId'] as int,
baseWord: (e['kanji'] ?? e['reading']) as String,
furigana: (e['kanji'] != null) ?
(e['reading'] as String) :
null,
baseWord: e['base'] as String,
furigana: e['furigana'] as String?,
ambiguous: e['ambiguous'] == 1,
))
.toList(),

View File

@@ -47,9 +47,11 @@ 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")
PRIMARY KEY ("entryId", "reading"),
UNIQUE("entryId", "orderNum")
) WITHOUT ROWID;
CREATE INDEX "JMdict_KanjiElement_byEntryId_byOrderNum" ON "JMdict_KanjiElement"("entryId", "orderNum");
CREATE INDEX "JMdict_KanjiElement_byReading" ON "JMdict_KanjiElement"("reading");
CREATE TABLE "JMdict_KanjiElementInfo" (
@@ -73,9 +75,11 @@ 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")
PRIMARY KEY ("entryId", "reading"),
UNIQUE("entryId", "orderNum")
) WITHOUT ROWID;
CREATE INDEX "JMdict_ReadingElement_byEntryId_byOrderNum" ON "JMdict_ReadingElement"("entryId", "orderNum");
CREATE INDEX "JMdict_ReadingElement_byReading" ON "JMdict_ReadingElement"("reading");
CREATE TABLE "JMdict_ReadingElementRestriction" (
@@ -237,6 +241,8 @@ CREATE TABLE "JMdict_ExampleSentence" (
-- "type" TEXT NOT NULL DEFAULT "tat",
);
---
CREATE VIEW "JMdict_EntryByKana"("kana", "entryId")
AS
SELECT
@@ -244,9 +250,34 @@ SELECT
"JMdict_ReadingElement"."entryId" AS "entryId"
FROM "JMdict_ReadingElement";
CREATE VIEW "JMdict_EntryByEnglish"("english", "entryId")
AS
SELECT
"JMdict_SenseGlossary"."phrase" AS "english",
"JMdict_Sense"."senseId" AS "entryId"
FROM "JMdict_SenseGlossary" JOIN "JMdict_Sense" USING("senseId");
CREATE VIEW "JMdict_BaseAndFurigana"("entryId", "base", "furigana", "kanjiOrderNum", "readingOrderNum")
AS
SELECT
"JMdict_Entry"."entryId" AS "entryId",
CASE WHEN (
"JMdict_KanjiElement"."reading" IS NOT NULL
AND NOT "JMdict_ReadingElement"."readingDoesNotMatchKanji"
)
THEN "JMdict_KanjiElement"."reading"
ELSE "JMdict_ReadingElement"."reading"
END AS "base",
CASE WHEN (
"JMdict_KanjiElement"."reading" IS NOT NULL
AND NOT "JMdict_ReadingElement"."readingDoesNotMatchKanji"
)
THEN "JMdict_ReadingElement"."reading"
ELSE NULL
END AS "furigana",
"JMdict_KanjiElement"."orderNum" AS "kanjiOrderNum",
"JMdict_ReadingElement"."orderNum" AS "readingOrderNum"
FROM "JMdict_Entry"
LEFT JOIN "JMdict_KanjiElement" USING("entryId")
LEFT JOIN "JMdict_ReadingElement" USING("entryId");