Skip to content

Commit 705bf4f

Browse files
committed
add hasCachedResults flag
1 parent dc5f291 commit 705bf4f

File tree

9 files changed

+68
-25
lines changed

9 files changed

+68
-25
lines changed

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ public boolean onViewSnapshot(ViewSnapshot newSnapshot) {
8787
newSnapshot.isFromCache(),
8888
newSnapshot.getMutatedKeys(),
8989
newSnapshot.didSyncStateChange(),
90-
/* excludesMetadataChanges= */ true);
90+
/* excludesMetadataChanges= */ true,
91+
newSnapshot.hasCachedResults());
9192
}
9293

9394
if (!raisedInitialEvent) {
@@ -139,8 +140,11 @@ private boolean shouldRaiseInitialEvent(ViewSnapshot snapshot, OnlineState onlin
139140
return false;
140141
}
141142

142-
// Raise data from cache if we have any documents or we are offline
143-
return !snapshot.getDocuments().isEmpty() || onlineState.equals(OnlineState.OFFLINE);
143+
// Raise data from cache if we have any documents, have cached results before,
144+
// or we are offline.
145+
return (!snapshot.getDocuments().isEmpty()
146+
|| snapshot.hasCachedResults()
147+
|| onlineState.equals(OnlineState.OFFLINE));
144148
}
145149

146150
private boolean shouldRaiseEvent(ViewSnapshot snapshot) {
@@ -171,7 +175,8 @@ private void raiseInitialEvent(ViewSnapshot snapshot) {
171175
snapshot.getDocuments(),
172176
snapshot.getMutatedKeys(),
173177
snapshot.isFromCache(),
174-
snapshot.excludesMetadataChanges());
178+
snapshot.excludesMetadataChanges(),
179+
snapshot.hasCachedResults());
175180
raisedInitialEvent = true;
176181
listener.onEvent(snapshot, null);
177182
}

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import com.google.firebase.firestore.util.Function;
5555
import com.google.firebase.firestore.util.Logger;
5656
import com.google.firebase.firestore.util.Util;
57+
import com.google.protobuf.ByteString;
5758
import io.grpc.Status;
5859
import java.io.IOException;
5960
import java.util.ArrayList;
@@ -204,13 +205,16 @@ public int listen(Query query) {
204205
TargetData targetData = localStore.allocateTarget(query.toTarget());
205206
remoteStore.listen(targetData);
206207

207-
ViewSnapshot viewSnapshot = initializeViewAndComputeSnapshot(query, targetData.getTargetId());
208+
ViewSnapshot viewSnapshot =
209+
initializeViewAndComputeSnapshot(
210+
query, targetData.getTargetId(), targetData.getResumeToken());
208211
syncEngineListener.onViewSnapshots(Collections.singletonList(viewSnapshot));
209212

210213
return targetData.getTargetId();
211214
}
212215

213-
private ViewSnapshot initializeViewAndComputeSnapshot(Query query, int targetId) {
216+
private ViewSnapshot initializeViewAndComputeSnapshot(
217+
Query query, int targetId, ByteString resumeToken) {
214218
QueryResult queryResult = localStore.executeQuery(query, /* usePreviousResults= */ true);
215219

216220
SyncState currentTargetSyncState = SyncState.NONE;
@@ -223,7 +227,7 @@ private ViewSnapshot initializeViewAndComputeSnapshot(Query query, int targetId)
223227
currentTargetSyncState = this.queryViewsByQuery.get(mirrorQuery).getView().getSyncState();
224228
synthesizedCurrentChange =
225229
TargetChange.createSynthesizedTargetChangeForCurrentChange(
226-
currentTargetSyncState == SyncState.SYNCED);
230+
currentTargetSyncState == SyncState.SYNCED, resumeToken);
227231
}
228232

