selectRelationships<E> method

  1. @override
FutureOr<Map<dynamic, Iterable>> selectRelationships<E>(
  1. List<O>? os,
  2. String field, {
  3. List? oIds,
  4. TypeInfo? fieldType,
  5. 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;
  }
}