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,
resolveFiledName: true,
)!;
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;
}
}