selectRelationships<E> method
FutureOr<Map<dynamic, Iterable> >
selectRelationships<E>(
- List<
O> ? os, - String field, {
- List? oIds,
- TypeInfo? fieldType,
- Transaction? transaction,
override
Implementation
@override
FutureOr<Map<dynamic, Iterable<dynamic>>> selectRelationships<E>(
List<O>? os, String field,
{List<dynamic>? oIds, TypeInfo? fieldType, Transaction? transaction}) {
oIds ??= os!
.map((o) => getID(o, entityHandler: entityHandler)! as Object)
.toList();
fieldType ??= entityHandler.getFieldType(os?.first, field)!;
if (oIds.isEmpty) {
return <dynamic, Iterable<dynamic>>{};
} else if (oIds.length == 1) {
var id = oIds.first;
return selectRelationship(null, field,
oId: id, fieldType: fieldType, transaction: transaction)
.resolveMapped((targetIds) {
return <dynamic, Iterable<dynamic>>{
id: targetIds is List ? targetIds : targetIds.toList()
};
});
}
var oIdsOrig = oIds.toList(growable: false);
var cachedRelationships =
_getCachedEntitiesRelationships(oIds, field, fieldType, transaction);
if (cachedRelationships != null && oIds.isEmpty) {
return cachedRelationships;
}
var valuesType = fieldType.arguments0!.type;
String valuesTableName = _resolveTableName(valuesType);
var op = TransactionOperationSelectRelationships(
name, valuesTableName, operationExecutor, os ?? oIds,
transaction: transaction);
try {
return repositoryAdapter
.doSelectRelationships(op, field, oIds, valuesTableName, (sel) {
var relationships = sel.groupListsBy((e) => e['source_id']!).map(
(id, l) => MapEntry(id, l.map((m) => m['target_id']).toList()));
if (cachedRelationships != null && cachedRelationships.isNotEmpty) {
relationships = Map<dynamic, List<dynamic>>.fromEntries(oIdsOrig.map(
(id) => MapEntry<dynamic, List<dynamic>>(
id, relationships[id] ?? cachedRelationships[id] ?? []),
));
}
return relationships;
});
} catch (e, s) {
var message = 'selectRelationships> '
'os: $os ; '
'oIds: $oIds ; '
'field: $field ; '
'fieldType: $fieldType ; '
'op: $op';
_log.severe(message, e, s);
rethrow;
}
}