diff --git a/lib/search.dart b/lib/search.dart index cb152e4..66956d7 100644 --- a/lib/search.dart +++ b/lib/search.dart @@ -34,12 +34,14 @@ extension JaDBConnection on DatabaseExecutor { Future?> jadbSearchWord( String word, { SearchMode searchMode = SearchMode.auto, + fuzzyKana = true, int page = 0, int? pageSize, }) => searchWordWithDbConnection( this, word, searchMode: searchMode, + fuzzyKana: fuzzyKana, page: page, pageSize: pageSize, ); @@ -62,7 +64,13 @@ extension JaDBConnection on DatabaseExecutor { Future jadbSearchWordCount( String word, { SearchMode searchMode = SearchMode.auto, - }) => searchWordCountWithDbConnection(this, word, searchMode: searchMode); + bool fuzzyKana = true, + }) => searchWordCountWithDbConnection( + this, + word, + searchMode: searchMode, + fuzzyKana: fuzzyKana, + ); /// Given a list of radicals, search which kanji contains all /// of the radicals, find their other radicals, and return those. diff --git a/lib/search/word_search/entry_id_query.dart b/lib/search/word_search/entry_id_query.dart index b64d861..a31b09a 100644 --- a/lib/search/word_search/entry_id_query.dart +++ b/lib/search/word_search/entry_id_query.dart @@ -74,10 +74,9 @@ String _filterFTSSensitiveCharacters(String word) { + (("$tableName"."orderNum" = 0) * 20) + COALESCE("JMdict_EntryScore"."score", 0) AS "score" - FROM "${tableName}FTS" - JOIN "$tableName" USING ("elementId") + ${fuzzyKana ? 'FROM "${tableName}FTS" JOIN "$tableName" USING ("elementId")' : 'FROM "$tableName"'} LEFT JOIN "JMdict_EntryScore" USING ("elementId") - WHERE "${tableName}FTS"."reading" MATCH ${fuzzyKana ? 'normalize_jp(?1)' : '?1'} || '*' + ${fuzzyKana ? 'WHERE "${tableName}FTS"."reading" MATCH normalize_jp(?1) || \'*\'' : 'WHERE "$tableName"."reading" LIKE \'?1\' || \'%\''} ), non_fts_results AS ( SELECT DISTINCT @@ -135,10 +134,15 @@ Future> _queryKanji( ); } -Future _queryKanjiCount(DatabaseExecutor connection, String word) { +Future _queryKanjiCount( + DatabaseExecutor connection, + String word, + bool fuzzyKana, +) { final (query, args) = _kanjiReadingTemplate( JMdictTableNames.kanjiElement, word, + fuzzyKana: fuzzyKana, countOnly: true, ); return connection @@ -172,10 +176,15 @@ Future> _queryKana( ); } -Future _queryKanaCount(DatabaseExecutor connection, String word) { +Future _queryKanaCount( + DatabaseExecutor connection, + String word, + bool fuzzyKana, +) { final (query, args) = _kanjiReadingTemplate( JMdictTableNames.readingElement, word, + fuzzyKana: fuzzyKana, countOnly: true, ); return connection @@ -297,6 +306,7 @@ Future fetchEntryIdCount( DatabaseExecutor connection, String word, SearchMode searchMode, + bool fuzzyKana, ) async { if (searchMode == SearchMode.auto) { searchMode = _determineSearchMode(word); @@ -308,11 +318,11 @@ Future fetchEntryIdCount( switch (searchMode) { case SearchMode.kanji: - entryIdCount = await _queryKanjiCount(connection, word); + entryIdCount = await _queryKanjiCount(connection, word, fuzzyKana); break; case SearchMode.kana: - entryIdCount = await _queryKanaCount(connection, word); + entryIdCount = await _queryKanaCount(connection, word, fuzzyKana); break; case SearchMode.english: diff --git a/lib/search/word_search/word_search.dart b/lib/search/word_search/word_search.dart index b348a18..aafa563 100644 --- a/lib/search/word_search/word_search.dart +++ b/lib/search/word_search/word_search.dart @@ -84,6 +84,7 @@ Future searchWordCountWithDbConnection( DatabaseExecutor connection, String word, { SearchMode searchMode = SearchMode.auto, + bool fuzzyKana = true, }) async { if (word.isEmpty) { return null; @@ -93,6 +94,7 @@ Future searchWordCountWithDbConnection( connection, word, searchMode, + fuzzyKana, ); return entryIdCount;