From 07d162436a0e03049e1ca28d140470dcb0f2a1a7 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Sat, 28 Feb 2026 14:36:14 +0900 Subject: [PATCH] search/word_search: split data queries into functions --- lib/search/word_search/data_query.dart | 535 ++++++++++++++----------- 1 file changed, 312 insertions(+), 223 deletions(-) diff --git a/lib/search/word_search/data_query.dart b/lib/search/word_search/data_query.dart index baa392e..5cb384b 100644 --- a/lib/search/word_search/data_query.dart +++ b/lib/search/word_search/data_query.dart @@ -53,274 +53,363 @@ class LinearWordQueryData { }); } +Future>> _sensesQuery( + DatabaseExecutor connection, + List entryIds, +) => connection.query( + JMdictTableNames.sense, + where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', + whereArgs: entryIds, +); + +Future>> _readingelementsQuery( + DatabaseExecutor connection, + List entryIds, +) => connection.query( + JMdictTableNames.readingElement, + where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', + whereArgs: entryIds, + orderBy: 'orderNum', +); + +Future>> _kanjielementsQuery( + DatabaseExecutor connection, + List entryIds, +) => connection.query( + JMdictTableNames.kanjiElement, + where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', + whereArgs: entryIds, + orderBy: 'orderNum', +); + +Future>> _jlpttagsQuery( + DatabaseExecutor connection, + List entryIds, +) => connection.query( + TanosJLPTTableNames.jlptTag, + where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', + whereArgs: entryIds, +); + +Future>> _commonentriesQuery( + DatabaseExecutor connection, + List entryIds, +) => connection.query( + 'JMdict_EntryCommon', + where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', + whereArgs: entryIds, +); + +// Sense queries + +Future>> _senseantonymsQuery( + DatabaseExecutor connection, + List senseIds, +) => connection.rawQuery( + """ + SELECT + "${JMdictTableNames.senseAntonyms}".senseId, + "${JMdictTableNames.senseAntonyms}".ambiguous, + "${JMdictTableNames.senseAntonyms}".xrefEntryId, + "JMdict_BaseAndFurigana"."base", + "JMdict_BaseAndFurigana"."furigana" + FROM "${JMdictTableNames.senseAntonyms}" + JOIN "JMdict_BaseAndFurigana" + ON "${JMdictTableNames.senseAntonyms}"."xrefEntryId" = "JMdict_BaseAndFurigana"."entryId" + WHERE + "senseId" IN (${List.filled(senseIds.length, '?').join(',')}) + AND "JMdict_BaseAndFurigana"."isFirst" + ORDER BY + "${JMdictTableNames.senseAntonyms}"."senseId", + "${JMdictTableNames.senseAntonyms}"."xrefEntryId" + """, + [...senseIds], +); + +Future>> senseseealsosQuery( + DatabaseExecutor connection, + List senseIds, +) => connection.rawQuery( + """ + SELECT + "${JMdictTableNames.senseSeeAlso}"."senseId", + "${JMdictTableNames.senseSeeAlso}"."ambiguous", + "${JMdictTableNames.senseSeeAlso}"."xrefEntryId", + "JMdict_BaseAndFurigana"."base", + "JMdict_BaseAndFurigana"."furigana" + FROM "${JMdictTableNames.senseSeeAlso}" + JOIN "JMdict_BaseAndFurigana" + ON "${JMdictTableNames.senseSeeAlso}"."xrefEntryId" = "JMdict_BaseAndFurigana"."entryId" + WHERE + "senseId" IN (${List.filled(senseIds.length, '?').join(',')}) + AND "JMdict_BaseAndFurigana"."isFirst" + ORDER BY + "${JMdictTableNames.senseSeeAlso}"."senseId", + "${JMdictTableNames.senseSeeAlso}"."xrefEntryId" + """, + [...senseIds], +); + +Future>> _sensedialectsQuery( + DatabaseExecutor connection, + List senseIds, +) => connection.query( + JMdictTableNames.senseDialect, + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, +); + +Future>> _sensefieldsQuery( + DatabaseExecutor connection, + List senseIds, +) => connection.query( + JMdictTableNames.senseField, + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, +); + +Future>> _senseglossariesQuery( + DatabaseExecutor connection, + List senseIds, +) => connection.query( + JMdictTableNames.senseGlossary, + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, +); + +Future>> _senseinfosQuery( + DatabaseExecutor connection, + List senseIds, +) => connection.query( + JMdictTableNames.senseInfo, + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, +); + +Future>> _senselanguagesourcesQuery( + DatabaseExecutor connection, + List senseIds, +) => connection.query( + JMdictTableNames.senseLanguageSource, + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, +); + +Future>> _sensemiscsQuery( + DatabaseExecutor connection, + List senseIds, +) => connection.query( + JMdictTableNames.senseMisc, + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, +); + +Future>> _sensepossQuery( + DatabaseExecutor connection, + List senseIds, +) => connection.query( + JMdictTableNames.sensePOS, + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, +); + +Future>> _senserestrictedtokanjisQuery( + DatabaseExecutor connection, + List senseIds, +) => connection.query( + JMdictTableNames.senseRestrictedToKanji, + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, +); + +Future>> _senserestrictedtoreadingsQuery( + DatabaseExecutor connection, + List senseIds, +) => connection.query( + JMdictTableNames.senseRestrictedToReading, + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, +); + +Future>> _examplesentencesQuery( + DatabaseExecutor connection, + List senseIds, +) => connection.query( + 'JMdict_ExampleSentence', + where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', + whereArgs: senseIds, +); + +// Reading/kanji elements queries + +Future>> _readingelementinfosQuery( + DatabaseExecutor connection, + List readingIds, +) => connection.query( + JMdictTableNames.readingInfo, + where: '(elementId) IN (${List.filled(readingIds.length, '?').join(',')})', + whereArgs: readingIds, +); + +Future>> _readingelementrestrictionsQuery( + DatabaseExecutor connection, + List readingIds, +) => connection.query( + JMdictTableNames.readingRestriction, + where: '(elementId) IN (${List.filled(readingIds.length, '?').join(',')})', + whereArgs: readingIds, +); + +Future>> _kanjielementinfosQuery( + DatabaseExecutor connection, + List kanjiIds, +) => connection.query( + JMdictTableNames.kanjiInfo, + where: '(elementId) IN (${List.filled(kanjiIds.length, '?').join(',')})', + whereArgs: kanjiIds, +); + +// Xref queries + +Future _senseantonymdataQuery( + DatabaseExecutor connection, + List entryIds, +) => fetchLinearWordQueryData(connection, entryIds, fetchXrefData: false); + +Future _senseseealsodataQuery( + DatabaseExecutor connection, + List entryIds, +) => fetchLinearWordQueryData(connection, entryIds, fetchXrefData: false); + +// Full query + Future fetchLinearWordQueryData( DatabaseExecutor connection, List entryIds, { bool fetchXrefData = true, }) async { late final List> senses; - final Future>> sensesQuery = connection.query( - JMdictTableNames.sense, - where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', - whereArgs: entryIds, - ); - late final List> readingElements; - final Future>> readingelementsQuery = connection - .query( - JMdictTableNames.readingElement, - where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', - whereArgs: entryIds, - orderBy: 'orderNum', - ); - late final List> kanjiElements; - final Future>> kanjielementsQuery = connection - .query( - JMdictTableNames.kanjiElement, - where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', - whereArgs: entryIds, - orderBy: 'orderNum', - ); - late final List> jlptTags; - final Future>> jlpttagsQuery = connection.query( - TanosJLPTTableNames.jlptTag, - where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', - whereArgs: entryIds, - ); - late final List> commonEntries; - final Future>> commonentriesQuery = connection - .query( - 'JMdict_EntryCommon', - where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})', - whereArgs: entryIds, - ); await Future.wait([ - sensesQuery.then((value) => senses = value), - readingelementsQuery.then((value) => readingElements = value), - kanjielementsQuery.then((value) => kanjiElements = value), - jlpttagsQuery.then((value) => jlptTags = value), - commonentriesQuery.then((value) => commonEntries = value), + _sensesQuery(connection, entryIds).then((value) => senses = value), + _readingelementsQuery( + connection, + entryIds, + ).then((value) => readingElements = value), + _kanjielementsQuery( + connection, + entryIds, + ).then((value) => kanjiElements = value), + _jlpttagsQuery(connection, entryIds).then((value) => jlptTags = value), + _commonentriesQuery( + connection, + entryIds, + ).then((value) => commonEntries = value), ]); - // Sense queries - final senseIds = senses.map((sense) => sense['senseId'] as int).toList(); late final List> senseAntonyms; - final Future>> senseantonymsQuery = connection - .rawQuery( - """ - SELECT - "${JMdictTableNames.senseAntonyms}".senseId, - "${JMdictTableNames.senseAntonyms}".ambiguous, - "${JMdictTableNames.senseAntonyms}".xrefEntryId, - "JMdict_BaseAndFurigana"."base", - "JMdict_BaseAndFurigana"."furigana" - FROM "${JMdictTableNames.senseAntonyms}" - JOIN "JMdict_BaseAndFurigana" - ON "${JMdictTableNames.senseAntonyms}"."xrefEntryId" = "JMdict_BaseAndFurigana"."entryId" - WHERE - "senseId" IN (${List.filled(senseIds.length, '?').join(',')}) - AND "JMdict_BaseAndFurigana"."isFirst" - ORDER BY - "${JMdictTableNames.senseAntonyms}"."senseId", - "${JMdictTableNames.senseAntonyms}"."xrefEntryId" - """, - [...senseIds], - ); - late final List> senseDialects; - final Future>> sensedialectsQuery = connection - .query( - JMdictTableNames.senseDialect, - where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', - whereArgs: senseIds, - ); - late final List> senseFields; - final Future>> sensefieldsQuery = connection.query( - JMdictTableNames.senseField, - where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', - whereArgs: senseIds, - ); - late final List> senseGlossaries; - final Future>> senseglossariesQuery = connection - .query( - JMdictTableNames.senseGlossary, - where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', - whereArgs: senseIds, - ); - late final List> senseInfos; - final Future>> senseinfosQuery = connection.query( - JMdictTableNames.senseInfo, - where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', - whereArgs: senseIds, - ); - late final List> senseLanguageSources; - final Future>> senselanguagesourcesQuery = - connection.query( - JMdictTableNames.senseLanguageSource, - where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', - whereArgs: senseIds, - ); - late final List> senseMiscs; - final Future>> sensemiscsQuery = connection.query( - JMdictTableNames.senseMisc, - where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', - whereArgs: senseIds, - ); - late final List> sensePOSs; - final Future>> sensepossQuery = connection.query( - JMdictTableNames.sensePOS, - where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', - whereArgs: senseIds, - ); - late final List> senseRestrictedToKanjis; - final Future>> senserestrictedtokanjisQuery = - connection.query( - JMdictTableNames.senseRestrictedToKanji, - where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', - whereArgs: senseIds, - ); - late final List> senseRestrictedToReadings; - final Future>> senserestrictedtoreadingsQuery = - connection.query( - JMdictTableNames.senseRestrictedToReading, - where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', - whereArgs: senseIds, - ); - late final List> senseSeeAlsos; - final Future>> senseseealsosQuery = connection - .rawQuery( - """ - SELECT - "${JMdictTableNames.senseSeeAlso}"."senseId", - "${JMdictTableNames.senseSeeAlso}"."ambiguous", - "${JMdictTableNames.senseSeeAlso}"."xrefEntryId", - "JMdict_BaseAndFurigana"."base", - "JMdict_BaseAndFurigana"."furigana" - FROM "${JMdictTableNames.senseSeeAlso}" - JOIN "JMdict_BaseAndFurigana" - ON "${JMdictTableNames.senseSeeAlso}"."xrefEntryId" = "JMdict_BaseAndFurigana"."entryId" - WHERE - "senseId" IN (${List.filled(senseIds.length, '?').join(',')}) - AND "JMdict_BaseAndFurigana"."isFirst" - ORDER BY - "${JMdictTableNames.senseSeeAlso}"."senseId", - "${JMdictTableNames.senseSeeAlso}"."xrefEntryId" - """, - [...senseIds], - ); - late final List> exampleSentences; - final Future>> examplesentencesQuery = connection - .query( - 'JMdict_ExampleSentence', - where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})', - whereArgs: senseIds, - ); - - // Reading queries final readingIds = readingElements .map((element) => element['elementId'] as int) .toList(); - late final List> readingElementInfos; - final Future>> readingelementinfosQuery = - connection.query( - JMdictTableNames.readingInfo, - where: - '(elementId) IN (${List.filled(readingIds.length, '?').join(',')})', - whereArgs: readingIds, - ); - - late final List> readingElementRestrictions; - final Future>> readingelementrestrictionsQuery = - connection.query( - JMdictTableNames.readingRestriction, - where: - '(elementId) IN (${List.filled(readingIds.length, '?').join(',')})', - whereArgs: readingIds, - ); - - // Kanji queries - final kanjiIds = kanjiElements .map((element) => element['elementId'] as int) .toList(); + late final List> readingElementInfos; + late final List> readingElementRestrictions; + late final List> kanjiElementInfos; - final Future>> kanjielementinfosQuery = connection - .query( - JMdictTableNames.kanjiInfo, - where: - '(elementId) IN (${List.filled(kanjiIds.length, '?').join(',')})', - whereArgs: kanjiIds, - ); // Xref data queries await Future.wait([ - senseantonymsQuery.then((value) => senseAntonyms = value), - senseseealsosQuery.then((value) => senseSeeAlsos = value), + _senseantonymsQuery( + connection, + senseIds, + ).then((value) => senseAntonyms = value), + senseseealsosQuery( + connection, + senseIds, + ).then((value) => senseSeeAlsos = value), ]); - late final LinearWordQueryData? senseAntonymData; - final Future senseantonymdataQuery = - fetchXrefData - ? fetchLinearWordQueryData( - connection, - senseAntonyms - .map((antonym) => antonym['xrefEntryId'] as int) - .toList(), - fetchXrefData: false, - ) - : Future.value(null); - - late final LinearWordQueryData? senseSeeAlsoData; - final Future senseseealsodataQuery = - fetchXrefData - ? fetchLinearWordQueryData( - connection, - senseSeeAlsos.map((seeAlso) => seeAlso['xrefEntryId'] as int).toList(), - fetchXrefData: false, - ) - : Future.value(null); + LinearWordQueryData? senseAntonymData; + LinearWordQueryData? senseSeeAlsoData; await Future.wait([ - sensedialectsQuery.then((value) => senseDialects = value), - sensefieldsQuery.then((value) => senseFields = value), - senseglossariesQuery.then((value) => senseGlossaries = value), - senseinfosQuery.then((value) => senseInfos = value), - senselanguagesourcesQuery.then((value) => senseLanguageSources = value), - sensemiscsQuery.then((value) => senseMiscs = value), - sensepossQuery.then((value) => sensePOSs = value), - senserestrictedtokanjisQuery.then( - (value) => senseRestrictedToKanjis = value, - ), - senserestrictedtoreadingsQuery.then( - (value) => senseRestrictedToReadings = value, - ), - examplesentencesQuery.then((value) => exampleSentences = value), - readingelementinfosQuery.then((value) => readingElementInfos = value), - readingelementrestrictionsQuery.then( - (value) => readingElementRestrictions = value, - ), - kanjielementinfosQuery.then((value) => kanjiElementInfos = value), - senseantonymdataQuery.then((value) => senseAntonymData = value), - senseseealsodataQuery.then((value) => senseSeeAlsoData = value), + _sensedialectsQuery( + connection, + senseIds, + ).then((value) => senseDialects = value), + _sensefieldsQuery( + connection, + senseIds, + ).then((value) => senseFields = value), + _senseglossariesQuery( + connection, + senseIds, + ).then((value) => senseGlossaries = value), + _senseinfosQuery(connection, senseIds).then((value) => senseInfos = value), + _senselanguagesourcesQuery( + connection, + senseIds, + ).then((value) => senseLanguageSources = value), + _sensemiscsQuery(connection, senseIds).then((value) => senseMiscs = value), + _sensepossQuery(connection, senseIds).then((value) => sensePOSs = value), + _senserestrictedtokanjisQuery( + connection, + senseIds, + ).then((value) => senseRestrictedToKanjis = value), + _senserestrictedtoreadingsQuery( + connection, + senseIds, + ).then((value) => senseRestrictedToReadings = value), + _examplesentencesQuery( + connection, + senseIds, + ).then((value) => exampleSentences = value), + _readingelementinfosQuery( + connection, + readingIds, + ).then((value) => readingElementInfos = value), + _readingelementrestrictionsQuery( + connection, + readingIds, + ).then((value) => readingElementRestrictions = value), + _kanjielementinfosQuery( + connection, + kanjiIds, + ).then((value) => kanjiElementInfos = value), + + if (fetchXrefData) + _senseantonymdataQuery( + connection, + senseAntonyms.map((antonym) => antonym['xrefEntryId'] as int).toList(), + ).then((value) => senseAntonymData = value), + + if (fetchXrefData) + _senseseealsodataQuery( + connection, + senseSeeAlsos.map((seeAlso) => seeAlso['xrefEntryId'] as int).toList(), + ).then((value) => senseSeeAlsoData = value), ]); return LinearWordQueryData(