loadAggregation<T> method

  1. @override
Future<T?> loadAggregation<T>(
  1. ModelAdapterCollectionQuery query,
  2. ModelAggregateQuery<AsyncAggregateValue> aggregateQuery
)
override

Aggregate queries against data collections to retrieve data.

Pass query to the platform configured in the adapter to specify a collection and aggregateQuery to specify an aggregate query.

Returns Null if the type does not match.

データコレクションに対しての集計クエリでデータを取得します。

アダプターで設定されたプラットフォームにqueryを渡してコレクションを指定し、aggregateQueryで集計クエリを指定します。

型が一致しない場合はNullを返します。

Implementation

@override
Future<T?> loadAggregation<T>(
  ModelAdapterCollectionQuery query,
  ModelAggregateQuery aggregateQuery,
) async {
  _assert();
  switch (aggregateQuery.type) {
    case ModelAggregateQueryType.count:
      final data = await database.loadCollection(
        query.copyWith(query: query.query.remove(ModelQueryFilterType.limit)),
        prefix: prefix,
      );
      final val = data.length;
      if (val is! T) {
        return null;
      }
      return val as T;
    case ModelAggregateQueryType.sum:
      final key = aggregateQuery.key;
      assert(
        key.isNotEmpty,
        "Enter [key] for [ModelAggregateQueryType.sum].",
      );
      final data = await database.loadCollection(
        query.copyWith(query: query.query.remove(ModelQueryFilterType.limit)),
        prefix: prefix,
      );
      final val =
          data?.values.fold<double>(0.0, (p, e) => p + e.get(key!, 0.0)) ??
              0.0;
      if (val is! T) {
        return null;
      }
      return val as T;
    case ModelAggregateQueryType.average:
      final key = aggregateQuery.key;
      assert(
        aggregateQuery.key.isNotEmpty,
        "Enter [key] for [ModelAggregateQueryType.average].",
      );
      final data = await database.loadCollection(
        query.copyWith(query: query.query.remove(ModelQueryFilterType.limit)),
        prefix: prefix,
      );
      final val =
          (data?.values.fold<double>(0.0, (p, e) => p + e.get(key!, 0.0)) ??
                  0.0) /
              data.length;
      if (val is! T) {
        return null;
      }
      return val as T;
  }
}