Skip to content

Commit 82af6c2

Browse files
authored
feat(firestore): add support for sum and average aggregated queries (#11757)
* feat(firestore): add support for sum and average aggregated queries * prepare pigeon * ready android * query ready for Android * androidx * fix codec * iOS * main * iOS ready * web * e2e test * e2e test * analyze * fix js * format * windows * format * merge master * fix ios * move to list API * fix import * add test * analyze * fix tests * migrate the API to use optionnal arguments
1 parent 9bc83f1 commit 82af6c2

27 files changed

+2018
-236
lines changed

packages/cloud_firestore/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FlutterFirebaseFirestorePlugin.java

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@
44

55
package io.flutter.plugins.firebase.firestore;
66

7+
import static com.google.firebase.firestore.AggregateField.average;
8+
import static com.google.firebase.firestore.AggregateField.count;
9+
import static com.google.firebase.firestore.AggregateField.sum;
10+
711
import android.app.Activity;
812
import androidx.annotation.NonNull;
913
import androidx.annotation.Nullable;
1014
import com.google.android.gms.tasks.Task;
1115
import com.google.android.gms.tasks.TaskCompletionSource;
1216
import com.google.android.gms.tasks.Tasks;
1317
import com.google.firebase.FirebaseApp;
18+
import com.google.firebase.firestore.AggregateField;
1419
import com.google.firebase.firestore.AggregateQuery;
1520
import com.google.firebase.firestore.AggregateQuerySnapshot;
1621
import com.google.firebase.firestore.DocumentReference;
@@ -729,23 +734,93 @@ public void queryGet(
729734
}
730735

731736
@Override
732-
public void aggregateQueryCount(
737+
public void aggregateQuery(
733738
@NonNull GeneratedAndroidFirebaseFirestore.FirestorePigeonFirebaseApp app,
734739
@NonNull String path,
735740
@NonNull GeneratedAndroidFirebaseFirestore.PigeonQueryParameters parameters,
736741
@NonNull GeneratedAndroidFirebaseFirestore.AggregateSource source,
742+
@NonNull List<GeneratedAndroidFirebaseFirestore.AggregateQuery> queries,
737743
@NonNull Boolean isCollectionGroup,
738-
@NonNull GeneratedAndroidFirebaseFirestore.Result<Double> result) {
744+
@NonNull
745+
GeneratedAndroidFirebaseFirestore.Result<
746+
List<GeneratedAndroidFirebaseFirestore.AggregateQueryResponse>>
747+
result) {
748+
Query query =
749+
PigeonParser.parseQuery(getFirestoreFromPigeon(app), path, isCollectionGroup, parameters);
750+
751+
AggregateQuery aggregateQuery;
752+
ArrayList<AggregateField> aggregateFields = new ArrayList<>();
753+
754+
for (GeneratedAndroidFirebaseFirestore.AggregateQuery queryRequest : queries) {
755+
switch (queryRequest.getType()) {
756+
case COUNT:
757+
aggregateFields.add(count());
758+
break;
759+
case SUM:
760+
assert queryRequest.getField() != null;
761+
aggregateFields.add(sum(queryRequest.getField()));
762+
break;
763+
case AVERAGE:
764+
assert queryRequest.getField() != null;
765+
aggregateFields.add(average(queryRequest.getField()));
766+
break;
767+
}
768+
}
769+
770+
assert query != null;
771+
aggregateQuery =
772+
query.aggregate(
773+
aggregateFields.get(0),
774+
aggregateFields.subList(1, aggregateFields.size()).toArray(new AggregateField[0]));
775+
739776
cachedThreadPool.execute(
740777
() -> {
741778
try {
742-
Query query =
743-
PigeonParser.parseQuery(
744-
getFirestoreFromPigeon(app), path, isCollectionGroup, parameters);
745-
AggregateQuery aggregateQuery = query.count();
746779
AggregateQuerySnapshot aggregateQuerySnapshot =
747780
Tasks.await(aggregateQuery.get(PigeonParser.parseAggregateSource(source)));
748-
result.success((double) aggregateQuerySnapshot.getCount());
781+
782+
ArrayList<GeneratedAndroidFirebaseFirestore.AggregateQueryResponse> aggregateResponse =
783+
new ArrayList<>();
784+
for (GeneratedAndroidFirebaseFirestore.AggregateQuery queryRequest : queries) {
785+
switch (queryRequest.getType()) {
786+
case COUNT:
787+
GeneratedAndroidFirebaseFirestore.AggregateQueryResponse.Builder builder =
788+
new GeneratedAndroidFirebaseFirestore.AggregateQueryResponse.Builder();
789+
builder.setType(GeneratedAndroidFirebaseFirestore.AggregateType.COUNT);
790+
builder.setValue((double) aggregateQuerySnapshot.getCount());
791+
792+
aggregateResponse.add(builder.build());
793+
break;
794+
case SUM:
795+
assert queryRequest.getField() != null;
796+
GeneratedAndroidFirebaseFirestore.AggregateQueryResponse.Builder builderSum =
797+
new GeneratedAndroidFirebaseFirestore.AggregateQueryResponse.Builder();
798+
builderSum.setType(GeneratedAndroidFirebaseFirestore.AggregateType.SUM);
799+
builderSum.setValue(
800+
((Number)
801+
Objects.requireNonNull(
802+
aggregateQuerySnapshot.get(sum(queryRequest.getField()))))
803+
.doubleValue());
804+
builderSum.setField(queryRequest.getField());
805+
806+
aggregateResponse.add(builderSum.build());
807+
break;
808+
case AVERAGE:
809+
assert queryRequest.getField() != null;
810+
GeneratedAndroidFirebaseFirestore.AggregateQueryResponse.Builder builderAverage =
811+
new GeneratedAndroidFirebaseFirestore.AggregateQueryResponse.Builder();
812+
builderAverage.setType(GeneratedAndroidFirebaseFirestore.AggregateType.AVERAGE);
813+
builderAverage.setValue(
814+
Objects.requireNonNull(
815+
aggregateQuerySnapshot.get(average(queryRequest.getField()))));
816+
builderAverage.setField(queryRequest.getField());
817+
818+
aggregateResponse.add(builderAverage.build());
819+
break;
820+
}
821+
}
822+
823+
result.success(aggregateResponse);
749824
} catch (Exception e) {
750825
ExceptionConverter.sendErrorToFlutter(result, e);
751826
}

0 commit comments

Comments
 (0)