word_search: fix pagination
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user