Skip to content

Commit 082053b

Browse files
ehsannaspull[bot]
authored andcommitted
Create firestore/Filter.java (#3237)
* Create firestore/Filter.java and remove firestore/core/Filter.java. * Add Filter methods and update existing APIs to use them. * Address comments. * address comments.
1 parent 98e5328 commit 082053b

File tree

11 files changed

+337
-184
lines changed

11 files changed

+337
-184
lines changed
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
// Copyright 2021 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package com.google.firebase.firestore;
16+
17+
import androidx.annotation.NonNull;
18+
import androidx.annotation.Nullable;
19+
import androidx.annotation.RestrictTo;
20+
import com.google.firebase.firestore.core.FieldFilter;
21+
22+
/** @hide */
23+
@RestrictTo(RestrictTo.Scope.LIBRARY)
24+
public class Filter {
25+
private final FieldPath field;
26+
private final FieldFilter.Operator operator;
27+
private final Object value;
28+
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+
/** @hide */
36+
@RestrictTo(RestrictTo.Scope.LIBRARY)
37+
public FieldPath getField() {
38+
return field;
39+
}
40+
41+
/** @hide */
42+
@RestrictTo(RestrictTo.Scope.LIBRARY)
43+
public FieldFilter.Operator getOperator() {
44+
return operator;
45+
}
46+
47+
/** @hide */
48+
@RestrictTo(RestrictTo.Scope.LIBRARY)
49+
public Object getValue() {
50+
return value;
51+
}
52+
53+
@NonNull
54+
public static Filter equalTo(@NonNull String field, @Nullable Object value) {
55+
return equalTo(FieldPath.fromDotSeparatedPath(field), value);
56+
}
57+
58+
@NonNull
59+
public static Filter equalTo(@NonNull FieldPath fieldPath, @Nullable Object value) {
60+
return new Filter(fieldPath, FieldFilter.Operator.EQUAL, value);
61+
}
62+
63+
@NonNull
64+
public static Filter notEqualTo(@NonNull String field, @Nullable Object value) {
65+
return notEqualTo(FieldPath.fromDotSeparatedPath(field), value);
66+
}
67+
68+
@NonNull
69+
public static Filter notEqualTo(@NonNull FieldPath fieldPath, @Nullable Object value) {
70+
return new Filter(fieldPath, FieldFilter.Operator.NOT_EQUAL, value);
71+
}
72+
73+
@NonNull
74+
public static Filter greaterThan(@NonNull String field, @Nullable Object value) {
75+
return greaterThan(FieldPath.fromDotSeparatedPath(field), value);
76+
}
77+
78+
@NonNull
79+
public static Filter greaterThan(@NonNull FieldPath fieldPath, @Nullable Object value) {
80+
return new Filter(fieldPath, FieldFilter.Operator.GREATER_THAN, value);
81+
}
82+
83+
@NonNull
84+
public static Filter greaterThanOrEqualTo(@NonNull String field, @Nullable Object value) {
85+
return greaterThanOrEqualTo(FieldPath.fromDotSeparatedPath(field), value);
86+
}
87+
88+
@NonNull
89+
public static Filter greaterThanOrEqualTo(@NonNull FieldPath fieldPath, @Nullable Object value) {
90+
return new Filter(fieldPath, FieldFilter.Operator.GREATER_THAN_OR_EQUAL, value);
91+
}
92+
93+
@NonNull
94+
public static Filter lessThan(@NonNull String field, @Nullable Object value) {
95+
return lessThan(FieldPath.fromDotSeparatedPath(field), value);
96+
}
97+
98+
@NonNull
99+
public static Filter lessThan(@NonNull FieldPath fieldPath, @Nullable Object value) {
100+
return new Filter(fieldPath, FieldFilter.Operator.LESS_THAN, value);
101+
}
102+
103+
@NonNull
104+
public static Filter lessThanOrEqualTo(@NonNull String field, @Nullable Object value) {
105+
return lessThanOrEqualTo(FieldPath.fromDotSeparatedPath(field), value);
106+
}
107+
108+
@NonNull
109+
public static Filter lessThanOrEqualTo(@NonNull FieldPath fieldPath, @Nullable Object value) {
110+
return new Filter(fieldPath, FieldFilter.Operator.LESS_THAN_OR_EQUAL, value);
111+
}
112+
113+
@NonNull
114+
public static Filter arrayContains(@NonNull String field, @Nullable Object value) {
115+
return arrayContains(FieldPath.fromDotSeparatedPath(field), value);
116+
}
117+
118+
@NonNull
119+
public static Filter arrayContains(@NonNull FieldPath fieldPath, @Nullable Object value) {
120+
return new Filter(fieldPath, FieldFilter.Operator.ARRAY_CONTAINS, value);
121+
}
122+
123+
@NonNull
124+
public static Filter arrayContainsAny(@NonNull String field, @Nullable Object value) {
125+
return arrayContainsAny(FieldPath.fromDotSeparatedPath(field), value);
126+
}
127+
128+
@NonNull
129+
public static Filter arrayContainsAny(@NonNull FieldPath fieldPath, @Nullable Object value) {
130+
return new Filter(fieldPath, FieldFilter.Operator.ARRAY_CONTAINS_ANY, value);
131+
}
132+
133+
@NonNull
134+
public static Filter inArray(@NonNull String field, @Nullable Object value) {
135+
return inArray(FieldPath.fromDotSeparatedPath(field), value);
136+
}
137+
138+
@NonNull
139+
public static Filter inArray(@NonNull FieldPath fieldPath, @Nullable Object value) {
140+
return new Filter(fieldPath, FieldFilter.Operator.IN, value);
141+
}
142+
143+
@NonNull
144+
public static Filter notInArray(@NonNull String field, @Nullable Object value) {
145+
return notInArray(FieldPath.fromDotSeparatedPath(field), value);
146+
}
147+
148+
@NonNull
149+
public static Filter notInArray(@NonNull FieldPath fieldPath, @Nullable Object value) {
150+
return new Filter(fieldPath, FieldFilter.Operator.NOT_IN, value);
151+
}
152+
}

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

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@
3030
import com.google.firebase.firestore.core.Bound;
3131
import com.google.firebase.firestore.core.EventManager.ListenOptions;
3232
import com.google.firebase.firestore.core.FieldFilter;
33-
import com.google.firebase.firestore.core.Filter;
34-
import com.google.firebase.firestore.core.Filter.Operator;
33+
import com.google.firebase.firestore.core.FieldFilter.Operator;
3534
import com.google.firebase.firestore.core.ListenerRegistrationImpl;
3635
import com.google.firebase.firestore.core.OrderBy;
3736
import com.google.firebase.firestore.core.QueryListener;
@@ -91,7 +90,7 @@ public FirebaseFirestore getFirestore() {
9190
*/
9291
@NonNull
9392
public Query whereEqualTo(@NonNull String field, @Nullable Object value) {
94-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.EQUAL, value);
93+
return where(Filter.equalTo(field, value));
9594
}
9695

9796
/**
@@ -104,7 +103,7 @@ public Query whereEqualTo(@NonNull String field, @Nullable Object value) {
104103
*/
105104
@NonNull
106105
public Query whereEqualTo(@NonNull FieldPath fieldPath, @Nullable Object value) {
107-
return whereHelper(fieldPath, Operator.EQUAL, value);
106+
return where(Filter.equalTo(fieldPath, value));
108107
}
109108

110109
/**
@@ -120,7 +119,7 @@ public Query whereEqualTo(@NonNull FieldPath fieldPath, @Nullable Object value)
120119
*/
121120
@NonNull
122121
public Query whereNotEqualTo(@NonNull String field, @Nullable Object value) {
123-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.NOT_EQUAL, value);
122+
return where(Filter.notEqualTo(field, value));
124123
}
125124

