word_search: fix pagination

This commit is contained in:
2025-07-13 20:12:10 +02:00
parent 5049157b02
commit 60898fe9a2
3 changed files with 61 additions and 31 deletions

View File

@@ -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.

View File

@@ -43,11 +43,23 @@ String _filterFTSSensitiveCharacters(String word) {
(String, List<Object?>) _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<List<ScoredEntryId>> _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<int> _queryKanjiCount(
Future<List<ScoredEntryId>> _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<int> _queryKanaCount(
Future<List<ScoredEntryId>> _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<List<ScoredEntryId>> fetchEntryIds(
DatabaseExecutor connection,
String word,
SearchMode searchMode,
int pageSize,
int? pageSize,
int? offset,
) async {
if (searchMode == SearchMode.Auto) {

View File

@@ -24,16 +24,16 @@ enum SearchMode {
Future<List<WordSearchResult>?> 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<ScoredEntryId> entryIds = await fetchEntryIds(
connection,
word,
@@ -82,9 +82,9 @@ Future<List<WordSearchResult>?> searchWordWithDbConnection(
Future<int?> searchWordCountWithDbConnection(
DatabaseExecutor connection,
String word,
SearchMode searchMode,
) async {
String word, {
SearchMode searchMode = SearchMode.Auto,
}) async {
if (word.isEmpty) {
return null;
}