Skip to content

Commit

Permalink
feat: Changed implementation around Aggregate.
Browse files Browse the repository at this point in the history
  • Loading branch information
mathrunet committed Jan 31, 2024
1 parent a4657ac commit fec4d62
Show file tree
Hide file tree
Showing 20 changed files with 281 additions and 214 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>11.0</string>
<string>12.0</string>
</dict>
</plist>
2 changes: 1 addition & 1 deletion packages/katana_model/example/ios/Podfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '11.0'
# platform :ios, '12.0'

# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1300;
LastUpgradeCheck = 1430;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
Expand Down Expand Up @@ -205,6 +205,7 @@
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
Expand Down Expand Up @@ -342,7 +343,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
Expand Down Expand Up @@ -420,7 +421,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
Expand Down Expand Up @@ -469,7 +470,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
LastUpgradeVersion = "1430"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
6 changes: 3 additions & 3 deletions packages/katana_model/example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -329,21 +329,21 @@ packages:
path: "../../katana"
relative: true
source: path
version: "2.10.2"
version: "2.11.0"
katana_listenables_annotation:
dependency: "direct overridden"
description:
path: "../../katana_listenables_annotation"
relative: true
source: path
version: "2.0.35"
version: "2.1.0"
katana_model:
dependency: "direct main"
description:
path: ".."
relative: true
source: path
version: "2.20.1"
version: "2.22.1"
lints:
dependency: transitive
description:
Expand Down
31 changes: 19 additions & 12 deletions packages/katana_model/lib/adapter/runtime_model_adapter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ class RuntimeModelAdapter extends ModelAdapter {
}

@override
Future<num> loadAggregation(
Future<T?> loadAggregation<T>(
ModelAdapterCollectionQuery query,
ModelAggregateQuery aggregateQuery,
) async {
Expand All @@ -179,7 +179,11 @@ class RuntimeModelAdapter extends ModelAdapter {
query.copyWith(query: query.query.remove(ModelQueryFilterType.limit)),
prefix: prefix,
);
return data.length;
final val = data.length;
if (val is! T) {
return null;
}
return val as T;
case ModelAggregateQueryType.sum:
final key = aggregateQuery.key;
assert(
Expand All @@ -193,11 +197,13 @@ class RuntimeModelAdapter extends ModelAdapter {
query.copyWith(query: query.query.remove(ModelQueryFilterType.limit)),
prefix: prefix,
);
if (data.isEmpty) {
return 0.0;
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 data?.values.fold<double>(0.0, (p, e) => p + e.get(key!, 0.0)) ??
0.0;
return val as T;
case ModelAggregateQueryType.average:
final key = aggregateQuery.key;
assert(
Expand All @@ -211,13 +217,14 @@ class RuntimeModelAdapter extends ModelAdapter {
query.copyWith(query: query.query.remove(ModelQueryFilterType.limit)),
prefix: prefix,
);
if (data.isEmpty) {
return 0.0;
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 (data?.values
.fold<double>(0.0, (p, e) => p + e.get(key!, 0.0)) ??
0.0) /
data.length;
return val as T;
}
}

Expand Down
19 changes: 12 additions & 7 deletions packages/katana_model/lib/src/collection_base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -348,15 +348,20 @@ abstract class CollectionBase<TModel extends DocumentBase>
/// [AsyncAggregateValue]が返されるので少し待ったあと[AsyncAggregateValue.value]から値を取得してください。
///
/// [load]で読み込んだ値は通常は保持されますが、[reload]を実行した場合は再度読み込まれます。
CollectionAggregateQuery aggregate(ModelAggregateQuery query) {
return CollectionAggregateQuery._(
query: query,
collection: this,
onFinished: notifyListeners,
);
TValue aggregate<TValue extends AsyncAggregateValue>(
ModelAggregateQuery<TValue> query) {
if (_aggregate.containsKey(query)) {
final val = _aggregate[query];
if (val is TValue) {
return val;
}
}
final val = query.onCreate(query, this, notifyListeners);
_aggregate[query] = val;
return val;
}

final List<AsyncAggregateValue> _aggregate = [];
final Map<ModelAggregateQuery, AsyncAggregateValue> _aggregate = {};

/// {@macro model_transaction}
///
Expand Down
6 changes: 5 additions & 1 deletion packages/katana_model/lib/src/model_adapter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,14 @@ abstract class ModelAdapter {
///
/// 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]で集計クエリを指定します。
Future<num> loadAggregation(
///
/// 型が一致しない場合は[Null]を返します。
Future<T?> loadAggregation<T>(
ModelAdapterCollectionQuery query,
ModelAggregateQuery aggregateQuery,
);
Expand Down
Loading

0 comments on commit fec4d62

Please sign in to comment.