126125
/**
@@ -136,7 +135,7 @@ public Query whereNotEqualTo(@NonNull String field, @Nullable Object value) {
136135
*/
137136
@NonNull
138137
public Query whereNotEqualTo(@NonNull FieldPath fieldPath, @Nullable Object value) {
139-
return whereHelper(fieldPath, Operator.NOT_EQUAL, value);
138+
return where(Filter.notEqualTo(fieldPath, value));
140139
}
141140

142141
/**
@@ -149,7 +148,7 @@ public Query whereNotEqualTo(@NonNull FieldPath fieldPath, @Nullable Object valu
149148
*/
150149
@NonNull
151150
public Query whereLessThan(@NonNull String field, @NonNull Object value) {
152-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.LESS_THAN, value);
151+
return where(Filter.lessThan(field, value));
153152
}
154153

155154
/**
@@ -162,7 +161,7 @@ public Query whereLessThan(@NonNull String field, @NonNull Object value) {
162161
*/
163162
@NonNull
164163
public Query whereLessThan(@NonNull FieldPath fieldPath, @NonNull Object value) {
165-
return whereHelper(fieldPath, Operator.LESS_THAN, value);
164+
return where(Filter.lessThan(fieldPath, value));
166165
}
167166

168167
/**
@@ -175,7 +174,7 @@ public Query whereLessThan(@NonNull FieldPath fieldPath, @NonNull Object value)
175174
*/
176175
@NonNull
177176
public Query whereLessThanOrEqualTo(@NonNull String field, @NonNull Object value) {
178-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.LESS_THAN_OR_EQUAL, value);
177+
return where(Filter.lessThanOrEqualTo(field, value));
179178
}
180179

