From 128dd14a0dc5cc31b3077dbeafdb06189a12dfd0 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Mon, 19 May 2025 16:40:35 +0200 Subject: [PATCH] lib/search: generate list of `?` instead of interpolation --- lib/_data_ingestion/tanos-jlpt/resolve.dart | 26 +++++---- lib/search/word_search/data_query.dart | 63 ++++++++++++++------- 2 files changed, 58 insertions(+), 31 deletions(-) diff --git a/lib/_data_ingestion/tanos-jlpt/resolve.dart b/lib/_data_ingestion/tanos-jlpt/resolve.dart index f47c8a0..6e45f07 100644 --- a/lib/_data_ingestion/tanos-jlpt/resolve.dart +++ b/lib/_data_ingestion/tanos-jlpt/resolve.dart @@ -1,7 +1,6 @@ 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/overrides.dart'; -import 'package:jadb/util/sqlite_utils.dart'; import 'package:sqflite_common/sqlite_api.dart'; Future> _findReadingCandidates( @@ -13,7 +12,8 @@ Future> _findReadingCandidates( JMdictTableNames.readingElement, columns: ['entryId'], 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()); @@ -34,14 +34,20 @@ Future> _findSenseCandidates( JLPTRankedWord word, Database db, ) => - db - .rawQuery('SELECT entryId, phrase ' - 'FROM ${JMdictTableNames.senseGlossary} ' - 'JOIN ${JMdictTableNames.sense} USING (senseId)' - 'WHERE phrase IN (${word.meanings.map((e) => escapeStringValue(e)).join(',')})') - .then((rows) => rows - .map((row) => (row['entryId'] as int, row['phrase'] as String)) - .toList()); + db.rawQuery( + 'SELECT entryId, phrase ' + 'FROM "${JMdictTableNames.senseGlossary}" ' + 'JOIN "${JMdictTableNames.sense}" USING (senseId)' + 'WHERE phrase IN (${List.filled( + word.meanings.length, + '?', + ).join(',')})', + [...word.meanings], + ).then( + (rows) => rows + .map((row) => (row['entryId'] as int, row['phrase'] as String)) + .toList(), + ); Future findEntry( JLPTRankedWord word, diff --git a/lib/search/word_search/data_query.dart b/lib/search/word_search/data_query.dart index fe73ef7..b4fb372 100644 --- a/lib/search/word_search/data_query.dart +++ b/lib/search/word_search/data_query.dart @@ -56,14 +56,16 @@ Future fetchLinearWordQueryData( late final List> senses; final Future>> senses_query = connection.query( JMdictTableNames.sense, - where: 'entryId IN (${entryIds.join(',')})', + where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', + whereArgs: entryIds, ); late final List> readingElements; final Future>> readingElements_query = connection.query( JMdictTableNames.readingElement, - where: 'entryId IN (${entryIds.join(',')})', + where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', + whereArgs: entryIds, orderBy: 'orderNum', ); @@ -71,21 +73,24 @@ Future fetchLinearWordQueryData( final Future>> kanjiElements_query = connection.query( JMdictTableNames.kanjiElement, - where: 'entryId IN (${entryIds.join(',')})', + where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', + whereArgs: entryIds, orderBy: 'orderNum', ); late final List> jlptTags; final Future>> jlptTags_query = connection.query( TanosJLPTTableNames.jlptTag, - where: 'entryId IN (${entryIds.join(',')})', + where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', + whereArgs: entryIds, ); late final List> commonEntries; final Future>> commonEntries_query = connection.query( 'JMdict_EntryCommon', - where: 'entryId IN (${entryIds.join(',')})', + where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', + whereArgs: entryIds, ); await Future.wait([ @@ -102,7 +107,8 @@ Future fetchLinearWordQueryData( late final List> senseAntonyms; final Future>> senseAntonyms_query = - connection.rawQuery(""" + connection.rawQuery( + """ SELECT "${JMdictTableNames.senseAntonyms}".senseId, "${JMdictTableNames.senseAntonyms}".ambiguous, @@ -113,77 +119,89 @@ Future fetchLinearWordQueryData( JOIN "JMdict_BaseAndFurigana" ON "${JMdictTableNames.senseAntonyms}"."xrefEntryId" = "JMdict_BaseAndFurigana"."entryId" WHERE - "senseId" IN (${senseIds.join(',')}) + "senseId" IN (${List.filled(senseIds.length, '?').join(',')}) AND COALESCE("JMdict_BaseAndFurigana"."kanjiOrderNum", 1) + "JMdict_BaseAndFurigana"."readingOrderNum" = 2 ORDER BY "${JMdictTableNames.senseAntonyms}"."senseId", "${JMdictTableNames.senseAntonyms}"."xrefEntryId" - """); + """, + [...senseIds], + ); late final List> senseDialects; final Future>> senseDialects_query = connection.query( JMdictTableNames.senseDialect, - where: 'senseId IN (${senseIds.join(',')})', + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, ); late final List> senseFields; final Future>> senseFields_query = connection.query( JMdictTableNames.senseField, - where: 'senseId IN (${senseIds.join(',')})', + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, ); late final List> senseGlossaries; final Future>> senseGlossaries_query = connection.query( JMdictTableNames.senseGlossary, - where: 'senseId IN (${senseIds.join(',')})', + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, ); late final List> senseInfos; final Future>> senseInfos_query = connection.query( JMdictTableNames.senseInfo, - where: 'senseId IN (${senseIds.join(',')})', + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, ); late final List> senseLanguageSources; final Future>> senseLanguageSources_query = connection.query( JMdictTableNames.senseLanguageSource, - where: 'senseId IN (${senseIds.join(',')})', + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, ); late final List> senseMiscs; final Future>> senseMiscs_query = connection.query( JMdictTableNames.senseMisc, - where: 'senseId IN (${senseIds.join(',')})', + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, ); late final List> sensePOSs; final Future>> sensePOSs_query = connection.query( JMdictTableNames.sensePOS, - where: 'senseId IN (${senseIds.join(',')})', + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, ); late final List> senseRestrictedToKanjis; final Future>> senseRestrictedToKanjis_query = connection.query( JMdictTableNames.senseRestrictedToKanji, - where: 'senseId IN (${senseIds.join(',')})', + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, ); late final List> senseRestrictedToReadings; final Future>> senseRestrictedToReadings_query = connection.query( JMdictTableNames.senseRestrictedToReading, - where: 'senseId IN (${senseIds.join(',')})', + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, ); late final List> senseSeeAlsos; final Future>> senseSeeAlsos_query = - connection.rawQuery(""" + connection.rawQuery( + """ SELECT "${JMdictTableNames.senseSeeAlso}"."senseId", "${JMdictTableNames.senseSeeAlso}"."ambiguous", @@ -194,20 +212,23 @@ Future fetchLinearWordQueryData( JOIN "JMdict_BaseAndFurigana" ON "${JMdictTableNames.senseSeeAlso}"."xrefEntryId" = "JMdict_BaseAndFurigana"."entryId" WHERE - "senseId" IN (${senseIds.join(',')}) + "senseId" IN (${List.filled(senseIds.length, '?').join(',')}) AND COALESCE("JMdict_BaseAndFurigana"."kanjiOrderNum", 1) + "JMdict_BaseAndFurigana"."readingOrderNum" = 2 ORDER BY "${JMdictTableNames.senseSeeAlso}"."senseId", "${JMdictTableNames.senseSeeAlso}"."xrefEntryId" - """); + """, + [...senseIds], + ); late final List> exampleSentences; final Future>> exampleSentences_query = connection.query( 'JMdict_ExampleSentence', - where: 'senseId IN (${senseIds.join(',')})', + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, ); // Reading queries