From 9898793bca99aa8d1a22f4671b6d1938a8862b67 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 14 May 2025 17:12:28 +0200 Subject: [PATCH] Convert `entryBy*` tables into views --- lib/_data_ingestion/jmdict/seed_data.dart | 36 +++---------------- lib/_data_ingestion/jmdict/table_names.dart | 4 --- lib/cli/commands/query_word.dart | 2 +- migrations/0001_JMDict.sql | 14 ++++++++ .../0007_JMdict_Entry_lookup_tables.sql | 22 ------------ ...JLPT_TAGS.sql => 0007_TANOS_JLPT_TAGS.sql} | 0 6 files changed, 20 insertions(+), 58 deletions(-) delete mode 100644 migrations/0007_JMdict_Entry_lookup_tables.sql rename migrations/{0008_TANOS_JLPT_TAGS.sql => 0007_TANOS_JLPT_TAGS.sql} (100%) diff --git a/lib/_data_ingestion/jmdict/seed_data.dart b/lib/_data_ingestion/jmdict/seed_data.dart index 909931a..3986ca5 100644 --- a/lib/_data_ingestion/jmdict/seed_data.dart +++ b/lib/_data_ingestion/jmdict/seed_data.dart @@ -3,7 +3,6 @@ import 'dart:collection'; import 'package:collection/collection.dart'; import 'package:jadb/_data_ingestion/jmdict/objects.dart'; import 'package:jadb/_data_ingestion/jmdict/table_names.dart'; -import 'package:jadb/util/romaji_transliteration.dart'; import 'package:sqflite_common/sqlite_api.dart'; class ResolvedXref { @@ -75,13 +74,11 @@ Future seedJMDictData(List entries, Database db) async { for (final e in entries) { b.insert(JMdictTableNames.entry, e.sqlValue); for (final k in e.kanji) { - b.insert(JMdictTableNames.kanjiElement, k.sqlValue..addAll({'entryId': e.id})); - // b.insert( - // JMdictTableNames.entryByKana, - // {'entryId': e.id, 'kana': transliterateKatakanaToHiragana(k.reading)}, - // // Some entries have the same reading twice with difference in katakana and hiragana - // conflictAlgorithm: ConflictAlgorithm.ignore, - // ); + b.insert( + JMdictTableNames.kanjiElement, + k.sqlValue..addAll({'entryId': e.id}), + ); + for (final i in k.info) { b.insert( JMdictTableNames.kanjiInfo, @@ -99,15 +96,6 @@ Future seedJMDictData(List entries, Database db) async { r.sqlValue..addAll({'entryId': e.id}), ); - b.insert( - JMdictTableNames.entryByKana, - { - 'entryId': e.id, - 'kana': transliterateKanaToLatin(r.reading), - }, - // Some entries have the same reading twice with difference in katakana and hiragana - conflictAlgorithm: ConflictAlgorithm.ignore, - ); for (final i in r.info) { b.insert( JMdictTableNames.readingInfo, @@ -129,20 +117,6 @@ Future seedJMDictData(List entries, Database db) async { ); } } - - for (final s in e.senses) { - for (final g in s.glossary) { - b.insert( - JMdictTableNames.entryByEnglish, - { - 'entryId': e.id, - 'english': g.phrase, - }, - // Some entries have the same reading twice with difference in katakana and hiragana - conflictAlgorithm: ConflictAlgorithm.ignore, - ); - } - } } await b.commit(noResult: true); diff --git a/lib/_data_ingestion/jmdict/table_names.dart b/lib/_data_ingestion/jmdict/table_names.dart index 8f0c61b..01d933f 100644 --- a/lib/_data_ingestion/jmdict/table_names.dart +++ b/lib/_data_ingestion/jmdict/table_names.dart @@ -1,7 +1,5 @@ abstract class JMdictTableNames { static const String entry = 'JMdict_Entry'; - static const String entryByKana = 'JMdict_EntryByKana'; - static const String entryByEnglish = 'JMdict_EntryByEnglish'; static const String kanjiElement = 'JMdict_KanjiElement'; static const String kanjiInfo = 'JMdict_KanjiElementInfo'; static const String readingElement = 'JMdict_ReadingElement'; @@ -23,8 +21,6 @@ abstract class JMdictTableNames { static Set get allTables => { entry, - entryByKana, - entryByEnglish, kanjiElement, kanjiInfo, readingElement, diff --git a/lib/cli/commands/query_word.dart b/lib/cli/commands/query_word.dart index 40db894..9054ace 100644 --- a/lib/cli/commands/query_word.dart +++ b/lib/cli/commands/query_word.dart @@ -29,7 +29,7 @@ class QueryWord extends Command { libsqlitePath: argResults!.option('libsqlite')!, ); - final result = await JaDBConnection(db).searchWord('kana'); + final result = await JaDBConnection(db).searchWord('かな'); if (result == null) { print("Invalid search"); diff --git a/migrations/0001_JMDict.sql b/migrations/0001_JMDict.sql index c6b29ab..e40f41b 100644 --- a/migrations/0001_JMDict.sql +++ b/migrations/0001_JMDict.sql @@ -240,3 +240,17 @@ CREATE TABLE "JMdict_ExampleSentence" ( "japanese" TEXT NOT NULL -- "type" TEXT NOT NULL DEFAULT "tat", ); + +CREATE VIEW "JMdict_EntryByKana"("kana", "entryId") +AS +SELECT + "JMdict_ReadingElement"."reading" AS "kana", + "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"); diff --git a/migrations/0007_JMdict_Entry_lookup_tables.sql b/migrations/0007_JMdict_Entry_lookup_tables.sql deleted file mode 100644 index 7a51c21..0000000 --- a/migrations/0007_JMdict_Entry_lookup_tables.sql +++ /dev/null @@ -1,22 +0,0 @@ --- These tables are for optimizing searches. - --- In order to include results from both, the software should --- first check if the searchword is convertible to kana, and then --- potentially get results from both by doing a union between two --- selects. - -CREATE TABLE "JMdict_EntryByKana" ( - "kana" TEXT NOT NULL, - "entryId" INTEGER NOT NULL REFERENCES "JMdict_Entry"("id"), - PRIMARY KEY ("kana", "entryId") -) WITHOUT ROWID; - -CREATE INDEX "JMdict_EntryByKana_byKana" ON "JMdict_EntryByKana"("kana"); - -CREATE TABLE "JMdict_EntryByEnglish" ( - "english" TEXT NOT NULL, - "entryId" INTEGER NOT NULL REFERENCES "JMdict_Entry"("id"), - PRIMARY KEY ("english", "entryId") -) WITHOUT ROWID; - -CREATE INDEX "JMdict_EntryByEnglish_byEnglish" ON "JMdict_EntryByEnglish"("english"); diff --git a/migrations/0008_TANOS_JLPT_TAGS.sql b/migrations/0007_TANOS_JLPT_TAGS.sql similarity index 100% rename from migrations/0008_TANOS_JLPT_TAGS.sql rename to migrations/0007_TANOS_JLPT_TAGS.sql