181180
/**
@@ -188,7 +187,7 @@ public Query whereLessThanOrEqualTo(@NonNull String field, @NonNull Object value
188187
*/
189188
@NonNull
190189
public Query whereLessThanOrEqualTo(@NonNull FieldPath fieldPath, @NonNull Object value) {
191-
return whereHelper(fieldPath, Operator.LESS_THAN_OR_EQUAL, value);
190+
return where(Filter.lessThanOrEqualTo(fieldPath, value));
192191
}
193192

194193
/**
@@ -201,7 +200,7 @@ public Query whereLessThanOrEqualTo(@NonNull FieldPath fieldPath, @NonNull Objec
201200
*/
202201
@NonNull
203202
public Query whereGreaterThan(@NonNull String field, @NonNull Object value) {
204-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.GREATER_THAN, value);
203+
return where(Filter.greaterThan(field, value));
205204
}
206205

207206
/**
@@ -214,7 +213,7 @@ public Query whereGreaterThan(@NonNull String field, @NonNull Object value) {
214213
*/
215214
@NonNull
216215
public Query whereGreaterThan(@NonNull FieldPath fieldPath, @NonNull Object value) {
217-
return whereHelper(fieldPath, Operator.GREATER_THAN, value);
216+
return where(Filter.greaterThan(fieldPath, value));
218217
}
219218

220219
/**
@@ -227,8 +226,7 @@ public Query whereGreaterThan(@NonNull FieldPath fieldPath, @NonNull Object valu
227226
*/
228227
@NonNull
229228
public Query whereGreaterThanOrEqualTo(@NonNull String field, @NonNull Object value) {
230-
return whereHelper(
231-
FieldPath.fromDotSeparatedPath(field), Operator.GREATER_THAN_OR_EQUAL, value);
229+
return where(Filter.greaterThanOrEqualTo(field, value));
232230
}
233231

234232
/**
@@ -241,7 +239,7 @@ public Query whereGreaterThanOrEqualTo(@NonNull String field, @NonNull Object va
241239
*/
242240
@NonNull
243241
public Query whereGreaterThanOrEqualTo(@NonNull FieldPath fieldPath, @NonNull Object value) {
244-
return whereHelper(fieldPath, Operator.GREATER_THAN_OR_EQUAL, value);
242+
return where(Filter.greaterThanOrEqualTo(fieldPath, value));
245243
}
246244

247245
/**
@@ -258,7 +256,7 @@ public Query whereGreaterThanOrEqualTo(@NonNull FieldPath fieldPath, @NonNull Ob
258256
*/
259257
@NonNull
260258
public Query whereArrayContains(@NonNull String field, @NonNull Object value) {
261-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.ARRAY_CONTAINS, value);
259+
return where(Filter.arrayContains(field, value));
262260
}
263261

264262
/**
@@ -275,7 +273,7 @@ public Query whereArrayContains(@NonNull String field, @NonNull Object value) {
275273
*/
276274
@NonNull
277275
public Query whereArrayContains(@NonNull FieldPath fieldPath, @NonNull Object value) {
278-
return whereHelper(fieldPath, Operator.ARRAY_CONTAINS, value);
276+
return where(Filter.arrayContains(fieldPath, value));
279277
}
280278

281279
/**
@@ -293,7 +291,7 @@ public Query whereArrayContains(@NonNull FieldPath fieldPath, @NonNull Object va
293291
@NonNull
294292
public Query whereArrayContainsAny(
295293
@NonNull String field, @NonNull List<? extends Object> values) {
296-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.ARRAY_CONTAINS_ANY, values);
294+
return where(Filter.arrayContainsAny(field, values));
297295
}
298296

299297
/**
@@ -311,7 +309,7 @@ public Query whereArrayContainsAny(
311309
@NonNull
312310
public Query whereArrayContainsAny(
313311
@NonNull FieldPath fieldPath, @NonNull List<? extends Object> values) {
314-
return whereHelper(fieldPath, Operator.ARRAY_CONTAINS_ANY, values);
312+
return where(Filter.arrayContainsAny(fieldPath, values));
315313
}
316314

317315
/**
@@ -327,7 +325,7 @@ public Query whereArrayContainsAny(
327325
*/
328326
@NonNull
329327
public Query whereIn(@NonNull String field, @NonNull List<? extends Object> values) {
330-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.IN, values);
328+
return where(Filter.inArray(field, values));
331329
}
332330

