getEntityMapKeyValue method

KeyConditionValue? getEntityMapKeyValue(
  1. Map<String, dynamic>? entityMap, [
  2. EntityHandler<O>? entityHandler
])

Implementation

KeyConditionValue? getEntityMapKeyValue(Map<String, dynamic>? entityMap,
    [EntityHandler<O>? entityHandler]) {
  if (entityMap == null || entityMap.isEmpty) return null;

  dynamic value = entityMap;
  TypeInfo? valueType =
      TypeInfo.from(entityHandler?.type ?? entityMap.runtimeType);
  EntityHandler? valueEntityHandler = entityHandler;

  for (var key in keys) {
    Object? keyValue;
    TypeInfo? keyType;
    EntityHandler? keyEntityHandler;

    if (key is ConditionKeyField) {
      var keyName = key.name;

      if (value is Map) {
        keyValue = value[keyName];
      } else if (value is Iterable) {
        keyValue = value.map((e) {
          if (e is Map) {
            return e[keyName];
          } else {
            var handler = entityHandler?.getEntityHandler(obj: e);
            if (handler != null) {
              var v = handler.getField(e, keyName);
              return v;
            } else {
              return e;
            }
          }
        }).toList();
      } else {
        throw StateError(
            "Can't access key[$keyName] for type: ${(value as Object?).runtimeTypeNameUnsafe}");
      }

      keyType =
          _resolveValueType(keyName, valueType, valueEntityHandler, keyValue);
      keyEntityHandler =
          _resolveValueEntityHandler(keyType, valueEntityHandler);
    } else if (key is ConditionKeyIndex) {
      var index = key.index;

      if (value is Iterable) {
        keyValue = value.elementAt(index);
        keyType =
            _resolveValueType(null, valueType, valueEntityHandler, keyValue);
        keyEntityHandler =
            _resolveValueEntityHandler(keyType, valueEntityHandler);
      } else {
        throw StateError(
            "Can't access index[$index] for type: ${(value as Object?).runtimeTypeNameUnsafe}");
      }
    }

    if (keyValue == null) {
      return null;
    } else {
      value = keyValue;
      valueType = keyType;
      valueEntityHandler = keyEntityHandler;
    }
  }

  if (valueEntityHandler != null) {
    var idFieldName = valueEntityHandler.idFieldName();

    if (value is Map) {
      value = value[idFieldName];
    } else if (value is Iterable) {
      value = value.map((v) => v is Map ? v[idFieldName] : v).toList();
    }
  }

  return KeyConditionValue(value, valueType, valueEntityHandler);
}