351 lines
13 KiB
Dart
351 lines
13 KiB
Dart
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<Map<String, Object?>> senses;
|
|
final List<Map<String, Object?>> readingElements;
|
|
final List<Map<String, Object?>> kanjiElements;
|
|
final List<Map<String, Object?>> jlptTags;
|
|
final List<Map<String, Object?>> commonEntries;
|
|
final List<Map<String, Object?>> senseAntonyms;
|
|
final List<Map<String, Object?>> senseDialects;
|
|
final List<Map<String, Object?>> senseFields;
|
|
final List<Map<String, Object?>> senseGlossaries;
|
|
final List<Map<String, Object?>> senseInfos;
|
|
final List<Map<String, Object?>> senseLanguageSources;
|
|
final List<Map<String, Object?>> senseMiscs;
|
|
final List<Map<String, Object?>> sensePOSs;
|
|
final List<Map<String, Object?>> senseRestrictedToKanjis;
|
|
final List<Map<String, Object?>> senseRestrictedToReadings;
|
|
final List<Map<String, Object?>> senseSeeAlsos;
|
|
final List<Map<String, Object?>> exampleSentences;
|
|
final List<Map<String, Object?>> readingElementInfos;
|
|
final List<Map<String, Object?>> readingElementRestrictions;
|
|
final List<Map<String, Object?>> 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<LinearWordQueryData> fetchLinearWordQueryData(
|
|
DatabaseExecutor connection,
|
|
List<int> entryIds, {
|
|
bool fetchXrefData = true,
|
|
}) async {
|
|
late final List<Map<String, Object?>> senses;
|
|
final Future<List<Map<String, Object?>>> sensesQuery = connection.query(
|
|
JMdictTableNames.sense,
|
|
where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})',
|
|
whereArgs: entryIds,
|
|
);
|
|
|
|
late final List<Map<String, Object?>> readingElements;
|
|
final Future<List<Map<String, Object?>>> readingelementsQuery = connection
|
|
.query(
|
|
JMdictTableNames.readingElement,
|
|
where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})',
|
|
whereArgs: entryIds,
|
|
orderBy: 'orderNum',
|
|
);
|
|
|
|
late final List<Map<String, Object?>> kanjiElements;
|
|
final Future<List<Map<String, Object?>>> kanjielementsQuery = connection
|
|
.query(
|
|
JMdictTableNames.kanjiElement,
|
|
where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})',
|
|
whereArgs: entryIds,
|
|
orderBy: 'orderNum',
|
|
);
|
|
|
|
late final List<Map<String, Object?>> jlptTags;
|
|
final Future<List<Map<String, Object?>>> jlpttagsQuery = connection.query(
|
|
TanosJLPTTableNames.jlptTag,
|
|
where: 'entryId IN (${List.filled(entryIds.length, '?').join(',')})',
|
|
whereArgs: entryIds,
|
|
);
|
|
|
|
late final List<Map<String, Object?>> commonEntries;
|
|
final Future<List<Map<String, Object?>>> 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),
|
|
]);
|
|
|
|
// Sense queries
|
|
|
|
final senseIds = senses.map((sense) => sense['senseId'] as int).toList();
|
|
|
|
late final List<Map<String, Object?>> senseAntonyms;
|
|
final Future<List<Map<String, Object?>>> 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<Map<String, Object?>> senseDialects;
|
|
final Future<List<Map<String, Object?>>> sensedialectsQuery = connection
|
|
.query(
|
|
JMdictTableNames.senseDialect,
|
|
where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
|
|
whereArgs: senseIds,
|
|
);
|
|
|
|
late final List<Map<String, Object?>> senseFields;
|
|
final Future<List<Map<String, Object?>>> sensefieldsQuery = connection.query(
|
|
JMdictTableNames.senseField,
|
|
where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
|
|
whereArgs: senseIds,
|
|
);
|
|
|
|
late final List<Map<String, Object?>> senseGlossaries;
|
|
final Future<List<Map<String, Object?>>> senseglossariesQuery = connection
|
|
.query(
|
|
JMdictTableNames.senseGlossary,
|
|
where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
|
|
whereArgs: senseIds,
|
|
);
|
|
|
|
late final List<Map<String, Object?>> senseInfos;
|
|
final Future<List<Map<String, Object?>>> senseinfosQuery = connection.query(
|
|
JMdictTableNames.senseInfo,
|
|
where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
|
|
whereArgs: senseIds,
|
|
);
|
|
|
|
late final List<Map<String, Object?>> senseLanguageSources;
|
|
final Future<List<Map<String, Object?>>> senselanguagesourcesQuery =
|
|
connection.query(
|
|
JMdictTableNames.senseLanguageSource,
|
|
where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
|
|
whereArgs: senseIds,
|
|
);
|
|
|
|
late final List<Map<String, Object?>> senseMiscs;
|
|
final Future<List<Map<String, Object?>>> sensemiscsQuery = connection.query(
|
|
JMdictTableNames.senseMisc,
|
|
where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
|
|
whereArgs: senseIds,
|
|
);
|
|
|
|
late final List<Map<String, Object?>> sensePOSs;
|
|
final Future<List<Map<String, Object?>>> sensepossQuery = connection.query(
|
|
JMdictTableNames.sensePOS,
|
|
where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
|
|
whereArgs: senseIds,
|
|
);
|
|
|
|
late final List<Map<String, Object?>> senseRestrictedToKanjis;
|
|
final Future<List<Map<String, Object?>>> senserestrictedtokanjisQuery =
|
|
connection.query(
|
|
JMdictTableNames.senseRestrictedToKanji,
|
|
where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
|
|
whereArgs: senseIds,
|
|
);
|
|
|
|
late final List<Map<String, Object?>> senseRestrictedToReadings;
|
|
final Future<List<Map<String, Object?>>> senserestrictedtoreadingsQuery =
|
|
connection.query(
|
|
JMdictTableNames.senseRestrictedToReading,
|
|
where: 'senseId IN (${List.filled(senseIds.length, '?').join(',')})',
|
|
whereArgs: senseIds,
|
|
);
|
|
|
|
late final List<Map<String, Object?>> senseSeeAlsos;
|
|
final Future<List<Map<String, Object?>>> 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<Map<String, Object?>> exampleSentences;
|
|
final Future<List<Map<String, Object?>>> 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<Map<String, Object?>> readingElementInfos;
|
|
final Future<List<Map<String, Object?>>> readingelementinfosQuery =
|
|
connection.query(
|
|
JMdictTableNames.readingInfo,
|
|
where:
|
|
'(elementId) IN (${List.filled(readingIds.length, '?').join(',')})',
|
|
whereArgs: readingIds,
|
|
);
|
|
|
|
late final List<Map<String, Object?>> readingElementRestrictions;
|
|
final Future<List<Map<String, Object?>>> 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<Map<String, Object?>> kanjiElementInfos;
|
|
final Future<List<Map<String, Object?>>> 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),
|
|
]);
|
|
|
|
late final LinearWordQueryData? senseAntonymData;
|
|
final Future<LinearWordQueryData?> senseantonymdataQuery =
|
|
fetchXrefData
|
|
? fetchLinearWordQueryData(
|
|
connection,
|
|
senseAntonyms
|
|
.map((antonym) => antonym['xrefEntryId'] as int)
|
|
.toList(),
|
|
fetchXrefData: false,
|
|
)
|
|
: Future.value(null);
|
|
|
|
late final LinearWordQueryData? senseSeeAlsoData;
|
|
final Future<LinearWordQueryData?> senseseealsodataQuery =
|
|
fetchXrefData
|
|
? fetchLinearWordQueryData(
|
|
connection,
|
|
senseSeeAlsos.map((seeAlso) => seeAlso['xrefEntryId'] as int).toList(),
|
|
fetchXrefData: false,
|
|
)
|
|
: Future.value(null);
|
|
|
|
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),
|
|
]);
|
|
|
|
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,
|
|
);
|
|
}
|