333331
/**
@@ -343,7 +341,7 @@ public Query whereIn(@NonNull String field, @NonNull List<? extends Object> valu
343341
*/
344342
@NonNull
345343
public Query whereIn(@NonNull FieldPath fieldPath, @NonNull List<? extends Object> values) {
346-
return whereHelper(fieldPath, Operator.IN, values);
344+
return where(Filter.inArray(fieldPath, values));
347345
}
348346

349347
/**
@@ -364,7 +362,7 @@ public Query whereIn(@NonNull FieldPath fieldPath, @NonNull List<? extends Objec
364362
*/
365363
@NonNull
366364
public Query whereNotIn(@NonNull String field, @NonNull List<? extends Object> values) {
367-
return whereHelper(FieldPath.fromDotSeparatedPath(field), Operator.NOT_IN, values);
365+
return where(Filter.notInArray(field, values));
368366
}
369367

370368
/**
@@ -385,19 +383,19 @@ public Query whereNotIn(@NonNull String field, @NonNull List<? extends Object> v
385383
*/
386384
@NonNull
387385
public Query whereNotIn(@NonNull FieldPath fieldPath, @NonNull List<? extends Object> values) {
388-
return whereHelper(fieldPath, Operator.NOT_IN, values);
386+
return where(Filter.notInArray(fieldPath, values));
389387
}
390388

391389
/**
392-
* Creates and returns a new {@code Query} with the additional filter that documents must contain
393-
* 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.
394392
*
395393
* @param fieldPath The field to compare
396394
* @param op The operator
397-
* @param value The value for comparison
398-
* @return The created {@code Query}.
395+
* @param value The value for parsing
396+
* @return The created {@code FieldFilter}.
399397
*/
400-
private Query whereHelper(@NonNull FieldPath fieldPath, Operator op, Object value) {
398+
private FieldFilter parseFieldFilter(@NonNull FieldPath fieldPath, Operator op, Object value) {
401399
checkNotNull(fieldPath, "Provided field path must not be null.");
402400
checkNotNull(op, "Provided op must not be null.");
403401
Value fieldValue;
@@ -427,9 +425,16 @@ private Query whereHelper(@NonNull FieldPath fieldPath, Operator op, Object valu
427425
.getUserDataReader()
428426
.parseQueryValue(value, op == Operator.IN || op == Operator.NOT_IN);
429427
}
430-
Filter filter = FieldFilter.create(fieldPath.getInternalPath(), op, fieldValue);
428+
FieldFilter filter = FieldFilter.create(fieldPath.getInternalPath(), op, fieldValue);
431429
validateNewFilter(filter);
432-
return new Query(query.filter(filter), firestore);
430+
return filter;
431+
}
432+
433+
// TODO(orquery): This method will become public API. Change visibility and add documentation.
434+
private Query where(Filter filter) {
435+
return new Query(
436+
query.filter(parseFieldFilter(filter.getField(), filter.getOperator(), filter.getValue())),
437+
firestore);
433438
}
434439

435440
private void validateOrderByField(com.google.firebase.firestore.model.FieldPath field) {
@@ -548,13 +553,13 @@ private List<Operator> conflictingOps(Operator op) {
548553
}
549554
}
550555

551-
private void validateNewFilter(Filter filter) {
556+
private void validateNewFilter(com.google.firebase.firestore.core.Filter filter) {
552557
if (filter instanceof FieldFilter) {
553558
FieldFilter fieldFilter = (FieldFilter) filter;
554559
Operator filterOp = fieldFilter.getOperator();
555560
if (fieldFilter.isInequality()) {
556561
com.google.firebase.firestore.model.FieldPath existingInequality = query.inequalityField();
557-
com.google.firebase.firestore.model.FieldPath newInequality = filter.getField();
562+
com.google.firebase.firestore.model.FieldPath newInequality = fieldFilter.getField();
558563

559564
if (existingInequality != null && !existingInequality.equals(newInequality)) {
560565
throw new IllegalArgumentException(

0 commit comments

Comments
 (0)