|
4 | 4 |
|
5 | 5 | package io.flutter.plugins.firebase.firestore;
|
6 | 6 |
|
| 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 | + |
7 | 11 | import android.app.Activity;
|
8 | 12 | import androidx.annotation.NonNull;
|
9 | 13 | import androidx.annotation.Nullable;
|
10 | 14 | import com.google.android.gms.tasks.Task;
|
11 | 15 | import com.google.android.gms.tasks.TaskCompletionSource;
|
12 | 16 | import com.google.android.gms.tasks.Tasks;
|
13 | 17 | import com.google.firebase.FirebaseApp;
|
| 18 | +import com.google.firebase.firestore.AggregateField; |
14 | 19 | import com.google.firebase.firestore.AggregateQuery;
|
15 | 20 | import com.google.firebase.firestore.AggregateQuerySnapshot;
|
16 | 21 | import com.google.firebase.firestore.DocumentReference;
|
@@ -729,23 +734,93 @@ public void queryGet(
|
729 | 734 | }
|
730 | 735 |
|
731 | 736 | @Override
|
732 |
| - public void aggregateQueryCount( |
| 737 | + public void aggregateQuery( |
733 | 738 | @NonNull GeneratedAndroidFirebaseFirestore.FirestorePigeonFirebaseApp app,
|
734 | 739 | @NonNull String path,
|
735 | 740 | @NonNull GeneratedAndroidFirebaseFirestore.PigeonQueryParameters parameters,
|
736 | 741 | @NonNull GeneratedAndroidFirebaseFirestore.AggregateSource source,
|
| 742 | + @NonNull List<GeneratedAndroidFirebaseFirestore.AggregateQuery> queries, |
737 | 743 | @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 | + |
739 | 776 | cachedThreadPool.execute(
|
740 | 777 | () -> {
|
741 | 778 | try {
|
742 |
| - Query query = |
743 |
| - PigeonParser.parseQuery( |
744 |
| - getFirestoreFromPigeon(app), path, isCollectionGroup, parameters); |
745 |
| - AggregateQuery aggregateQuery = query.count(); |
746 | 779 | AggregateQuerySnapshot aggregateQuerySnapshot =
|
747 | 780 | 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); |
749 | 824 | } catch (Exception e) {
|
750 | 825 | ExceptionConverter.sendErrorToFlutter(result, e);
|
751 | 826 | }
|
|
0 commit comments