From a33831cd002504e5ba2b8a4e2f10980097ed7a5f Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Tue, 22 Feb 2022 11:30:09 -0700 Subject: [PATCH] Backport tests from Web --- .../local/SQLiteIndexManagerTest.java | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/firebase-firestore/src/test/java/com/google/firebase/firestore/local/SQLiteIndexManagerTest.java b/firebase-firestore/src/test/java/com/google/firebase/firestore/local/SQLiteIndexManagerTest.java index d365b9fa748..d7b5eb24ed9 100644 --- a/firebase-firestore/src/test/java/com/google/firebase/firestore/local/SQLiteIndexManagerTest.java +++ b/firebase-firestore/src/test/java/com/google/firebase/firestore/local/SQLiteIndexManagerTest.java @@ -35,6 +35,7 @@ import static org.junit.Assert.assertNull; import com.google.firebase.firestore.auth.User; +import com.google.firebase.firestore.core.Filter; import com.google.firebase.firestore.core.Query; import com.google.firebase.firestore.core.Target; import com.google.firebase.firestore.model.Document; @@ -105,6 +106,16 @@ public void testEqualityFilter() { verifyResults(query, "coll/val2"); } + @Test + public void testOrderByWithNotEqualsFilter() { + indexManager.addFieldIndex(fieldIndex("coll", "count", Kind.ASCENDING)); + addDoc("coll/val1", map("count", 1)); + addDoc("coll/val2", map("count", 2)); + + Query query = query("coll").filter(filter("count", "!=", 2)).orderBy(orderBy("count")); + verifyResults(query, "coll/val1"); + } + @Test public void testNestedFieldEqualityFilter() { indexManager.addFieldIndex(fieldIndex("coll", "a.b", Kind.ASCENDING)); @@ -192,6 +203,17 @@ public void testStartAtFilter() { verifyResults(query, "coll/val2", "coll/val3"); } + @Test + public void testAppliesStartAtFilterWithNotIn() { + setUpSingleValueFilter(); + Query query = + query("coll") + .filter(filter("count", "!=", 2)) + .orderBy(orderBy("count")) + .startAt(bound(/* inclusive= */ true, 2)); + verifyResults(query, "coll/val3"); + } + @Test public void testStartAfterFilter() { setUpSingleValueFilter(); @@ -267,6 +289,93 @@ public void testArrayContainsFilter() { verifyResults(query, "coll/arr1"); } + @Test + public void testArrayContainsWithNotEqualsFilter() { + indexManager.addFieldIndex(fieldIndex("coll", "a", Kind.CONTAINS, "b", Kind.ASCENDING)); + addDoc("coll/val1", map("a", Collections.singletonList(1), "b", 1)); + addDoc("coll/val2", map("a", Collections.singletonList(1), "b", 2)); + addDoc("coll/val3", map("a", Collections.singletonList(2), "b", 1)); + addDoc("coll/val4", map("a", Collections.singletonList(2), "b", 2)); + + Query query = + query("coll").filter(filter("a", "array-contains", 1)).filter(filter("b", "!=", 1)); + verifyResults(query, "coll/val2"); + } + + @Test + public void testArrayContainsWithNotEqualsFilterOnSameField() { + indexManager.addFieldIndex(fieldIndex("coll", "a", Kind.CONTAINS, "a", Kind.ASCENDING)); + addDoc("coll/val1", map("a", Arrays.asList(1, 1))); + addDoc("coll/val2", map("a", Arrays.asList(1, 2))); + addDoc("coll/val3", map("a", Arrays.asList(2, 1))); + addDoc("coll/val4", map("a", Arrays.asList(2, 2))); + + Query query = + query("coll") + .filter(filter("a", "array-contains", 1)) + .filter(filter("a", "!=", Arrays.asList(1, 2))); + verifyResults(query, "coll/val1", "coll/val3"); + } + + @Test + public void testEqualsWithNotEqualsOnSameField() { + setUpSingleValueFilter(); + + Object[][] filtersAndResults = + new Object[][] { + new Filter[] {filter("count", ">", 1), filter("count", "!=", 2)}, + new String[] {"coll/val3"}, + new Filter[] {filter("count", "==", 1), filter("count", "!=", 2)}, + new String[] {"coll/val1"}, + new Filter[] {filter("count", "==", 1), filter("count", "!=", 1)}, + new String[] {}, + new Filter[] {filter("count", ">", 2), filter("count", "!=", 2)}, + new String[] {"coll/val3"}, + new Filter[] {filter("count", ">=", 2), filter("count", "!=", 2)}, + new String[] {"coll/val3"}, + new Filter[] {filter("count", "<=", 2), filter("count", "!=", 2)}, + new String[] {"coll/val1"}, + new Filter[] {filter("count", "<=", 2), filter("count", "!=", 1)}, + new String[] {"coll/val2"}, + new Filter[] {filter("count", "<", 2), filter("count", "!=", 2)}, + new String[] {"coll/val1"}, + new Filter[] {filter("count", "<", 2), filter("count", "!=", 1)}, + new String[] {}, + new Filter[] { + filter("count", ">", 2), filter("count", "not-in", Collections.singletonList(3)) + }, + new String[] {}, + new Filter[] { + filter("count", ">=", 2), filter("count", "not-in", Collections.singletonList(3)) + }, + new String[] {"coll/val2"}, + new Filter[] {filter("count", ">=", 2), filter("count", "not-in", Arrays.asList(3, 3))}, + new String[] {"coll/val2"}, + new Filter[] {filter("count", ">", 1), filter("count", "<", 3), filter("count", "!=", 2)}, + new String[] {}, + new Filter[] { + filter("count", ">=", 1), filter("count", "<", 3), filter("count", "!=", 2) + }, + new String[] {"coll/val1"}, + new Filter[] { + filter("count", ">=", 1), filter("count", "<=", 3), filter("count", "!=", 2) + }, + new String[] {"coll/val1", "coll/val3"}, + new Filter[] { + filter("count", ">", 1), filter("count", "<=", 3), filter("count", "!=", 2) + }, + new String[] {"coll/val3"} + }; + + for (int i = 0; i < filtersAndResults.length; i += 2) { + Query query = query("coll"); + for (Filter filter : (Filter[]) filtersAndResults[i]) { + query = query.filter(filter); + } + verifyResults(query, (String[]) filtersAndResults[i + 1]); + } + } + @Test public void testArrayContainsAnyFilter() { setUpArrayValueFilter();