229233
// TODO(wuandy): Investigate if we can extract the logic of view change computation and

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,10 @@ public ViewChange applyChanges(DocumentChanges docChanges, TargetChange targetCh
311311
fromCache,
312312
docChanges.mutatedKeys,
313313
syncStatedChanged,
314-
/* excludesMetadataChanges= */ false);
314+
/* excludesMetadataChanges= */ false,
315+
/* hasCachedResults= */ targetChange == null
316+
? false
317+
: !targetChange.getResumeToken().isEmpty());
315318
}
316319
return new ViewChange(snapshot, limboDocumentChanges);
317320
}

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public enum SyncState {
3939
private final ImmutableSortedSet<DocumentKey> mutatedKeys;
4040
private final boolean didSyncStateChange;
4141
private boolean excludesMetadataChanges;
42+
private boolean hasCachedResults;
4243

4344
public ViewSnapshot(
4445
Query query,
@@ -48,7 +49,8 @@ public ViewSnapshot(
4849
boolean isFromCache,
4950
ImmutableSortedSet<DocumentKey> mutatedKeys,
5051
boolean didSyncStateChange,
51-
boolean excludesMetadataChanges) {
52+
boolean excludesMetadataChanges,
53+
boolean hasCachedResults) {
5254
this.query = query;
5355
this.documents = documents;
5456
this.oldDocuments = oldDocuments;
@@ -57,6 +59,7 @@ public ViewSnapshot(
5759
this.mutatedKeys = mutatedKeys;
5860
this.didSyncStateChange = didSyncStateChange;
5961
this.excludesMetadataChanges = excludesMetadataChanges;
62+
this.hasCachedResults = hasCachedResults;
6063
}
6164

6265
/** Returns a view snapshot as if all documents in the snapshot were added. */
@@ -65,7 +68,8 @@ public static ViewSnapshot fromInitialDocuments(
6568
DocumentSet documents,
6669
ImmutableSortedSet<DocumentKey> mutatedKeys,
6770
boolean fromCache,
68-
boolean excludesMetadataChanges) {
71+
boolean excludesMetadataChanges,
72+
boolean hasCachedResults) {
6973
List<DocumentViewChange> viewChanges = new ArrayList<>();
7074
for (Document doc : documents) {
7175
viewChanges.add(DocumentViewChange.create(DocumentViewChange.Type.ADDED, doc));
@@ -78,7 +82,8 @@ public static ViewSnapshot fromInitialDocuments(
7882
fromCache,
7983
mutatedKeys,
8084
/* didSyncStateChange= */ true,
81-
excludesMetadataChanges);
85+
excludesMetadataChanges,
86+
hasCachedResults);
8287
}
8388

8489
public Query getQuery() {
@@ -117,6 +122,10 @@ public boolean excludesMetadataChanges() {
117122
return excludesMetadataChanges;
118123
}
119124

125+
public boolean hasCachedResults() {
126+
return hasCachedResults;
127+
}
128+
120129
@Override
121130
public final boolean equals(Object o) {
122131
if (this == o) {
@@ -149,6 +158,9 @@ public final boolean equals(Object o) {
149158
if (!oldDocuments.equals(that.oldDocuments)) {
150159
return false;
151160
}
161+
if (hasCachedResults != that.hasCachedResults) {
162+
return false;
163+
}
152164
return changes.equals(that.changes);
153165
}
154166

@@ -183,6 +195,8 @@ public String toString() {
183195
+ didSyncStateChange
184196
+ ", excludesMetadataChanges="
185197
+ excludesMetadataChanges
198+
+ ", hasCachedResults="
199+
+ hasCachedResults
186200
+ ")";
187201
}
188202
}

firebase-firestore/src/main/java/com/google/firebase/firestore/remote/TargetChange.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ public final class TargetChange {
3131
private final ImmutableSortedSet<DocumentKey> modifiedDocuments;
3232
private final ImmutableSortedSet<DocumentKey> removedDocuments;
3333

34-
public static TargetChange createSynthesizedTargetChangeForCurrentChange(boolean isCurrent) {
34+
public static TargetChange createSynthesizedTargetChangeForCurrentChange(
35+
boolean isCurrent, ByteString resumeToken) {
3536
return new TargetChange(
36-
ByteString.EMPTY,
37+
resumeToken,
3738
isCurrent,
3839
DocumentKey.emptyKeySet(),
3940
DocumentKey.emptyKeySet(),

firebase-firestore/src/roboUtil/java/com/google/firebase/firestore/TestUtil.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ public static QuerySnapshot querySnapshot(
116116
isFromCache,
117117
mutatedKeys,
118118
/* didSyncStateChange= */ true,
119-
/* excludesMetadataChanges= */ false);
119+
/* excludesMetadataChanges= */ false,
120+
/* hasCachedResults= */ false);
120121
return new QuerySnapshot(query(path), viewSnapshot, FIRESTORE);
121122
}
122123

firebase-firestore/src/test/java/com/google/firebase/firestore/QuerySnapshotTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@ public void testIncludeMetadataChanges() {
126126
/*isFromCache=*/ false,
127127
/*mutatedKeys=*/ keySet(),
128128
/*didSyncStateChange=*/ true,
129-
/* excludesMetadataChanges= */ false);
129+
/* excludesMetadataChanges= */ false,
130+
/* hasCachedResults= */ false);
130131

131132
QuerySnapshot snapshot =
132133
new QuerySnapshot(new Query(fooQuery, firestore), viewSnapshot, firestore);

firebase-firestore/src/test/java/com/google/firebase/firestore/core/QueryListenerTest.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ public void testRaisesCollectionEvents() {
108108
snap2.isFromCache(),
109109
snap2.getMutatedKeys(),
110110
/* didSyncStateChange= */ true,
111-
/* excludesMetadataChanges= */ false);
111+
/* excludesMetadataChanges= */ false,
112+
/* hasCachedResults= */ false);
112113
assertEquals(asList(snap2Prime), otherAccum);
113114
}
114115

@@ -262,7 +263,8 @@ public void testRaisesQueryMetadataEventsOnlyWhenHasPendingWritesOnTheQueryChang
262263
snap4.isFromCache(),
263264
snap4.getMutatedKeys(),
264265
snap4.didSyncStateChange(),
265-
/* excludeMetadataChanges= */ true); // This test excludes document metadata changes
266+
/* excludeMetadataChanges= */ true,
267+
/* hasCachedResults= */ false); // This test excludes document metadata changes
266268

267269
assertEquals(
268270
asList(
@@ -302,7 +304,9 @@ public void testMetadataOnlyDocumentChangesAreFilteredOut() {
302304
snap2.isFromCache(),
303305
snap2.getMutatedKeys(),
304306
snap2.didSyncStateChange(),
305-
/* excludesMetadataChanges= */ true);
307+
/* excludesMetadataChanges= */ true,
308+
/* hasCachedResults= */ false);
309+
306310
assertEquals(
307311
asList(applyExpectedMetadata(snap1, MetadataChanges.EXCLUDE), expectedSnapshot2),
308312
filteredAccum);
@@ -344,7 +348,8 @@ public void testWillWaitForSyncIfOnline() {
344348
/* isFromCache= */ false,
345349
snap3.getMutatedKeys(),
346350
/* didSyncStateChange= */ true,
347-
/* excludesMetadataChanges= */ true);
351+
/* excludesMetadataChanges= */ true,
352+
/* hasCachedResults= */ false);
348353
assertEquals(asList(expectedSnapshot), events);
349354
}
350355

@@ -382,7 +387,9 @@ public void testWillRaiseInitialEventWhenGoingOffline() {
382387
/* isFromCache= */ true,
383388
snap1.getMutatedKeys(),
384389
/* didSyncStateChange= */ true,
385-
/* excludesMetadataChanges= */ true);
390+
/* excludesMetadataChanges= */ true,
391+
/* hasCachedResults= */ false);
392+
386393
ViewSnapshot expectedSnapshot2 =
387394
new ViewSnapshot(
388395
snap2.getQuery(),
@@ -392,7 +399,8 @@ public void testWillRaiseInitialEventWhenGoingOffline() {
392399
/* isFromCache= */ true,
393400
snap2.getMutatedKeys(),
394401
/* didSyncStateChange= */ false,
395-
/* excludesMetadataChanges= */ true);
402+
/* excludesMetadataChanges= */ true,
403+
/* hasCachedResults= */ false);
396404
assertEquals(asList(expectedSnapshot1, expectedSnapshot2), events);
397405
}
398406

