Skip to content

Commit b61853f

Browse files
committed
Add Filter methods and update existing APIs to use them.
1 parent 55641a9 commit b61853f

File tree

11 files changed

+187
-43
lines changed

11 files changed

+187
-43
lines changed

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

Lines changed: 123 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,132 @@
1515
package com.google.firebase.firestore;
1616

1717
import androidx.annotation.NonNull;
18+
import androidx.annotation.Nullable;
1819
import androidx.annotation.RestrictTo;
19-
import com.google.firebase.firestore.model.Document;
20+
import com.google.firebase.firestore.core.FieldFilter;
2021

2122
/** @hide */
2223
@RestrictTo(RestrictTo.Scope.LIBRARY)
23-
public abstract class Filter {
24-
/** Returns true if a document matches the filter. */
25-
public abstract boolean matches(@NonNull Document doc);
24+
public class Filter {
25+
private final FieldPath field;
26+
private final FieldFilter.Operator operator;
27+
private final Object value;
2628

27-
/** A unique ID identifying the filter; used when serializing queries. */
28-
public abstract String getCanonicalId();
29+
private Filter(@NonNull FieldPath field, FieldFilter.Operator operator, Object value) {
30+
this.field = field;
31+
this.operator = operator;
32+
this.value = value;
33+
}
34+
35+
public FieldPath getField() {
36+
return field;
37+
}
38+
39+
public FieldFilter.Operator getOperator() {
40+
return operator;
41+
}
42+
43+
public Object getValue() {
44+
return value;
45+
}
46+
47+
@NonNull
48+
public static Filter equalTo(@NonNull String field, @Nullable Object value) {
49+
return equalTo(FieldPath.fromDotSeparatedPath(field), value);
50+
}
51+
52+
@NonNull
53+
public static Filter equalTo(@NonNull FieldPath fieldPath, @Nullable Object value) {
54+
return new Filter(fieldPath, FieldFilter.Operator.EQUAL, value);
55+
}
56+
57+
@NonNull
58+
public static Filter notEqualTo(@NonNull String field, @Nullable Object value) {
59+
return notEqualTo(FieldPath.fromDotSeparatedPath(field), value);
60+
}
61+
62+
@NonNull
63+
public static Filter notEqualTo(@NonNull FieldPath fieldPath, @Nullable Object value) {
64+
return new Filter(fieldPath, FieldFilter.Operator.NOT_EQUAL, value);
65+
}
66+
67+
@NonNull
68+
public static Filter greaterThan(@NonNull String field, @Nullable Object value) {
69+
return greaterThan(FieldPath.fromDotSeparatedPath(field), value);
70+
}
71+
72+
@NonNull
73+
public static Filter greaterThan(@NonNull FieldPath fieldPath, @Nullable Object value) {
74+
return new Filter(fieldPath, FieldFilter.Operator.GREATER_THAN, value);
75+
}
76+
77+
@NonNull
78+
public static Filter greaterThanOrEqualTo(@NonNull String field, @Nullable Object value) {
79+
return greaterThanOrEqualTo(FieldPath.fromDotSeparatedPath(field), value);
80+
}
81+
82+
@NonNull
83+
public static Filter greaterThanOrEqualTo(@NonNull FieldPath fieldPath, @Nullable Object value) {
84+
return new Filter(fieldPath, FieldFilter.Operator.GREATER_THAN_OR_EQUAL, value);
85+
}
86+
87+
@NonNull
88+
public static Filter lessThan(@NonNull String field, @Nullable Object value) {
89+
return lessThan(FieldPath.fromDotSeparatedPath(field), value);
90+
}
91+
92+
@NonNull
93+
public static Filter lessThan(@NonNull FieldPath fieldPath, @Nullable Object value) {
94+
return new Filter(fieldPath, FieldFilter.Operator.LESS_THAN, value);
95+
}
96+
97+
@NonNull
98+
public static Filter lessThanOrEqualTo(@NonNull String field, @Nullable Object value) {
99+
return lessThanOrEqualTo(FieldPath.fromDotSeparatedPath(field), value);
100+
}
101+
102+
@NonNull
103+
public static Filter lessThanOrEqualTo(@NonNull FieldPath fieldPath, @Nullable Object value) {
104+
return new Filter(fieldPath, FieldFilter.Operator.LESS_THAN_OR_EQUAL, value);
105+
}
106+
107+
@NonNull
108+
public static Filter arrayContains(@NonNull String field, @Nullable Object value) {
109+
return arrayContains(FieldPath.fromDotSeparatedPath(field), value);
110+
}
111+
112+
@NonNull
113+
public static Filter arrayContains(@NonNull FieldPath fieldPath, @Nullable Object value) {
114+
return new Filter(fieldPath, FieldFilter.Operator.ARRAY_CONTAINS, value);
115+
}
116+
117+
@NonNull
118+
public static Filter arrayContainsAny(@NonNull String field, @Nullable Object value) {
119+
return arrayContainsAny(FieldPath.fromDotSeparatedPath(field), value);
120+
}
121+
122+
@NonNull
123+
public static Filter arrayContainsAny(@NonNull FieldPath fieldPath, @Nullable Object value) {
124+
return new Filter(fieldPath, FieldFilter.Operator.ARRAY_CONTAINS_ANY, value);
125+
}
126+
127+
@NonNull
128+
public static Filter inArray(@NonNull String field, @Nullable Object value) {
129+
return inArray(FieldPath.fromDotSeparatedPath(field), value);
130+
}
131+
132+
@NonNull
133+
public static Filter inArray(@NonNull FieldPath fieldPath, @Nullable Object value) {
134+
return new Filter(fieldPath, FieldFilter.Operator.IN, value);
135+
}
136+
137+
@NonNull
138+
public static Filter notInArray(@NonNull String field, @Nullable Object value) {
139+
return notInArray(FieldPath.fromDotSeparatedPath(field), value);
140+
}
141+
142+
@NonNull
143+
public static Filter notInArray(@NonNull FieldPath fieldPath, @Nullable Object value) {
144+
return new Filter(fieldPath, FieldFilter.Operator.NOT_IN, value);
145+
}
29146
}

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

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public FirebaseFirestore getFirestore() {
9090
*/
9191
@NonNull
9292
public Query whereEqualTo(@NonNull String field, @Nullable Object value) {
93-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.EQUAL, value);
93+
return where(Filter.equalTo(field, value));
9494
}
9595

9696
/**
@@ -103,7 +103,7 @@ public Query whereEqualTo(@NonNull String field, @Nullable Object value) {
103103
*/
104104
@NonNull
105105
public Query whereEqualTo(@NonNull FieldPath fieldPath, @Nullable Object value) {
106-
return whereHelper(fieldPath, Operator.EQUAL, value);
106+
return where(Filter.equalTo(fieldPath, value));
107107
}
108108

109109
/**
@@ -119,7 +119,7 @@ public Query whereEqualTo(@NonNull FieldPath fieldPath, @Nullable Object value)
119119
*/
120120
@NonNull
121121
public Query whereNotEqualTo(@NonNull String field, @Nullable Object value) {
122-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.NOT_EQUAL, value);
122+
return where(Filter.notEqualTo(field, value));
123123
}
124124

