loadAggregation<T> method
Future<T?>
loadAggregation<T>(
- ModelAdapterCollectionQuery query,
- 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;
}
}