@@ -419,7 +427,8 @@ public void testWillRaiseInitialEventWhenGoingOfflineAndThereAreNoDocs() {
419427
/* isFromCache= */ true,
420428
snap1.getMutatedKeys(),
421429
/* didSyncStateChange= */ true,
422-
/* excludesMetadataChanges= */ true);
430+
/* excludesMetadataChanges= */ true,
431+
/* hasCachedResults= */ false);
423432
assertEquals(asList(expectedSnapshot), events);
424433
}
425434

@@ -445,7 +454,8 @@ public void testWillRaiseInitialEventWhenStartingOfflineAndThereAreNoDocs() {
445454
/* isFromCache= */ true,
446455
snap1.getMutatedKeys(),
447456
/* didSyncStateChange= */ true,
448-
/* excludesMetadataChanges= */ true);
457+
/* excludesMetadataChanges= */ true,
458+
/* hasCachedResults= */ false);
449459
assertEquals(asList(expectedSnapshot), events);
450460
}
451461

@@ -458,6 +468,7 @@ private ViewSnapshot applyExpectedMetadata(ViewSnapshot snap, MetadataChanges me
458468
snap.isFromCache(),
459469
snap.getMutatedKeys(),
460470
snap.didSyncStateChange(),
461-
MetadataChanges.EXCLUDE.equals(metadata));
471+
MetadataChanges.EXCLUDE.equals(metadata),
472+
snap.hasCachedResults());
462473
}
463474
}

firebase-firestore/src/test/java/com/google/firebase/firestore/core/ViewSnapshotTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public void testConstructor() {
4949
boolean hasPendingWrites = true;
5050
boolean syncStateChanges = true;
5151
boolean excludesMetadataChanges = true;
52+
boolean hasCachedResults = false;
5253

5354
ViewSnapshot snapshot =
5455
new ViewSnapshot(
@@ -59,7 +60,8 @@ public void testConstructor() {
5960
fromCache,
6061
mutatedKeys,
6162
syncStateChanges,
62-
excludesMetadataChanges);
63+
excludesMetadataChanges,
64+
hasCachedResults);
6365

6466
assertEquals(query, snapshot.getQuery());
6567
assertEquals(docs, snapshot.getDocuments());
@@ -70,5 +72,6 @@ public void testConstructor() {
7072
assertEquals(hasPendingWrites, snapshot.hasPendingWrites());
7173
assertEquals(syncStateChanges, snapshot.didSyncStateChange());
7274
assertEquals(excludesMetadataChanges, snapshot.excludesMetadataChanges());
75+
assertEquals(hasCachedResults, snapshot.hasCachedResults());
7376
}
7477
}

0 commit comments

Comments
 (0)