125125
/**
@@ -135,7 +135,7 @@ public Query whereNotEqualTo(@NonNull String field, @Nullable Object value) {
135135
*/
136136
@NonNull
137137
public Query whereNotEqualTo(@NonNull FieldPath fieldPath, @Nullable Object value) {
138-
return whereHelper(fieldPath, Operator.NOT_EQUAL, value);
138+
return where(Filter.notEqualTo(fieldPath, value));
139139
}
140140

141141
/**
@@ -148,7 +148,7 @@ public Query whereNotEqualTo(@NonNull FieldPath fieldPath, @Nullable Object valu
148148
*/
149149
@NonNull
150150
public Query whereLessThan(@NonNull String field, @NonNull Object value) {
151-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.LESS_THAN, value);
151+
return where(Filter.lessThan(field, value));
152152
}
153153

154154
/**
@@ -161,7 +161,7 @@ public Query whereLessThan(@NonNull String field, @NonNull Object value) {
161161
*/
162162
@NonNull
163163
public Query whereLessThan(@NonNull FieldPath fieldPath, @NonNull Object value) {
164-
return whereHelper(fieldPath, Operator.LESS_THAN, value);
164+
return where(Filter.lessThan(fieldPath, value));
165165
}
166166

167167
/**
@@ -174,7 +174,7 @@ public Query whereLessThan(@NonNull FieldPath fieldPath, @NonNull Object value)
174174
*/
175175
@NonNull
176176
public Query whereLessThanOrEqualTo(@NonNull String field, @NonNull Object value) {
177-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.LESS_THAN_OR_EQUAL, value);
177+
return where(Filter.lessThanOrEqualTo(field, value));
178178
}
179179

