import 'package:jadb/table_names/jmdict.dart'; import 'package:jadb/table_names/tanos_jlpt.dart'; import 'package:sqflite_common/sqflite.dart'; class LinearWordQueryData { final List> senses; final List> readingElements; final List> kanjiElements; final List> jlptTags; final List> commonEntries; final List> senseAntonyms; final List> senseDialects; final List> senseFields; final List> senseGlossaries; final List> senseInfos; final List> senseLanguageSources; final List> senseMiscs; final List> sensePOSs; final List> senseRestrictedToKanjis; final List> senseRestrictedToReadings; final List> senseSeeAlsos; final List> exampleSentences; final List> readingElementInfos; final List> readingElementRestrictions; final List> kanjiElementInfos; final LinearWordQueryData? senseAntonymData; final LinearWordQueryData? senseSeeAlsoData; const LinearWordQueryData({ required this.senses, required this.readingElements, required this.kanjiElements, required this.jlptTags, required this.commonEntries, required this.senseAntonyms, required this.senseDialects, required this.senseFields, required this.senseGlossaries, required this.senseInfos, required this.senseLanguageSources, required this.senseMiscs, required this.sensePOSs, required this.senseRestrictedToKanjis, required this.senseRestrictedToReadings, required this.senseSeeAlsos, required this.exampleSentences, required this.readingElementInfos, required this.readingElementRestrictions, required this.kanjiElementInfos, required this.senseAntonymData, required this.senseSeeAlsoData, }); } 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; late final List> readingElements; late final List> kanjiElements; late final List> jlptTags; late final List> commonEntries; await Future.wait([ _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), ]); final senseIds = senses.map((sense) => sense['senseId'] as int).toList(); late final List> senseAntonyms; late final List> senseDialects; late final List> senseFields; late final List> senseGlossaries; late final List> senseInfos; late final List> senseLanguageSources; late final List> senseMiscs; late final List> sensePOSs; late final List> senseRestrictedToKanjis; late final List> senseRestrictedToReadings; late final List> senseSeeAlsos; late final List> exampleSentences; final readingIds = readingElements .map((element) => element['elementId'] as int) .toList(); final kanjiIds = kanjiElements .map((element) => element['elementId'] as int) .toList(); late final List> readingElementInfos; late final List> readingElementRestrictions; late final List> kanjiElementInfos; // Xref data queries await Future.wait([ _senseantonymsQuery( connection, senseIds, ).then((value) => senseAntonyms = value), _senseseealsosQuery( connection, senseIds, ).then((value) => senseSeeAlsos = value), ]); LinearWordQueryData? senseAntonymData; LinearWordQueryData? senseSeeAlsoData; await Future.wait([ _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( senses: senses, readingElements: readingElements, kanjiElements: kanjiElements, jlptTags: jlptTags, commonEntries: commonEntries, senseAntonyms: senseAntonyms, senseDialects: senseDialects, senseFields: senseFields, senseGlossaries: senseGlossaries, senseInfos: senseInfos, senseLanguageSources: senseLanguageSources, senseMiscs: senseMiscs, sensePOSs: sensePOSs, senseRestrictedToKanjis: senseRestrictedToKanjis, senseRestrictedToReadings: senseRestrictedToReadings, senseSeeAlsos: senseSeeAlsos, exampleSentences: exampleSentences, readingElementInfos: readingElementInfos, readingElementRestrictions: readingElementRestrictions, kanjiElementInfos: kanjiElementInfos, senseAntonymData: senseAntonymData, senseSeeAlsoData: senseSeeAlsoData, ); }