Skip to content

Commit 505f72e

Browse files
Review
1 parent fdda906 commit 505f72e

File tree

5 files changed

+50
-6
lines changed

5 files changed

+50
-6
lines changed
Submodule crashpad updated from 281ba70 to e5e47bc

firebase-firestore/src/main/java/com/google/firebase/firestore/local/IndexBackfiller.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ private IndexOffset getExistingOffset(Collection<FieldIndex> fieldIndexes) {
177177
private IndexOffset getNewOffset(List<Document> documents, IndexOffset currentOffset) {
178178
IndexOffset latestOffset =
179179
documents.isEmpty()
180-
? IndexOffset.NONE
180+
? IndexOffset.create(remoteDocumentCache.getLatestReadTime())
181181
: IndexOffset.create(
182182
documents.get(documents.size() - 1).getReadTime(),
183183
documents.get(documents.size() - 1).getKey());

firebase-firestore/src/main/java/com/google/firebase/firestore/model/FieldIndex.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,11 @@ public static IndexOffset create(SnapshotVersion readTime, DocumentKey documentK
130130
* Creates an offset that matches all documents with a read time higher than {@code readTime}.
131131
*/
132132
public static IndexOffset create(SnapshotVersion readTime) {
133+
// We want to create an offset that matches all documents with a read time greater than
134+
// the provided read time. To do so, we technically need to create an offset for
135+
// `(readTime, MAX_DOCUMENT_KEY)`. While we could use Unicode codepoints to generate
136+
// MAX_DOCUMENT_KEY, it is much easier to use `(readTime + 1, DocumentKey.empty())` since
137+
// `> DocumentKey.empty()` matches all valid document IDs.
133138
long successorSeconds = readTime.getTimestamp().getSeconds();
134139
int successorNanos = readTime.getTimestamp().getNanoseconds() + 1;
135140
SnapshotVersion successor =

firebase-firestore/src/test/java/com/google/firebase/firestore/local/IndexBackfillerTest.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,13 +188,13 @@ public void testBackfillUsesDocumentKeyOffsetForLargeSnapshots() {
188188
addDoc("coll1/docB", "foo", version(1));
189189
addDoc("coll1/docC", "foo", version(1));
190190

191-
IndexBackfiller.Results results = backfiller.backfill();
192-
assertEquals(2, results.getDocumentsProcessed());
191+
int documentsProcessed = backfiller.backfill();
192+
assertEquals(2, documentsProcessed);
193193

194194
verifyQueryResults("coll1", "coll1/docA", "coll1/docB");
195195

196-
results = backfiller.backfill();
197-
assertEquals(1, results.getDocumentsProcessed());
196+
documentsProcessed = backfiller.backfill();
197+
assertEquals(1, documentsProcessed);
198198

199199
verifyQueryResults("coll1", "coll1/docA", "coll1/docB", "coll1/docC");
200200
}
@@ -261,6 +261,21 @@ public void testBackfillWritesUntilCap() {
261261
verifyQueryResults("coll2", "coll2/docA");
262262
}
263263

264+
@Test
265+
public void testBackfillUsesLatestReadTimeForEmptyCollections() {
266+
addFieldIndex("coll", "foo", version(1));
267+
addDoc("readtime/doc", "foo", version(2));
268+
269+
int documentsProcessed = backfiller.backfill();
270+
assertEquals(0, documentsProcessed);
271+
272+
addDoc("coll/ignored", "foo", version(2));
273+
addDoc("coll/added", "foo", version(3));
274+
275+
documentsProcessed = backfiller.backfill();
276+
assertEquals(1, documentsProcessed);
277+
}
278+
264279
private void addFieldIndex(String collectionGroup, String fieldName) {
265280
FieldIndex fieldIndex =
266281
fieldIndex(collectionGroup, fieldName, FieldIndex.Segment.Kind.ASCENDING);

firebase-firestore/src/test/java/com/google/firebase/firestore/model/FieldIndexTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
import static com.google.firebase.firestore.model.FieldIndex.IndexState;
1818
import static com.google.firebase.firestore.model.FieldIndex.SEMANTIC_COMPARATOR;
1919
import static com.google.firebase.firestore.testutil.TestUtil.fieldIndex;
20+
import static com.google.firebase.firestore.testutil.TestUtil.key;
2021
import static com.google.firebase.firestore.testutil.TestUtil.version;
2122
import static org.junit.Assert.assertEquals;
2223

24+
import com.google.firebase.firestore.model.FieldIndex.IndexOffset;
2325
import org.junit.Test;
2426
import org.junit.runner.RunWith;
2527
import org.robolectric.RobolectricTestRunner;
@@ -89,4 +91,26 @@ public void comparatorIncludesSegmentsLength() {
8991
assertEquals(0, SEMANTIC_COMPARATOR.compare(indexOriginal, indexSame));
9092
assertEquals(-1, SEMANTIC_COMPARATOR.compare(indexOriginal, indexDifferent));
9193
}
94+
95+
@Test
96+
public void indexOffsetComparator() {
97+
IndexOffset docAOffset = IndexOffset.create(version(1), key("foo/a"));
98+
IndexOffset docBOffset = IndexOffset.create(version(1), key("foo/b"));
99+
IndexOffset version1Offset = IndexOffset.create(version(1));
100+
IndexOffset docCOffset = IndexOffset.create(version(2), key("foo/c"));
101+
IndexOffset version2Offset = IndexOffset.create(version(2));
102+
103+
assertEquals(-1, docAOffset.compareTo(docBOffset));
104+
assertEquals(-1, docAOffset.compareTo(version1Offset));
105+
assertEquals(-1, version1Offset.compareTo(docCOffset));
106+
assertEquals(-1, version1Offset.compareTo(version2Offset));
107+
assertEquals(-1, docCOffset.compareTo(version2Offset));
108+
}
109+
110+
@Test
111+
public void indexOffsetAdvancesSeconds() {
112+
IndexOffset actualSuccessor = IndexOffset.create(version(1, (int) 1e9 - 1));
113+
IndexOffset expectedSuccessor = IndexOffset.create(version(2, 0), DocumentKey.empty());
114+
assertEquals(expectedSuccessor, actualSuccessor);
115+
}
92116
}

0 commit comments

Comments
 (0)