diff --git a/lib/search/word_search/entry_id_query.dart b/lib/search/word_search/entry_id_query.dart index e7f5161..4df41b4 100644 --- a/lib/search/word_search/entry_id_query.dart +++ b/lib/search/word_search/entry_id_query.dart @@ -46,6 +46,7 @@ String _filterFTSSensitiveCharacters(String word) { int? pageSize, int? offset, bool countOnly = false, + bool kanaIndependent = true, }) { assert( tableName == JMdictTableNames.kanjiElement || @@ -68,7 +69,7 @@ String _filterFTSSensitiveCharacters(String word) { "$tableName"."entryId", 100 + (("$tableName"."reading" = ?1) * 100000) - + (("${tableName}FTS"."reading" = normalize_jp(?1)) * 10000) + ${kanaIndependent ? '+ (("${tableName}FTS"."reading" = normalize_jp(?1)) * 10000)' : ''} + (("$tableName"."reading" LIKE ?1 || '%') * 20) + (("$tableName"."orderNum" = 0) * 20) + COALESCE("JMdict_EntryScore"."score", 0) @@ -76,7 +77,7 @@ String _filterFTSSensitiveCharacters(String word) { FROM "${tableName}FTS" JOIN "$tableName" USING ("elementId") LEFT JOIN "JMdict_EntryScore" USING ("elementId") - WHERE "${tableName}FTS"."reading" MATCH normalize_jp(?1) || '*' + WHERE "${tableName}FTS"."reading" MATCH ${kanaIndependent ? 'normalize_jp(?1)' : '?1'} || '*' ), non_fts_results AS ( SELECT DISTINCT @@ -88,7 +89,7 @@ String _filterFTSSensitiveCharacters(String word) { AS "score" FROM "$tableName" LEFT JOIN "JMdict_EntryScore" USING ("elementId") - WHERE "$tableName"."reading" LIKE '%' || normalize_jp(?1) || '%' + WHERE "$tableName"."reading" LIKE '%' || ${kanaIndependent ? 'normalize_jp(?1)' : '?1'} || '%' AND "$tableName"."entryId" NOT IN (SELECT "entryId" FROM "fts_results") ) @@ -104,23 +105,21 @@ String _filterFTSSensitiveCharacters(String word) { ${offset != null ? 'OFFSET ?' : ''} ''' .trim(), - [ - _filterFTSSensitiveCharacters(word), - ?pageSize, - ?offset, - ], + [_filterFTSSensitiveCharacters(word), ?pageSize, ?offset], ); } Future> _queryKanji( DatabaseExecutor connection, String word, + bool kanaIndependent, int? pageSize, int? offset, ) { final (query, args) = _kanjiReadingTemplate( JMdictTableNames.kanjiElement, word, + kanaIndependent: kanaIndependent, pageSize: pageSize, offset: offset, ); @@ -150,12 +149,14 @@ Future _queryKanjiCount(DatabaseExecutor connection, String word) { Future> _queryKana( DatabaseExecutor connection, String word, + bool kanaIndependent, int? pageSize, int? offset, ) { final (query, args) = _kanjiReadingTemplate( JMdictTableNames.readingElement, word, + kanaIndependent: kanaIndependent, pageSize: pageSize, offset: offset, ); @@ -244,6 +245,7 @@ Future> fetchEntryIds( DatabaseExecutor connection, String word, SearchMode searchMode, + bool kanaIndependent, int? pageSize, int? offset, ) async { @@ -259,11 +261,23 @@ Future> fetchEntryIds( late final List entryIds; switch (searchMode) { case SearchMode.kanji: - entryIds = await _queryKanji(connection, word, pageSize, offset); + entryIds = await _queryKanji( + connection, + word, + kanaIndependent, + pageSize, + offset, + ); break; case SearchMode.kana: - entryIds = await _queryKana(connection, word, pageSize, offset); + entryIds = await _queryKana( + connection, + word, + kanaIndependent, + pageSize, + offset, + ); break; case SearchMode.english: diff --git a/lib/search/word_search/word_search.dart b/lib/search/word_search/word_search.dart index e777530..68191bc 100644 --- a/lib/search/word_search/word_search.dart +++ b/lib/search/word_search/word_search.dart @@ -38,6 +38,7 @@ Future?> searchWordWithDbConnection( DatabaseExecutor connection, String word, { SearchMode searchMode = SearchMode.auto, + bool kanaIndependent = true, int page = 0, int? pageSize, }) async { @@ -50,6 +51,7 @@ Future?> searchWordWithDbConnection( connection, word, searchMode, + kanaIndependent, pageSize, offset, );