180180
/**
@@ -187,7 +187,7 @@ public Query whereLessThanOrEqualTo(@NonNull String field, @NonNull Object value
187187
*/
188188
@NonNull
189189
public Query whereLessThanOrEqualTo(@NonNull FieldPath fieldPath, @NonNull Object value) {
190-
return whereHelper(fieldPath, Operator.LESS_THAN_OR_EQUAL, value);
190+
return where(Filter.lessThanOrEqualTo(fieldPath, value));
191191
}
192192

193193
/**
@@ -200,7 +200,7 @@ public Query whereLessThanOrEqualTo(@NonNull FieldPath fieldPath, @NonNull Objec
200200
*/
201201
@NonNull
202202
public Query whereGreaterThan(@NonNull String field, @NonNull Object value) {
203-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.GREATER_THAN, value);
203+
return where(Filter.greaterThan(field, value));
204204
}
205205

206206
/**
@@ -213,7 +213,7 @@ public Query whereGreaterThan(@NonNull String field, @NonNull Object value) {
213213
*/
214214
@NonNull
215215
public Query whereGreaterThan(@NonNull FieldPath fieldPath, @NonNull Object value) {
216-
return whereHelper(fieldPath, Operator.GREATER_THAN, value);
216+
return where(Filter.greaterThan(fieldPath, value));
217217
}
218218

219219
/**
@@ -226,8 +226,7 @@ public Query whereGreaterThan(@NonNull FieldPath fieldPath, @NonNull Object valu
226226
*/
227227
@NonNull
228228
public Query whereGreaterThanOrEqualTo(@NonNull String field, @NonNull Object value) {
229-
return whereHelper(
230-
FieldPath.fromDotSeparatedPath(field), Operator.GREATER_THAN_OR_EQUAL, value);
229+
return where(Filter.greaterThanOrEqualTo(field, value));
231230
}
232231

233232
/**
@@ -240,7 +239,7 @@ public Query whereGreaterThanOrEqualTo(@NonNull String field, @NonNull Object va
240239
*/
241240
@NonNull
242241
public Query whereGreaterThanOrEqualTo(@NonNull FieldPath fieldPath, @NonNull Object value) {
243-
return whereHelper(fieldPath, Operator.GREATER_THAN_OR_EQUAL, value);
242+
return where(Filter.greaterThanOrEqualTo(fieldPath, value));
244243
}
245244

246245
/**
@@ -257,7 +256,7 @@ public Query whereGreaterThanOrEqualTo(@NonNull FieldPath fieldPath, @NonNull Ob
257256
*/
258257
@NonNull
259258
public Query whereArrayContains(@NonNull String field, @NonNull Object value) {
260-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.ARRAY_CONTAINS, value);
259+
return where(Filter.arrayContains(field, value));
261260
}
262261

263262
/**
@@ -274,7 +273,7 @@ public Query whereArrayContains(@NonNull String field, @NonNull Object value) {
274273
*/
275274
@NonNull
276275
public Query whereArrayContains(@NonNull FieldPath fieldPath, @NonNull Object value) {
277-
return whereHelper(fieldPath, Operator.ARRAY_CONTAINS, value);
276+
return where(Filter.arrayContains(fieldPath, value));
278277
}
279278

280279
/**
@@ -292,7 +291,7 @@ public Query whereArrayContains(@NonNull FieldPath fieldPath, @NonNull Object va
292291
@NonNull
293292
public Query whereArrayContainsAny(
294293
@NonNull String field, @NonNull List<? extends Object> values) {
295-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.ARRAY_CONTAINS_ANY, values);
294+
return where(Filter.arrayContainsAny(field, values));
296295
}
297296

298297
/**
@@ -310,7 +309,7 @@ public Query whereArrayContainsAny(
310309
@NonNull
311310
public Query whereArrayContainsAny(
312311
@NonNull FieldPath fieldPath, @NonNull List<? extends Object> values) {
313-
return whereHelper(fieldPath, Operator.ARRAY_CONTAINS_ANY, values);
312+
return where(Filter.arrayContainsAny(fieldPath, values));
314313
}
315314

316315
/**
@@ -326,7 +325,7 @@ public Query whereArrayContainsAny(
326325
*/
327326
@NonNull
328327
public Query whereIn(@NonNull String field, @NonNull List<? extends Object> values) {
329-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.IN, values);
328+
return where(Filter.inArray(field, values));
330329
}
331330

