lib/search: generate list of ? instead of interpolation

This commit is contained in:
2025-05-19 16:40:35 +02:00
parent 501d3a089e
commit 128dd14a0d
2 changed files with 58 additions and 31 deletions
+16 -10
View File
@@ -1,7 +1,6 @@
import 'package:jadb/_data_ingestion/jmdict/table_names.dart'; import 'package:jadb/_data_ingestion/jmdict/table_names.dart';
import 'package:jadb/_data_ingestion/tanos-jlpt/objects.dart'; import 'package:jadb/_data_ingestion/tanos-jlpt/objects.dart';
import 'package:jadb/_data_ingestion/tanos-jlpt/overrides.dart'; import 'package:jadb/_data_ingestion/tanos-jlpt/overrides.dart';
import 'package:jadb/util/sqlite_utils.dart';
import 'package:sqflite_common/sqlite_api.dart'; import 'package:sqflite_common/sqlite_api.dart';
Future<List<int>> _findReadingCandidates( Future<List<int>> _findReadingCandidates(
@@ -13,7 +12,8 @@ Future<List<int>> _findReadingCandidates(
JMdictTableNames.readingElement, JMdictTableNames.readingElement,
columns: ['entryId'], columns: ['entryId'],
where: where:
'reading IN (${word.readings.map((e) => escapeStringValue(e)).join(',')})', '"reading" IN (${List.filled(word.readings.length, '?').join(',')})',
whereArgs: [...word.readings],
) )
.then((rows) => rows.map((row) => row['entryId'] as int).toList()); .then((rows) => rows.map((row) => row['entryId'] as int).toList());
@@ -34,14 +34,20 @@ Future<List<(int, String)>> _findSenseCandidates(
JLPTRankedWord word, JLPTRankedWord word,
Database db, Database db,
) => ) =>
db db.rawQuery(
.rawQuery('SELECT entryId, phrase ' 'SELECT entryId, phrase '
'FROM ${JMdictTableNames.senseGlossary} ' 'FROM "${JMdictTableNames.senseGlossary}" '
'JOIN ${JMdictTableNames.sense} USING (senseId)' 'JOIN "${JMdictTableNames.sense}" USING (senseId)'
'WHERE phrase IN (${word.meanings.map((e) => escapeStringValue(e)).join(',')})') 'WHERE phrase IN (${List.filled(
.then((rows) => rows word.meanings.length,
.map((row) => (row['entryId'] as int, row['phrase'] as String)) '?',
.toList()); ).join(',')})',
[...word.meanings],
).then(
(rows) => rows
.map((row) => (row['entryId'] as int, row['phrase'] as String))
.toList(),
);
Future<int?> findEntry( Future<int?> findEntry(
JLPTRankedWord word, JLPTRankedWord word,
+42 -21
View File
@@ -56,14 +56,16 @@ Future<LinearWordQueryData> fetchLinearWordQueryData(
late final List<Map<String, Object?>> senses; late final List<Map<String, Object?>> senses;
final Future<List<Map<String, Object?>>> senses_query = connection.query( final Future<List<Map<String, Object?>>> senses_query = connection.query(
JMdictTableNames.sense, JMdictTableNames.sense,
where: 'entryId IN (${entryIds.join(',')})', where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})',
whereArgs: entryIds,
); );
late final List<Map<String, Object?>> readingElements; late final List<Map<String, Object?>> readingElements;
final Future<List<Map<String, Object?>>> readingElements_query = final Future<List<Map<String, Object?>>> readingElements_query =
connection.query( connection.query(
JMdictTableNames.readingElement, JMdictTableNames.readingElement,
where: 'entryId IN (${entryIds.join(',')})', where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})',
whereArgs: entryIds,
orderBy: 'orderNum', orderBy: 'orderNum',
); );
@@ -71,21 +73,24 @@ Future<LinearWordQueryData> fetchLinearWordQueryData(
final Future<List<Map<String, Object?>>> kanjiElements_query = final Future<List<Map<String, Object?>>> kanjiElements_query =
connection.query( connection.query(
JMdictTableNames.kanjiElement, JMdictTableNames.kanjiElement,
where: 'entryId IN (${entryIds.join(',')})', where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})',
whereArgs: entryIds,
orderBy: 'orderNum', orderBy: 'orderNum',
); );
late final List<Map<String, Object?>> jlptTags; late final List<Map<String, Object?>> jlptTags;
final Future<List<Map<String, Object?>>> jlptTags_query = connection.query( final Future<List<Map<String, Object?>>> jlptTags_query = connection.query(
TanosJLPTTableNames.jlptTag, TanosJLPTTableNames.jlptTag,
where: 'entryId IN (${entryIds.join(',')})', where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})',
whereArgs: entryIds,
); );
late final List<Map<String, Object?>> commonEntries; late final List<Map<String, Object?>> commonEntries;
final Future<List<Map<String, Object?>>> commonEntries_query = final Future<List<Map<String, Object?>>> commonEntries_query =
connection.query( connection.query(
'JMdict_EntryCommon', 'JMdict_EntryCommon',
where: 'entryId IN (${entryIds.join(',')})', where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})',
whereArgs: entryIds,
); );
await Future.wait([ await Future.wait([
@@ -102,7 +107,8 @@ Future<LinearWordQueryData> fetchLinearWordQueryData(
late final List<Map<String, Object?>> senseAntonyms; late final List<Map<String, Object?>> senseAntonyms;
final Future<List<Map<String, Object?>>> senseAntonyms_query = final Future<List<Map<String, Object?>>> senseAntonyms_query =
connection.rawQuery(""" connection.rawQuery(
"""
SELECT SELECT
"${JMdictTableNames.senseAntonyms}".senseId, "${JMdictTableNames.senseAntonyms}".senseId,
"${JMdictTableNames.senseAntonyms}".ambiguous, "${JMdictTableNames.senseAntonyms}".ambiguous,
@@ -113,77 +119,89 @@ Future<LinearWordQueryData> fetchLinearWordQueryData(
JOIN "JMdict_BaseAndFurigana" JOIN "JMdict_BaseAndFurigana"
ON "${JMdictTableNames.senseAntonyms}"."xrefEntryId" = "JMdict_BaseAndFurigana"."entryId" ON "${JMdictTableNames.senseAntonyms}"."xrefEntryId" = "JMdict_BaseAndFurigana"."entryId"
WHERE WHERE
"senseId" IN (${senseIds.join(',')}) "senseId" IN (${List.filled(senseIds.length, '?').join(',')})
AND COALESCE("JMdict_BaseAndFurigana"."kanjiOrderNum", 1) AND COALESCE("JMdict_BaseAndFurigana"."kanjiOrderNum", 1)
+ "JMdict_BaseAndFurigana"."readingOrderNum" + "JMdict_BaseAndFurigana"."readingOrderNum"
= 2 = 2
ORDER BY ORDER BY
"${JMdictTableNames.senseAntonyms}"."senseId", "${JMdictTableNames.senseAntonyms}"."senseId",
"${JMdictTableNames.senseAntonyms}"."xrefEntryId" "${JMdictTableNames.senseAntonyms}"."xrefEntryId"
"""); """,
[...senseIds],
);
late final List<Map<String, Object?>> senseDialects; late final List<Map<String, Object?>> senseDialects;
final Future<List<Map<String, Object?>>> senseDialects_query = final Future<List<Map<String, Object?>>> senseDialects_query =
connection.query( connection.query(
JMdictTableNames.senseDialect, JMdictTableNames.senseDialect,
where: 'senseId IN (${senseIds.join(',')})', where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
whereArgs: senseIds,
); );
late final List<Map<String, Object?>> senseFields; late final List<Map<String, Object?>> senseFields;
final Future<List<Map<String, Object?>>> senseFields_query = connection.query( final Future<List<Map<String, Object?>>> senseFields_query = connection.query(
JMdictTableNames.senseField, JMdictTableNames.senseField,
where: 'senseId IN (${senseIds.join(',')})', where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
whereArgs: senseIds,
); );
late final List<Map<String, Object?>> senseGlossaries; late final List<Map<String, Object?>> senseGlossaries;
final Future<List<Map<String, Object?>>> senseGlossaries_query = final Future<List<Map<String, Object?>>> senseGlossaries_query =
connection.query( connection.query(
JMdictTableNames.senseGlossary, JMdictTableNames.senseGlossary,
where: 'senseId IN (${senseIds.join(',')})', where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
whereArgs: senseIds,
); );
late final List<Map<String, Object?>> senseInfos; late final List<Map<String, Object?>> senseInfos;
final Future<List<Map<String, Object?>>> senseInfos_query = connection.query( final Future<List<Map<String, Object?>>> senseInfos_query = connection.query(
JMdictTableNames.senseInfo, JMdictTableNames.senseInfo,
where: 'senseId IN (${senseIds.join(',')})', where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
whereArgs: senseIds,
); );
late final List<Map<String, Object?>> senseLanguageSources; late final List<Map<String, Object?>> senseLanguageSources;
final Future<List<Map<String, Object?>>> senseLanguageSources_query = final Future<List<Map<String, Object?>>> senseLanguageSources_query =
connection.query( connection.query(
JMdictTableNames.senseLanguageSource, JMdictTableNames.senseLanguageSource,
where: 'senseId IN (${senseIds.join(',')})', where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
whereArgs: senseIds,
); );
late final List<Map<String, Object?>> senseMiscs; late final List<Map<String, Object?>> senseMiscs;
final Future<List<Map<String, Object?>>> senseMiscs_query = connection.query( final Future<List<Map<String, Object?>>> senseMiscs_query = connection.query(
JMdictTableNames.senseMisc, JMdictTableNames.senseMisc,
where: 'senseId IN (${senseIds.join(',')})', where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
whereArgs: senseIds,
); );
late final List<Map<String, Object?>> sensePOSs; late final List<Map<String, Object?>> sensePOSs;
final Future<List<Map<String, Object?>>> sensePOSs_query = connection.query( final Future<List<Map<String, Object?>>> sensePOSs_query = connection.query(
JMdictTableNames.sensePOS, JMdictTableNames.sensePOS,
where: 'senseId IN (${senseIds.join(',')})', where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
whereArgs: senseIds,
); );
late final List<Map<String, Object?>> senseRestrictedToKanjis; late final List<Map<String, Object?>> senseRestrictedToKanjis;
final Future<List<Map<String, Object?>>> senseRestrictedToKanjis_query = final Future<List<Map<String, Object?>>> senseRestrictedToKanjis_query =
connection.query( connection.query(
JMdictTableNames.senseRestrictedToKanji, JMdictTableNames.senseRestrictedToKanji,
where: 'senseId IN (${senseIds.join(',')})', where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
whereArgs: senseIds,
); );
late final List<Map<String, Object?>> senseRestrictedToReadings; late final List<Map<String, Object?>> senseRestrictedToReadings;
final Future<List<Map<String, Object?>>> senseRestrictedToReadings_query = final Future<List<Map<String, Object?>>> senseRestrictedToReadings_query =
connection.query( connection.query(
JMdictTableNames.senseRestrictedToReading, JMdictTableNames.senseRestrictedToReading,
where: 'senseId IN (${senseIds.join(',')})', where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
whereArgs: senseIds,
); );
late final List<Map<String, Object?>> senseSeeAlsos; late final List<Map<String, Object?>> senseSeeAlsos;
final Future<List<Map<String, Object?>>> senseSeeAlsos_query = final Future<List<Map<String, Object?>>> senseSeeAlsos_query =
connection.rawQuery(""" connection.rawQuery(
"""
SELECT SELECT
"${JMdictTableNames.senseSeeAlso}"."senseId", "${JMdictTableNames.senseSeeAlso}"."senseId",
"${JMdictTableNames.senseSeeAlso}"."ambiguous", "${JMdictTableNames.senseSeeAlso}"."ambiguous",
@@ -194,20 +212,23 @@ Future<LinearWordQueryData> fetchLinearWordQueryData(
JOIN "JMdict_BaseAndFurigana" JOIN "JMdict_BaseAndFurigana"
ON "${JMdictTableNames.senseSeeAlso}"."xrefEntryId" = "JMdict_BaseAndFurigana"."entryId" ON "${JMdictTableNames.senseSeeAlso}"."xrefEntryId" = "JMdict_BaseAndFurigana"."entryId"
WHERE WHERE
"senseId" IN (${senseIds.join(',')}) "senseId" IN (${List.filled(senseIds.length, '?').join(',')})
AND COALESCE("JMdict_BaseAndFurigana"."kanjiOrderNum", 1) AND COALESCE("JMdict_BaseAndFurigana"."kanjiOrderNum", 1)
+ "JMdict_BaseAndFurigana"."readingOrderNum" + "JMdict_BaseAndFurigana"."readingOrderNum"
= 2 = 2
ORDER BY ORDER BY
"${JMdictTableNames.senseSeeAlso}"."senseId", "${JMdictTableNames.senseSeeAlso}"."senseId",
"${JMdictTableNames.senseSeeAlso}"."xrefEntryId" "${JMdictTableNames.senseSeeAlso}"."xrefEntryId"
"""); """,
[...senseIds],
);
late final List<Map<String, Object?>> exampleSentences; late final List<Map<String, Object?>> exampleSentences;
final Future<List<Map<String, Object?>>> exampleSentences_query = final Future<List<Map<String, Object?>>> exampleSentences_query =
connection.query( connection.query(
'JMdict_ExampleSentence', 'JMdict_ExampleSentence',
where: 'senseId IN (${senseIds.join(',')})', where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
whereArgs: senseIds,
); );
// Reading queries // Reading queries