Skip to content

Commit c30a70f

Browse files
committed
Reuse existing code for finding least recent index offset.
1 parent fa81363 commit c30a70f

File tree

3 files changed

+22
-23
lines changed

3 files changed

+22
-23
lines changed

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

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,9 @@
2121
import com.google.firebase.database.collection.ImmutableSortedMap;
2222
import com.google.firebase.firestore.model.Document;
2323
import com.google.firebase.firestore.model.DocumentKey;
24-
import com.google.firebase.firestore.model.FieldIndex;
2524
import com.google.firebase.firestore.model.FieldIndex.IndexOffset;
2625
import com.google.firebase.firestore.util.AsyncQueue;
2726
import com.google.firebase.firestore.util.Logger;
28-
import java.util.Collection;
2927
import java.util.HashSet;
3028
import java.util.Iterator;
3129
import java.util.Map;
@@ -137,7 +135,8 @@ private int writeEntriesForCollectionGroup(
137135
// TODO(indexing): Support mutation batch Ids when sorting and writing indexes.
138136

139137
// Use the earliest offset of all field indexes to query the local cache.
140-
IndexOffset existingOffset = getExistingOffset(indexManager.getFieldIndexes(collectionGroup));
138+
IndexOffset existingOffset =
139+
indexManager.getLeastRecentIndexOffset(indexManager.getFieldIndexes(collectionGroup));
141140
ImmutableSortedMap<DocumentKey, Document> documents =
142141
localDocumentsView.getDocuments(collectionGroup, existingOffset, entriesRemainingUnderCap);
143142
indexManager.updateIndexEntries(documents);
@@ -148,18 +147,6 @@ private int writeEntriesForCollectionGroup(
148147
return documents.size();
149148
}
150149

151-
/** Returns the lowest offset for the provided index group. */
152-
private IndexOffset getExistingOffset(Collection<FieldIndex> fieldIndexes) {
153-
IndexOffset lowestOffset = null;
154-
for (FieldIndex fieldIndex : fieldIndexes) {
155-
if (lowestOffset == null
156-
|| fieldIndex.getIndexState().getOffset().compareTo(lowestOffset) < 0) {
157-
lowestOffset = fieldIndex.getIndexState().getOffset();
158-
}
159-
}
160-
return lowestOffset == null ? IndexOffset.NONE : lowestOffset;
161-
}
162-
163150
/** Returns the offset for the index based on the newly indexed documents. */
164151
private IndexOffset getNewOffset(
165152
ImmutableSortedMap<DocumentKey, Document> documents, IndexOffset currentOffset) {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,14 @@ public interface IndexManager {
7979

8080
/**
8181
* Iterates over all field indexes that are used to serve the given target, and returns the least
82-
* recent offset of them all.
82+
* recent offset of them all. Returns {@code FieldIndex.IndexOffset.NONE} if the target cannot be
83+
* served from the index.
8384
*/
8485
FieldIndex.IndexOffset getLeastRecentIndexOffset(Target target);
8586

87+
/** Returns the lowest offset for the provided index group. */
88+
FieldIndex.IndexOffset getLeastRecentIndexOffset(Collection<FieldIndex> fieldIndexes);
89+
8690
/**
8791
* Returns an index that can be used to serve the provided target. Returns {@code null} if no
8892
* index is configured.

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -296,22 +296,30 @@ public boolean canServeFromIndex(Target target) {
296296
return true;
297297
}
298298

299-
// TODO(orquery): This looks awfully like `getExistingOffset` in IndexBackfillter. Refactor.
299+
@Override
300+
public FieldIndex.IndexOffset getLeastRecentIndexOffset(Collection<FieldIndex> fieldIndexes) {
301+
FieldIndex.IndexOffset lowestOffset = null;
302+
for (FieldIndex fieldIndex : fieldIndexes) {
303+
if (lowestOffset == null
304+
|| fieldIndex.getIndexState().getOffset().compareTo(lowestOffset) < 0) {
305+
lowestOffset = fieldIndex.getIndexState().getOffset();
306+
}
307+
}
308+
return lowestOffset == null ? FieldIndex.IndexOffset.NONE : lowestOffset;
309+
}
310+
300311
@Override
301312
public FieldIndex.IndexOffset getLeastRecentIndexOffset(Target target) {
302-
FieldIndex.IndexOffset min = null;
313+
List<FieldIndex> fieldIndexes = new ArrayList<>();
303314
for (Target subTarget : getSubTargets(target)) {
304315
FieldIndex index = getFieldIndex(subTarget);
305316
if (index == null) {
306317
// If any of this target's sub-queries does not have a field index, return NONE.
307318
return FieldIndex.IndexOffset.NONE;
308319
}
309-
FieldIndex.IndexOffset candidate = index.getIndexState().getOffset();
310-
if (min == null || candidate.compareTo(min) < 0) {
311-
min = candidate;
312-
}
320+
fieldIndexes.add(index);
313321
}
314-
return min == null ? FieldIndex.IndexOffset.NONE : min;
322+
return getLeastRecentIndexOffset(fieldIndexes);
315323
}
316324

317325
private List<Target> getSubTargets(Target target) {

0 commit comments

Comments
 (0)