diff --git a/lib/search.dart b/lib/search.dart index 4e6850b..f21a982 100644 --- a/lib/search.dart +++ b/lib/search.dart @@ -31,14 +31,14 @@ extension JaDBConnection on DatabaseExecutor { String word, { SearchMode searchMode = SearchMode.Auto, int page = 0, - int pageSize = 10, + int? pageSize, }) => searchWordWithDbConnection( this, word, - searchMode, - page, - pageSize, + searchMode: searchMode, + page: page, + pageSize: pageSize, ); /// @@ -50,7 +50,11 @@ extension JaDBConnection on DatabaseExecutor { String word, { SearchMode searchMode = SearchMode.Auto, }) => - searchWordCountWithDbConnection(this, word, searchMode); + searchWordCountWithDbConnection( + this, + word, + searchMode: searchMode, + ); /// 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 28d58a8..45d8d48 100644 --- a/lib/search/word_search/entry_id_query.dart +++ b/lib/search/word_search/entry_id_query.dart @@ -43,11 +43,23 @@ String _filterFTSSensitiveCharacters(String word) { (String, List) _kanjiReadingTemplate( String tableName, String word, { - int pageSize = 10, + int? pageSize, + int? offset, bool countOnly = false, -}) => - ( - ''' +}) { + assert(tableName == JMdictTableNames.kanjiElement || + tableName == JMdictTableNames.readingElement); + assert(!countOnly || pageSize == null); + assert(!countOnly || offset == null); + assert(pageSize == null || pageSize > 0); + assert(offset == null || offset >= 0); + assert( + offset == null || pageSize != null, + 'Offset should only be used with pageSize set', + ); + + return ( + ''' WITH fts_results AS ( SELECT DISTINCT @@ -87,27 +99,33 @@ String _filterFTSSensitiveCharacters(String word) { ORDER BY "score" DESC, "entryId" ASC + ${pageSize != null ? 'LIMIT ?' : ''} + ${offset != null ? 'OFFSET ?' : ''} ''' - .trim(), - [ - _filterFTSSensitiveCharacters(word), - _filterFTSSensitiveCharacters(word), - if (!countOnly) pageSize, - _filterFTSSensitiveCharacters(word), - if (!countOnly) pageSize, - ] - ); + .trim(), + [ + _filterFTSSensitiveCharacters(word), + _filterFTSSensitiveCharacters(word), + if (!countOnly) pageSize, + _filterFTSSensitiveCharacters(word), + if (!countOnly) pageSize, + if (pageSize != null) pageSize, + if (offset != null) offset, + ] + ); +} Future> _queryKanji( DatabaseExecutor connection, String word, - int pageSize, + int? pageSize, int? offset, ) { final (query, args) = _kanjiReadingTemplate( JMdictTableNames.kanjiElement, word, pageSize: pageSize, + offset: offset, ); return connection.rawQuery(query, args).then((result) => result .map((row) => ScoredEntryId( @@ -134,13 +152,14 @@ Future _queryKanjiCount( Future> _queryKana( DatabaseExecutor connection, String word, - int pageSize, + int? pageSize, int? offset, ) { final (query, args) = _kanjiReadingTemplate( JMdictTableNames.readingElement, word, pageSize: pageSize, + offset: offset, ); return connection.rawQuery(query, args).then((result) => result .map((row) => ScoredEntryId( @@ -167,9 +186,16 @@ Future _queryKanaCount( Future> _queryEnglish( DatabaseExecutor connection, String word, - int pageSize, + int? pageSize, int? offset, ) async { + assert(pageSize == null || pageSize > 0); + assert(offset == null || offset >= 0); + assert( + offset == null || pageSize != null, + 'Offset should only be used with pageSize set', + ); + final result = await connection.rawQuery( ''' SELECT @@ -235,7 +261,7 @@ Future> fetchEntryIds( DatabaseExecutor connection, String word, SearchMode searchMode, - int pageSize, + int? pageSize, int? offset, ) async { if (searchMode == SearchMode.Auto) { diff --git a/lib/search/word_search/word_search.dart b/lib/search/word_search/word_search.dart index 86960ed..99544bc 100644 --- a/lib/search/word_search/word_search.dart +++ b/lib/search/word_search/word_search.dart @@ -24,16 +24,16 @@ enum SearchMode { Future?> searchWordWithDbConnection( DatabaseExecutor connection, - String word, - SearchMode searchMode, - int page, - int pageSize, -) async { + String word, { + SearchMode searchMode = SearchMode.Auto, + int page = 0, + int? pageSize, +}) async { if (word.isEmpty) { return null; } - final offset = page * pageSize; + final int? offset = pageSize != null ? page * pageSize : null; final List entryIds = await fetchEntryIds( connection, word, @@ -82,9 +82,9 @@ Future?> searchWordWithDbConnection( Future searchWordCountWithDbConnection( DatabaseExecutor connection, - String word, - SearchMode searchMode, -) async { + String word, { + SearchMode searchMode = SearchMode.Auto, +}) async { if (word.isEmpty) { return null; }