From 9632b9095212d666e66fcbd1832fa072fe43d5f2 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Sat, 28 Feb 2026 18:57:57 +0900 Subject: [PATCH] search/kanji: split queries into separate functions --- lib/search/kanji_search.dart | 254 +++++++++++++++++++++-------------- 1 file changed, 150 insertions(+), 104 deletions(-) diff --git a/lib/search/kanji_search.dart b/lib/search/kanji_search.dart index f975e95..99e5180 100644 --- a/lib/search/kanji_search.dart +++ b/lib/search/kanji_search.dart @@ -5,140 +5,186 @@ import 'package:jadb/table_names/kanjidic.dart'; import 'package:jadb/table_names/radkfile.dart'; import 'package:sqflite_common/sqflite.dart'; +Future>> _charactersQuery( + DatabaseExecutor connection, + String kanji, +) => connection.query( + KANJIDICTableNames.character, + where: 'literal = ?', + whereArgs: [kanji], +); + +Future>> _codepointsQuery( + DatabaseExecutor connection, + String kanji, +) => connection.query( + KANJIDICTableNames.codepoint, + where: 'kanji = ?', + whereArgs: [kanji], +); + +Future>> _kunyomisQuery( + DatabaseExecutor connection, + String kanji, +) => connection.query( + KANJIDICTableNames.kunyomi, + where: 'kanji = ?', + whereArgs: [kanji], + orderBy: 'orderNum', +); + +Future>> _onyomisQuery( + DatabaseExecutor connection, + String kanji, +) => connection.query( + KANJIDICTableNames.onyomi, + where: 'kanji = ?', + whereArgs: [kanji], + orderBy: 'orderNum', +); + +Future>> _meaningsQuery( + DatabaseExecutor connection, + String kanji, +) => connection.query( + KANJIDICTableNames.meaning, + where: 'kanji = ? AND language = ?', + whereArgs: [kanji, 'eng'], + orderBy: 'orderNum', +); + +Future>> _nanorisQuery( + DatabaseExecutor connection, + String kanji, +) => connection.query( + KANJIDICTableNames.nanori, + where: 'kanji = ?', + whereArgs: [kanji], +); + +Future>> _dictionaryReferencesQuery( + DatabaseExecutor connection, + String kanji, +) => connection.query( + KANJIDICTableNames.dictionaryReference, + where: 'kanji = ?', + whereArgs: [kanji], +); + +Future>> _queryCodesQuery( + DatabaseExecutor connection, + String kanji, +) => connection.query( + KANJIDICTableNames.queryCode, + where: 'kanji = ?', + whereArgs: [kanji], +); + +Future>> _radicalsQuery( + DatabaseExecutor connection, + String kanji, +) => connection.rawQuery( + ''' + SELECT DISTINCT + "XREF__KANJIDIC_Radical__RADKFILE"."radicalSymbol" AS "symbol", + "names" + FROM "${KANJIDICTableNames.radical}" + JOIN "XREF__KANJIDIC_Radical__RADKFILE" USING ("radicalId") + LEFT JOIN ( + SELECT "radicalId", group_concat("name") AS "names" + FROM "${KANJIDICTableNames.radicalName}" + GROUP BY "radicalId" + ) USING ("radicalId") + WHERE "${KANJIDICTableNames.radical}"."kanji" = ? + ''', + [kanji], +); + +Future>> _partsQuery( + DatabaseExecutor connection, + String kanji, +) => connection.query( + RADKFILETableNames.radkfile, + where: 'kanji = ?', + whereArgs: [kanji], +); + +Future>> _readingsQuery( + DatabaseExecutor connection, + String kanji, +) => connection.query( + KANJIDICTableNames.reading, + where: 'kanji = ?', + whereArgs: [kanji], +); + +Future>> _strokeMiscountsQuery( + DatabaseExecutor connection, + String kanji, +) => connection.query( + KANJIDICTableNames.strokeMiscount, + where: 'kanji = ?', + whereArgs: [kanji], +); + +// Future>> _variantsQuery( +// DatabaseExecutor connection, +// String kanji, +// ) => connection.query( +// KANJIDICTableNames.variant, +// where: 'kanji = ?', +// whereArgs: [kanji], +// ); + /// Searches for a kanji character and returns its details, or null if the kanji is not found in the database. Future searchKanjiWithDbConnection( DatabaseExecutor connection, String kanji, ) async { late final List> characters; - final charactersQuery = connection.query( - KANJIDICTableNames.character, - where: 'literal = ?', - whereArgs: [kanji], - ); - late final List> codepoints; - final codepointsQuery = connection.query( - KANJIDICTableNames.codepoint, - where: 'kanji = ?', - whereArgs: [kanji], - ); - late final List> kunyomis; - final kunyomisQuery = connection.query( - KANJIDICTableNames.kunyomi, - where: 'kanji = ?', - whereArgs: [kanji], - orderBy: 'orderNum', - ); - late final List> onyomis; - final onyomisQuery = connection.query( - KANJIDICTableNames.onyomi, - where: 'kanji = ?', - whereArgs: [kanji], - orderBy: 'orderNum', - ); - late final List> meanings; - final meaningsQuery = connection.query( - KANJIDICTableNames.meaning, - where: 'kanji = ? AND language = ?', - whereArgs: [kanji, 'eng'], - orderBy: 'orderNum', - ); - late final List> nanoris; - final nanorisQuery = connection.query( - KANJIDICTableNames.nanori, - where: 'kanji = ?', - whereArgs: [kanji], - ); - late final List> dictionaryReferences; - final dictionaryReferencesQuery = connection.query( - KANJIDICTableNames.dictionaryReference, - where: 'kanji = ?', - whereArgs: [kanji], - ); - late final List> queryCodes; - final queryCodesQuery = connection.query( - KANJIDICTableNames.queryCode, - where: 'kanji = ?', - whereArgs: [kanji], - ); - late final List> radicals; - final radicalsQuery = connection.rawQuery( - ''' - SELECT DISTINCT - "XREF__KANJIDIC_Radical__RADKFILE"."radicalSymbol" AS "symbol", - "names" - FROM "${KANJIDICTableNames.radical}" - JOIN "XREF__KANJIDIC_Radical__RADKFILE" USING ("radicalId") - LEFT JOIN ( - SELECT "radicalId", group_concat("name") AS "names" - FROM "${KANJIDICTableNames.radicalName}" - GROUP BY "radicalId" - ) USING ("radicalId") - WHERE "${KANJIDICTableNames.radical}"."kanji" = ? - ''', - [kanji], - ); - late final List> parts; - final partsQuery = connection.query( - RADKFILETableNames.radkfile, - where: 'kanji = ?', - whereArgs: [kanji], - ); - late final List> readings; - final readingsQuery = connection.query( - KANJIDICTableNames.reading, - where: 'kanji = ?', - whereArgs: [kanji], - ); - late final List> strokeMiscounts; - final strokeMiscountsQuery = connection.query( - KANJIDICTableNames.strokeMiscount, - where: 'kanji = ?', - whereArgs: [kanji], - ); - // TODO: add variant data to result // late final List> variants; - // final variants_query = connection.query( - // KANJIDICTableNames.variant, - // where: "kanji = ?", - // whereArgs: [kanji], - // ); // TODO: Search for kunyomi and onyomi usage of the characters - // from JMDict. We'll need to fuzzy aquery JMDict_KanjiElement for mathces, + // from JMDict. We'll need to fuzzy aquery JMDict_KanjiElement for matches, // filter JMdict_ReadingElement for kunyomi/onyomi, and then sort the main entry // by JLPT, news frequency, etc. - await charactersQuery.then((value) => characters = value); + await _charactersQuery(connection, kanji).then((value) => characters = value); if (characters.isEmpty) { return null; } await Future.wait({ - codepointsQuery.then((value) => codepoints = value), - kunyomisQuery.then((value) => kunyomis = value), - onyomisQuery.then((value) => onyomis = value), - meaningsQuery.then((value) => meanings = value), - nanorisQuery.then((value) => nanoris = value), - dictionaryReferencesQuery.then((value) => dictionaryReferences = value), - queryCodesQuery.then((value) => queryCodes = value), - radicalsQuery.then((value) => radicals = value), - partsQuery.then((value) => parts = value), - readingsQuery.then((value) => readings = value), - strokeMiscountsQuery.then((value) => strokeMiscounts = value), + _codepointsQuery(connection, kanji).then((value) => codepoints = value), + _kunyomisQuery(connection, kanji).then((value) => kunyomis = value), + _onyomisQuery(connection, kanji).then((value) => onyomis = value), + _meaningsQuery(connection, kanji).then((value) => meanings = value), + _nanorisQuery(connection, kanji).then((value) => nanoris = value), + _dictionaryReferencesQuery( + connection, + kanji, + ).then((value) => dictionaryReferences = value), + _queryCodesQuery(connection, kanji).then((value) => queryCodes = value), + _radicalsQuery(connection, kanji).then((value) => radicals = value), + _partsQuery(connection, kanji).then((value) => parts = value), + _readingsQuery(connection, kanji).then((value) => readings = value), + _strokeMiscountsQuery( + connection, + kanji, + ).then((value) => strokeMiscounts = value), // variants_query.then((value) => variants = value), });