332331
/**
@@ -342,7 +341,7 @@ public Query whereIn(@NonNull String field, @NonNull List<? extends Object> valu
342341
*/
343342
@NonNull
344343
public Query whereIn(@NonNull FieldPath fieldPath, @NonNull List<? extends Object> values) {
345-
return whereHelper(fieldPath, Operator.IN, values);
344+
return where(Filter.inArray(fieldPath, values));
346345
}
347346

348347
/**
@@ -363,7 +362,7 @@ public Query whereIn(@NonNull FieldPath fieldPath, @NonNull List<? extends Objec
363362
*/
364363
@NonNull
365364
public Query whereNotIn(@NonNull String field, @NonNull List<? extends Object> values) {
366-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.NOT_IN, values);
365+
return where(Filter.notInArray(field, values));
367366
}
368367

369368
/**
@@ -384,19 +383,19 @@ public Query whereNotIn(@NonNull String field, @NonNull List<? extends Object> v
384383
*/
385384
@NonNull
386385
public Query whereNotIn(@NonNull FieldPath fieldPath, @NonNull List<? extends Object> values) {
387-
return whereHelper(fieldPath, Operator.NOT_IN, values);
386+
return where(Filter.notInArray(fieldPath, values));
388387
}
389388

390389
/**
391-
* Creates and returns a new {@code Query} with the additional filter that documents must contain
392-
* the specified field and the value should satisfy the relation constraint provided.
390+
* Parses the given value object and creates a new {@code FieldFilter} with the given field,
391+
* operator, and value. Also performs validation on the filter before retuning it.
393392
*
394393
* @param fieldPath The field to compare
395394
* @param op The operator
396-
* @param value The value for comparison
397-
* @return The created {@code Query}.
395+
* @param value The value for parsing
396+
* @return The created {@code FieldFilter}.
398397
*/
399-
private Query whereHelper(@NonNull FieldPath fieldPath, Operator op, Object value) {
398+
private FieldFilter parseFieldFilter(@NonNull FieldPath fieldPath, Operator op, Object value) {
400399
checkNotNull(fieldPath, "Provided field path must not be null.");
401400
checkNotNull(op, "Provided op must not be null.");
402401
Value fieldValue;
@@ -426,9 +425,15 @@ private Query whereHelper(@NonNull FieldPath fieldPath, Operator op, Object valu
426425
.getUserDataReader()
427426
.parseQueryValue(value, op == Operator.IN || op == Operator.NOT_IN);
428427
}
429-
Filter filter = FieldFilter.create(fieldPath.getInternalPath(), op, fieldValue);
428+
FieldFilter filter = FieldFilter.create(fieldPath.getInternalPath(), op, fieldValue);
430429
validateNewFilter(filter);
431-
return new Query(query.filter(filter), firestore);
430+
return filter;
431+
}
432+
433+
private Query where(Filter filter) {
434+
return new Query(
435+
query.filter(parseFieldFilter(filter.getField(), filter.getOperator(), filter.getValue())),
436+
firestore);
432437
}
433438

434439
private void validateOrderByField(com.google.firebase.firestore.model.FieldPath field) {
@@ -547,7 +552,7 @@ private List<Operator> conflictingOps(Operator op) {
547552
}
548553
}
549554

550-
private void validateNewFilter(Filter filter) {
555+
private void validateNewFilter(com.google.firebase.firestore.core.Filter filter) {
551556
if (filter instanceof FieldFilter) {
552557
FieldFilter fieldFilter = (FieldFilter) filter;
553558
Operator filterOp = fieldFilter.getOperator();

firebase-firestore/src/main/java/com/google/firebase/firestore/bundle/BundleSerializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
import android.util.Base64;
1818
import androidx.annotation.Nullable;
1919
import com.google.firebase.Timestamp;
20-
import com.google.firebase.firestore.Filter;
2120
import com.google.firebase.firestore.core.Bound;
2221
import com.google.firebase.firestore.core.FieldFilter;
22+
import com.google.firebase.firestore.core.Filter;
2323
import com.google.firebase.firestore.core.OrderBy;
2424
import com.google.firebase.firestore.core.Query;
2525
import com.google.firebase.firestore.core.Target;

firebase-firestore/src/main/java/com/google/firebase/firestore/core/FieldFilter.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
import static com.google.firebase.firestore.util.Assert.hardAssert;
1818

19-
import com.google.firebase.firestore.Filter;
2019
import com.google.firebase.firestore.model.Document;
2120
import com.google.firebase.firestore.model.FieldPath;
2221
import com.google.firebase.firestore.model.Values;

0 commit comments

Comments
 (0)