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,
    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;
  }
}