Skip to content

Commit 08db37c

Browse files
committed
GROUP BY and other AggregateField types added
1 parent 485026d commit 08db37c

File tree

8 files changed

+936
-8
lines changed

8 files changed

+936
-8
lines changed

firebase-firestore/ktx/src/main/kotlin/com/google/firebase/firestore/ktx/Firestore.kt

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,7 @@ import androidx.annotation.Keep
1818
import com.google.firebase.FirebaseApp
1919
import com.google.firebase.components.Component
2020
import com.google.firebase.components.ComponentRegistrar
21-
import com.google.firebase.firestore.DocumentSnapshot
22-
import com.google.firebase.firestore.FieldPath
23-
import com.google.firebase.firestore.FirebaseFirestore
24-
import com.google.firebase.firestore.FirebaseFirestoreSettings
25-
import com.google.firebase.firestore.QueryDocumentSnapshot
26-
import com.google.firebase.firestore.QuerySnapshot
21+
import com.google.firebase.firestore.*
2722
import com.google.firebase.ktx.Firebase
2823
import com.google.firebase.platforminfo.LibraryVersionComponent
2924

@@ -154,6 +149,30 @@ fun firestoreSettings(init: FirebaseFirestoreSettings.Builder.() -> Unit): Fireb
154149
return builder.build()
155150
}
156151

152+
inline fun <reified T> GroupSnapshot.getField(field: String): T? = get(field, T::class.java)
153+
154+
inline fun <reified T> GroupSnapshot.getField(
155+
field: String,
156+
serverTimestampBehavior: DocumentSnapshot.ServerTimestampBehavior
157+
): T? =
158+
get(field, T::class.java, serverTimestampBehavior)
159+
160+
inline fun <reified T> GroupSnapshot.getField(fieldPath: FieldPath): T? = get(fieldPath, T::class.java)
161+
162+
inline fun <reified T> GroupSnapshot.getField(
163+
fieldPath: FieldPath,
164+
serverTimestampBehavior: DocumentSnapshot.ServerTimestampBehavior
165+
): T? =
166+
get(fieldPath, T::class.java, serverTimestampBehavior)
167+
168+
inline fun <reified T> AggregateSnapshot.getField(field: AggregateField): T? = get(field, T::class.java)
169+
170+
inline fun <reified T> AggregateSnapshot.getField(
171+
field: AggregateField,
172+
serverTimestampBehavior: DocumentSnapshot.ServerTimestampBehavior
173+
): T? =
174+
get(field, T::class.java, serverTimestampBehavior)
175+
157176
internal const val LIBRARY_NAME: String = "fire-fst-ktx"
158177

159178
/** @suppress */

firebase-firestore/src/main/java/com/google/firebase/firestore/AggregateField.java

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,66 @@ public static CountAggregateField count() {
2727
return new CountAggregateField();
2828
}
2929

30+
@NonNull
31+
public static MinAggregateField min(@NonNull String field) {
32+
return min(FieldPath.fromDotSeparatedPath(field));
33+
}
34+
35+
@NonNull
36+
public static MinAggregateField min(@NonNull FieldPath field) {
37+
return new MinAggregateField(field);
38+
}
39+
40+
@NonNull
41+
public static MaxAggregateField max(@NonNull String field) {
42+
return max(FieldPath.fromDotSeparatedPath(field));
43+
}
44+
45+
@NonNull
46+
public static MaxAggregateField max(@NonNull FieldPath field) {
47+
return new MaxAggregateField(field);
48+
}
49+
50+
@NonNull
51+
public static AverageAggregateField average(@NonNull String field) {
52+
return average(FieldPath.fromDotSeparatedPath(field));
53+
}
54+
55+
@NonNull
56+
public static AverageAggregateField average(@NonNull FieldPath field) {
57+
return new AverageAggregateField(field);
58+
}
59+
60+
@NonNull
61+
public static SumAggregateField sum(@NonNull String field) {
62+
return sum(FieldPath.fromDotSeparatedPath(field));
63+
}
64+
65+
@NonNull
66+
public static SumAggregateField sum(@NonNull FieldPath field) {
67+
return new SumAggregateField(field);
68+
}
69+
70+
@NonNull
71+
public static FirstAggregateField first(@NonNull String field) {
72+
return first(FieldPath.fromDotSeparatedPath(field));
73+
}
74+
75+
@NonNull
76+
public static FirstAggregateField first(@NonNull FieldPath field) {
77+
return new FirstAggregateField(field);
78+
}
79+
80+
@NonNull
81+
public static LastAggregateField last(@NonNull String field) {
82+
return last(FieldPath.fromDotSeparatedPath(field));
83+
}
84+
85+
@NonNull
86+
public static LastAggregateField last(@NonNull FieldPath field) {
87+
return new LastAggregateField(field);
88+
}
89+
3090
@Override
3191
public abstract boolean equals(Object obj);
3292

