Skip to content

Commit 45f15c6

Browse files
author
Brian Chen
committed
Fix NotInFilter matching
1 parent 17c9403 commit 45f15c6

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

firebase-firestore/src/androidTest/java/com/google/firebase/firestore/QueryTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ public void testQueriesCanUseNotInFilters() {
659659
// With Null.
660660
List<Object> nullArray = new ArrayList<>();
661661
nullArray.add(null);
662-
snapshot = waitFor(collection.whereNotIn("key", nullArray).get());
662+
snapshot = waitFor(collection.whereNotIn("zip", nullArray).get());
663663
assertEquals(new ArrayList<>(), querySnapshotToValues(snapshot));
664664

665665
// With NaN.

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ public class NotInFilter extends FieldFilter {
3030

3131
@Override
3232
public boolean matches(Document doc) {
33+
if (Values.contains(getValue().getArrayValue(), Values.NULL_VALUE)) {
34+
return false;
35+
}
3336
Value other = doc.getField(getField());
3437
return other != null && !Values.contains(getValue().getArrayValue(), other);
3538
}

firebase-firestore/src/test/java/com/google/firebase/firestore/remote/RemoteSerializerTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,11 @@
8484
import com.google.firestore.v1.Write;
8585
import com.google.protobuf.ByteString;
8686
import com.google.protobuf.Int32Value;
87+
import com.google.protobuf.NullValue;
8788
import com.google.protobuf.Timestamp;
8889
import com.google.type.LatLng;
8990
import io.grpc.Status;
91+
import java.util.ArrayList;
9092
import java.util.Calendar;
9193
import java.util.Date;
9294
import java.util.List;
@@ -706,6 +708,31 @@ public void testNotInSerialization() {
706708
assertTrue(roundTripped instanceof NotInFilter);
707709
}
708710

711+
@Test
712+
public void testNotInWithNullSerialization() {
713+
List<Object> nullArray = new ArrayList<>();
714+
nullArray.add(null);
715+
FieldFilter inputFilter = filter("field", "not-in", nullArray);
716+
StructuredQuery.Filter apiFilter = serializer.encodeUnaryOrFieldFilter(inputFilter);
717+
718+
ArrayValue.Builder notInFilterValue =
719+
ArrayValue.newBuilder().addValues(Value.newBuilder().setNullValue(NullValue.NULL_VALUE));
720+
StructuredQuery.Filter expectedFilter =
721+
Filter.newBuilder()
722+
.setFieldFilter(
723+
StructuredQuery.FieldFilter.newBuilder()
724+
.setField(FieldReference.newBuilder().setFieldPath("field"))
725+
.setOp(Operator.NOT_IN)
726+
.setValue(Value.newBuilder().setArrayValue(notInFilterValue))
727+
.build())
728+
.build();
729+
730+
assertEquals(expectedFilter, apiFilter);
731+
FieldFilter roundTripped = serializer.decodeFieldFilter(apiFilter.getFieldFilter());
732+
assertEquals(roundTripped, inputFilter);
733+
assertTrue(roundTripped instanceof NotInFilter);
734+
}
735+
709736
@Test
710737
public void testArrayContainsAnySerialization() {
711738
FieldFilter inputFilter = filter("field", "array-contains-any", asList(42));

0 commit comments

Comments
 (0)