Skip to content

Commit 71e366c

Browse files
Merge
2 parents 373d69f + ff9146f commit 71e366c

File tree

6 files changed

+46
-57
lines changed

6 files changed

+46
-57
lines changed

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,8 @@ public void start() {
107107
// Fetch all index states if persisted for the user. These states contain per user information
108108
// on how up to date the index is.
109109
db.query(
110-
"SELECT index_id, sequence_number, read_time_seconds, read_time_nanos, "
111-
+ "document_key, largest_batch_id "
112-
+ "FROM index_state WHERE uid = ?")
110+
"SELECT index_id, sequence_number, read_time_seconds, read_time_nanos, document_key, "
111+
+ "largest_batch_id FROM index_state WHERE uid = ?")
113112
.binding(uid)
114113
.forEach(
115114
row -> {
@@ -120,9 +119,10 @@ public void start() {
120119
DocumentKey documentKey =
121120
DocumentKey.fromPath(EncodedPath.decodeResourcePath(row.getString(4)));
122121
int largestBatchId = row.getInt(5);
123-
FieldIndex.IndexOffset offset =
124-
FieldIndex.IndexOffset.create(readTime, documentKey, largestBatchId);
125-
indexStates.put(indexId, FieldIndex.IndexState.create(sequenceNumber, offset));
122+
indexStates.put(
123+
indexId,
124+
FieldIndex.IndexState.create(
125+
sequenceNumber, readTime, documentKey, largestBatchId));
126126
});
127127

128128
// Fetch all indices and combine with user's index state if available.
@@ -664,13 +664,15 @@ public void updateCollectionGroup(String collectionGroup, IndexOffset offset) {
664664
FieldIndex.IndexState.create(memoizedMaxSequenceNumber, offset));
665665
db.execute(
666666
"REPLACE INTO index_state (index_id, uid, sequence_number, "
667-
+ "read_time_seconds, read_time_nanos, document_key) VALUES(?, ?, ?, ?, ?, ?)",
667+
+ "read_time_seconds, read_time_nanos, document_key, largest_batch_id) "
668+
+ "VALUES(?, ?, ?, ?, ?, ?, ?)",
668669
fieldIndex.getIndexId(),
669670
uid,
670671
memoizedMaxSequenceNumber,
671672
offset.getReadTime().getTimestamp().getSeconds(),
672673
offset.getReadTime().getTimestamp().getNanoseconds(),
673-
EncodedPath.encode(offset.getDocumentKey().getPath()));
674+
EncodedPath.encode(offset.getDocumentKey().getPath()),
675+
offset.getLargestBatchId());
674676
memoizeIndex(updatedIndex);
675677
}
676678
}

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

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ public abstract class FieldIndex {
3939
/** An ID for an index that has not yet been added to persistence. */
4040
public static final int UNKNOWN_ID = -1;
4141

42+
/** The initial mutation batch id for each index. Gets updated during index backfill. */
43+
public static final int INITIAL_LARGEST_BATCH_ID = -1;
44+
4245
/** The initial sequence number for each index. Gets updated during index backfill. */
4346
public static final int INITIAL_SEQUENCE_NUMBER = 0;
4447

45-
/** The initial mutation batch id for each index. Gets updated during index backfill. */
46-
public static final int INITIAL_LARGEST_BATCH_ID = 0;
47-
4848
/** The state of an index that has not yet been backfilled. */
4949
public static IndexState INITIAL_STATE =
50-
IndexState.create(INITIAL_SEQUENCE_NUMBER, SnapshotVersion.NONE, DocumentKey.empty());
50+
IndexState.create(INITIAL_SEQUENCE_NUMBER, IndexOffset.NONE);
5151

5252
/** Compares indexes by collection group and segments. Ignores update time and index ID. */
5353
public static final Comparator<FieldIndex> SEMANTIC_COMPARATOR =
@@ -103,8 +103,11 @@ public static IndexState create(long sequenceNumber, IndexOffset offset) {
103103
}
104104

105105
public static IndexState create(
106-
long sequenceNumber, SnapshotVersion readTime, DocumentKey documentKey) {
107-
return create(sequenceNumber, IndexOffset.create(readTime, documentKey));
106+
long sequenceNumber,
107+
SnapshotVersion readTime,
108+
DocumentKey documentKey,
109+
int largestBatchId) {
110+
return create(sequenceNumber, IndexOffset.create(readTime, documentKey, largestBatchId));
108111
}
109112

110113
/**
@@ -122,20 +125,17 @@ public abstract static class IndexOffset implements Comparable<IndexOffset> {
122125
public static final IndexOffset NONE =
123126
create(SnapshotVersion.NONE, DocumentKey.empty(), INITIAL_LARGEST_BATCH_ID);
124127

125-
public static IndexOffset create(
126-
SnapshotVersion readTime, DocumentKey key, int largestBatchId) {
127-
return new AutoValue_FieldIndex_IndexOffset(readTime, key, largestBatchId);
128-
}
129-
130128
public static final Comparator<MutableDocument> DOCUMENT_COMPARATOR =
131-
(l, r) -> IndexOffset.fromDocument(l, 0).compareTo(IndexOffset.fromDocument(r, 0));
129+
(l, r) -> IndexOffset.fromDocument(l).compareTo(IndexOffset.fromDocument(r));
132130

133131
/**
134132
* Creates an offset that matches all documents with a read time higher than {@code readTime} or
135-
* with a key higher than {@code documentKey} for equal read times.
133+
* with a key higher than {@code documentKey} for equal read times. The largest batch ID is used
134+
* as a final tie breaker.
136135
*/
137-
public static IndexOffset create(SnapshotVersion readTime, DocumentKey documentKey) {
138-
return new AutoValue_FieldIndex_IndexOffset(readTime, documentKey, INITIAL_LARGEST_BATCH_ID);
136+
public static IndexOffset create(
137+
SnapshotVersion readTime, DocumentKey key, int largestBatchId) {
138+
return new AutoValue_FieldIndex_IndexOffset(readTime, key, largestBatchId);
139139
}
140140

141141
/**
@@ -154,14 +154,12 @@ public static IndexOffset create(SnapshotVersion readTime) {
154154
successorNanos == 1e9
155155
? new Timestamp(successorSeconds + 1, 0)
156156
: new Timestamp(successorSeconds, successorNanos));
157-
return new AutoValue_FieldIndex_IndexOffset(
158-
successor, DocumentKey.empty(), INITIAL_LARGEST_BATCH_ID);
157+
return create(successor, DocumentKey.empty(), INITIAL_LARGEST_BATCH_ID);
159158
}
160159

161160
/** Creates a new offset based on the provided document. */
162-
public static IndexOffset fromDocument(Document document, int batchId) {
163-
return new AutoValue_FieldIndex_IndexOffset(
164-
document.getReadTime(), document.getKey(), batchId);
161+
public static IndexOffset fromDocument(Document document) {
162+
return create(document.getReadTime(), document.getKey(), INITIAL_LARGEST_BATCH_ID);
165163
}
166164

167165
/**

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ private void addFieldIndex(String collectionGroup, String fieldName, SnapshotVer
491491
fieldIndex(
492492
collectionGroup,
493493
FieldIndex.UNKNOWN_ID,
494-
FieldIndex.IndexState.create(0, version, DocumentKey.empty()),
494+
FieldIndex.IndexState.create(0, version, DocumentKey.empty(), -1),
495495
fieldName,
496496
FieldIndex.Segment.Kind.ASCENDING);
497497
indexManager.addFieldIndex(fieldIndex);
@@ -502,7 +502,7 @@ private void addFieldIndex(String collectionGroup, String fieldName, long sequen
502502
fieldIndex(
503503
collectionGroup,
504504
FieldIndex.UNKNOWN_ID,
505-
FieldIndex.IndexState.create(sequenceNumber, SnapshotVersion.NONE, DocumentKey.empty()),
505+
FieldIndex.IndexState.create(sequenceNumber, IndexOffset.NONE),
506506
fieldName,
507507
FieldIndex.Segment.Kind.ASCENDING);
508508
indexManager.addFieldIndex(fieldIndex);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ public void testGetAllFromSinceReadTimeAndDocumentKey() {
232232

233233
ResourcePath collection = path("b");
234234
Map<DocumentKey, MutableDocument> results =
235-
remoteDocumentCache.getAll(collection, IndexOffset.create(version(11), key("b/b")));
235+
remoteDocumentCache.getAll(collection, IndexOffset.create(version(11), key("b/b"), -1));
236236
assertThat(results.values()).containsExactly(doc("b/c", 3, DOC_DATA), doc("b/d", 4, DOC_DATA));
237237
}
238238

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

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -582,19 +582,18 @@ public void testAdvancedQueries() {
582582
}
583583

584584
@Test
585-
public void testUpdateTime() {
586-
indexManager.addFieldIndex(
587-
fieldIndex(
588-
"coll1",
589-
1,
590-
IndexState.create(-1, version(20), DocumentKey.empty()),
591-
"value",
592-
Kind.ASCENDING));
585+
public void testPersistsIndexOffset() {
586+
indexManager.addFieldIndex(fieldIndex("coll1", "value", Kind.ASCENDING));
587+
IndexOffset offset = IndexOffset.create(version(20), key("coll/doc"), 42);
588+
indexManager.updateCollectionGroup("coll1", offset);
589+
590+
indexManager = persistence.getIndexManager(User.UNAUTHENTICATED);
591+
indexManager.start();
593592

594593
Collection<FieldIndex> indexes = indexManager.getFieldIndexes("coll1");
595594
assertEquals(indexes.size(), 1);
596595
FieldIndex index = indexes.iterator().next();
597-
assertEquals(index.getIndexState().getOffset().getReadTime(), version(20));
596+
assertEquals(offset, index.getIndexState().getOffset());
598597
}
599598

600599
@Test
@@ -638,19 +637,9 @@ public void testGetFieldIndexes() {
638637
@Test
639638
public void testDeleteFieldIndexRemovesEntryFromCollectionGroup() {
640639
indexManager.addFieldIndex(
641-
fieldIndex(
642-
"coll1",
643-
1,
644-
IndexState.create(1, version(30), DocumentKey.empty()),
645-
"value",
646-
Kind.ASCENDING));
640+
fieldIndex("coll1", 1, IndexState.create(1, IndexOffset.NONE), "value", Kind.ASCENDING));
647641
indexManager.addFieldIndex(
648-
fieldIndex(
649-
"coll2",
650-
2,
651-
IndexState.create(2, version(0), DocumentKey.empty()),
652-
"value",
653-
Kind.CONTAINS));
642+
fieldIndex("coll2", 2, IndexState.create(2, IndexOffset.NONE), "value", Kind.CONTAINS));
654643
String collectionGroup = indexManager.getNextCollectionGroupToUpdate();
655644
assertEquals("coll1", collectionGroup);
656645

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public void comparatorIgnoresIndexState() {
5454
FieldIndex indexOriginal = fieldIndex("collA", 1, FieldIndex.INITIAL_STATE);
5555
FieldIndex indexSame = fieldIndex("collA", 1, FieldIndex.INITIAL_STATE);
5656
FieldIndex indexDifferent =
57-
fieldIndex("collA", 1, IndexState.create(1, version(2), DocumentKey.empty()));
57+
fieldIndex("collA", 1, IndexState.create(1, version(2), DocumentKey.empty(), -1));
5858
assertEquals(0, SEMANTIC_COMPARATOR.compare(indexOriginal, indexSame));
5959
assertEquals(0, SEMANTIC_COMPARATOR.compare(indexOriginal, indexDifferent));
6060
}
@@ -94,10 +94,10 @@ public void comparatorIncludesSegmentsLength() {
9494

9595
@Test
9696
public void indexOffsetComparator() {
97-
IndexOffset docAOffset = IndexOffset.create(version(1), key("foo/a"));
98-
IndexOffset docBOffset = IndexOffset.create(version(1), key("foo/b"));
97+
IndexOffset docAOffset = IndexOffset.create(version(1), key("foo/a"), -1);
98+
IndexOffset docBOffset = IndexOffset.create(version(1), key("foo/b"), -1);
9999
IndexOffset version1Offset = IndexOffset.create(version(1));
100-
IndexOffset docCOffset = IndexOffset.create(version(2), key("foo/c"));
100+
IndexOffset docCOffset = IndexOffset.create(version(2), key("foo/c"), -1);
101101
IndexOffset version2Offset = IndexOffset.create(version(2));
102102

103103
assertEquals(-1, docAOffset.compareTo(docBOffset));
@@ -110,7 +110,7 @@ public void indexOffsetComparator() {
110110
@Test
111111
public void indexOffsetAdvancesSeconds() {
112112
IndexOffset actualSuccessor = IndexOffset.create(version(1, (int) 1e9 - 1));
113-
IndexOffset expectedSuccessor = IndexOffset.create(version(2, 0), DocumentKey.empty());
113+
IndexOffset expectedSuccessor = IndexOffset.create(version(2, 0), DocumentKey.empty(), -1);
114114
assertEquals(expectedSuccessor, actualSuccessor);
115115
}
116116
}

0 commit comments

Comments
 (0)