@@ -76,4 +136,166 @@ public String toString() {
76136
}
77137
}
78138
}
139+
140+
public static final class MinAggregateField extends AggregateField {
141+
142+
@NonNull private FieldPath field;
143+
144+
MinAggregateField(@NonNull FieldPath field) {
145+
this.field = field;
146+
}
147+
148+
@Override
149+
public boolean equals(Object obj) {
150+
if (obj == null || obj.getClass() != this.getClass()) {
151+
return false;
152+
}
153+
return field.equals(((MinAggregateField) obj).field);
154+
}
155+
156+
@Override
157+
public int hashCode() {
158+
return toString().hashCode();
159+
}
160+
161+
@Override
162+
public String toString() {
163+
return "MIN(" + field.toString() + ")";
164+
}
165+
}
166+
167+
public static final class MaxAggregateField extends AggregateField {
168+
169+
@NonNull private FieldPath field;
170+
171+
MaxAggregateField(@NonNull FieldPath field) {
172+
this.field = field;
173+
}
174+
175+
@Override
176+
public boolean equals(Object obj) {
177+
if (obj == null || obj.getClass() != this.getClass()) {
178+
return false;
179+
}
180+
return field.equals(((MaxAggregateField) obj).field);
181+
}
182+
183+
@Override
184+
public int hashCode() {
185+
return toString().hashCode();
186+
}
187+
188+
@Override
189+
public String toString() {
190+
return "MAX(" + field.toString() + ")";
191+
}
192+
}
193+
194+
public static final class AverageAggregateField extends AggregateField {
195+
196+
@NonNull private FieldPath field;
197+
198+
AverageAggregateField(@NonNull FieldPath field) {
199+
this.field = field;
200+
}
201+
202+
@Override
203+
public boolean equals(Object obj) {
204+
if (obj == null || obj.getClass() != this.getClass()) {
205+
return false;
206+
}
207+
return field.equals(((AverageAggregateField) obj).field);
208+
}
209+
210+
@Override
211+
public int hashCode() {
212+
return toString().hashCode();
213+
}
214+
215+
@Override
216+
public String toString() {
217+
return "AVERAGE(" + field.toString() + ")";
218+
}
219+
}
220+
221+
public static final class SumAggregateField extends AggregateField {
222+
223+
@NonNull private FieldPath field;
224+
225+
SumAggregateField(@NonNull FieldPath field) {
226+
this.field = field;
227+
}
228+
229+
@Override
230+
public boolean equals(Object obj) {
231+
if (obj == null || obj.getClass() != this.getClass()) {
232+
return false;
233+
}
234+
return field.equals(((SumAggregateField) obj).field);
235+
}
236+
237+
@Override
238+
public int hashCode() {
239+
return toString().hashCode();
240+
}
241+
242+
@Override
243+
public String toString() {
244+
return "SUM(" + field.toString() + ")";
245+
}
246+
}
247+
248+
public static final class FirstAggregateField extends AggregateField {
249+
250+
@NonNull private FieldPath field;
251+
252+
FirstAggregateField(@NonNull FieldPath field) {
253+
this.field = field;
254+
}
255+
256+
@Override
257+
public boolean equals(Object obj) {
258+
if (obj == null || obj.getClass() != this.getClass()) {
259+
return false;
260+
}
261+
return field.equals(((FirstAggregateField) obj).field);
262+
}
263+
264+
@Override
265+
public int hashCode() {
266+
return toString().hashCode();
267+
}
268+
269+
@Override
270+
public String toString() {
271+
return "FIRST(" + field.toString() + ")";
272+
}
273+
}
274+
275+
public static final class LastAggregateField extends AggregateField {
276+
277+
@NonNull private FieldPath field;
278+
279+
LastAggregateField(@NonNull FieldPath field) {
280+
this.field = field;
281+
}
282+
283+
@Override
284+
public boolean equals(Object obj) {
285+
if (obj == null || obj.getClass() != this.getClass()) {
286+
return false;
287+
}
288+
return field.equals(((LastAggregateField) obj).field);
289+
}
290+
291+
@Override
292+
public int hashCode() {
293+
return toString().hashCode();
294+
}
295+
296+
@Override
297+
public String toString() {
298+
return "LAST(" + field.toString() + ")";
299+
}
300+
}
79301
}

0 commit comments

Comments
 (0)