diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/core/SyncEngine.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/core/SyncEngine.java index b8655d91656..1cda1f721c5 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/core/SyncEngine.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/core/SyncEngine.java @@ -428,7 +428,7 @@ public void handleRejectedListen(int targetId, Status error) { new RemoteEvent( SnapshotVersion.NONE, /* targetChanges= */ Collections.emptyMap(), - /* targetMismatches= */ Collections.emptySet(), + /* targetMismatches= */ Collections.emptyMap(), documentUpdates, limboDocuments); handleRemoteEvent(event); diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/local/LocalStore.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/local/LocalStore.java index 2d9f24c14e6..81b7dd13455 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/local/LocalStore.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/local/LocalStore.java @@ -425,7 +425,7 @@ public ImmutableSortedMap applyRemoteEvent(RemoteEvent re targetCache.addMatchingKeys(change.getAddedDocuments(), targetId); TargetData newTargetData = oldTargetData.withSequenceNumber(sequenceNumber); - if (remoteEvent.getTargetMismatches().contains(targetId)) { + if (remoteEvent.getTargetMismatches().containsKey(targetId)) { newTargetData = newTargetData .withResumeToken(ByteString.EMPTY, SnapshotVersion.NONE) diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/local/QueryPurpose.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/local/QueryPurpose.java index e56f0cf4e66..7595592ba8e 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/local/QueryPurpose.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/local/QueryPurpose.java @@ -22,6 +22,11 @@ public enum QueryPurpose { /** The query was used to refill a query after an existence filter mismatch. */ EXISTENCE_FILTER_MISMATCH, + /** + * The query target was used if the query is the result of a false positive in the bloom filter. + */ + EXISTENCE_FILTER_MISMATCH_BLOOM, + /** The query was used to resolve a limbo document. */ LIMBO_RESOLUTION, } diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/RemoteEvent.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/RemoteEvent.java index e890574ba8a..443ee13ecea 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/RemoteEvent.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/RemoteEvent.java @@ -14,6 +14,7 @@ package com.google.firebase.firestore.remote; +import com.google.firebase.firestore.local.QueryPurpose; import com.google.firebase.firestore.model.DocumentKey; import com.google.firebase.firestore.model.MutableDocument; import com.google.firebase.firestore.model.SnapshotVersion; @@ -27,14 +28,14 @@ public final class RemoteEvent { private final SnapshotVersion snapshotVersion; private final Map targetChanges; - private final Set targetMismatches; + private final Map targetMismatches; private final Map documentUpdates; private final Set resolvedLimboDocuments; public RemoteEvent( SnapshotVersion snapshotVersion, Map targetChanges, - Set targetMismatches, + Map targetMismatches, Map documentUpdates, Set resolvedLimboDocuments) { this.snapshotVersion = snapshotVersion; @@ -55,10 +56,10 @@ public Map getTargetChanges() { } /** - * Returns a set of targets that is known to be inconsistent. Listens for these targets should be - * re-established without resume tokens. + * Returns a map of targets that is known to be inconsistent, and the purpose for re-listening. + * Listens for these targets should be re-established without resume tokens. */ - public Set getTargetMismatches() { + public Map getTargetMismatches() { return targetMismatches; } diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/RemoteSerializer.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/RemoteSerializer.java index 655842a73af..9a352000f6b 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/RemoteSerializer.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/RemoteSerializer.java @@ -471,6 +471,8 @@ private String encodeLabel(QueryPurpose purpose) { return null; case EXISTENCE_FILTER_MISMATCH: return "existence-filter-mismatch"; + case EXISTENCE_FILTER_MISMATCH_BLOOM: + return "existence-filter-mismatch-bloom"; case LIMBO_RESOLUTION: return "limbo-document"; default: diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/RemoteStore.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/RemoteStore.java index 1f5ad514b46..15f132d6d1b 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/RemoteStore.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/RemoteStore.java @@ -547,7 +547,8 @@ private void raiseWatchSnapshot(SnapshotVersion snapshotVersion) { // Re-establish listens for the targets that have been invalidated by existence filter // mismatches. - for (int targetId : remoteEvent.getTargetMismatches()) { + for (Map.Entry entry : remoteEvent.getTargetMismatches().entrySet()) { + int targetId = entry.getKey(); TargetData targetData = this.listenTargets.get(targetId); // A watched target might have been removed already. if (targetData != null) { @@ -569,7 +570,7 @@ private void raiseWatchSnapshot(SnapshotVersion snapshotVersion) { targetData.getTarget(), targetId, targetData.getSequenceNumber(), - QueryPurpose.EXISTENCE_FILTER_MISMATCH); + /*purpose=*/ entry.getValue()); this.sendWatchRequest(requestTargetData); } } diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/WatchChangeAggregator.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/WatchChangeAggregator.java index b6f9441b3d0..dc29f2633f1 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/WatchChangeAggregator.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/remote/WatchChangeAggregator.java @@ -75,14 +75,21 @@ public interface TargetMetadataProvider { private Map> pendingDocumentTargetMapping = new HashMap<>(); /** - * A list of targets with existence filter mismatches. These targets are known to be inconsistent + * A map of targets with existence filter mismatches. These targets are known to be inconsistent * and their listens needs to be re-established by RemoteStore. */ - private Set pendingTargetResets = new HashSet<>(); + private Map pendingTargetResets = new HashMap<>(); /** The log tag to use for this class. */ private static final String LOG_TAG = "WatchChangeAggregator"; + /** The bloom filter application status while handling existence filter mismatch. */ + private enum BloomFilterApplicationStatus { + SUCCESS, + SKIPPED, + FALSE_POSITIVE + } + public WatchChangeAggregator(TargetMetadataProvider targetMetadataProvider) { this.targetMetadataProvider = targetMetadataProvider; } @@ -208,27 +215,34 @@ public void handleExistenceFilter(ExistenceFilterWatchChange watchChange) { if (currentSize != expectedCount) { // Apply bloom filter to identify and mark removed documents. - boolean bloomFilterApplied = this.applyBloomFilter(watchChange, currentSize); + BloomFilterApplicationStatus status = this.applyBloomFilter(watchChange, currentSize); - if (!bloomFilterApplied) { + if (status != BloomFilterApplicationStatus.SUCCESS) { // If bloom filter application fails, we reset the mapping and // trigger re-run of the query. resetTarget(targetId); - pendingTargetResets.add(targetId); + + QueryPurpose purpose = + status == BloomFilterApplicationStatus.FALSE_POSITIVE + ? QueryPurpose.EXISTENCE_FILTER_MISMATCH_BLOOM + : QueryPurpose.EXISTENCE_FILTER_MISMATCH; + + pendingTargetResets.put(targetId, purpose); } } } } } - /** Returns whether a bloom filter removed the deleted documents successfully. */ - private boolean applyBloomFilter(ExistenceFilterWatchChange watchChange, int currentCount) { + /** Apply bloom filter to remove the deleted documents, and return the application status. */ + private BloomFilterApplicationStatus applyBloomFilter( + ExistenceFilterWatchChange watchChange, int currentCount) { int expectedCount = watchChange.getExistenceFilter().getCount(); com.google.firestore.v1.BloomFilter unchangedNames = watchChange.getExistenceFilter().getUnchangedNames(); if (unchangedNames == null || !unchangedNames.hasBits()) { - return false; + return BloomFilterApplicationStatus.SKIPPED; } byte[] bitmap = unchangedNames.getBits().getBitmap().toByteArray(); @@ -244,12 +258,20 @@ private boolean applyBloomFilter(ExistenceFilterWatchChange watchChange, int cur "Applying bloom filter failed: (" + e.getMessage() + "); ignoring the bloom filter and falling back to full re-query."); - return false; + return BloomFilterApplicationStatus.SKIPPED; + } + + if (bloomFilter.getBitCount() == 0) { + return BloomFilterApplicationStatus.SKIPPED; } int removedDocumentCount = this.filterRemovedDocuments(bloomFilter, watchChange.getTargetId()); - return expectedCount == (currentCount - removedDocumentCount); + if (expectedCount != (currentCount - removedDocumentCount)) { + return BloomFilterApplicationStatus.FALSE_POSITIVE; + } + + return BloomFilterApplicationStatus.SUCCESS; } /** @@ -341,14 +363,14 @@ public RemoteEvent createRemoteEvent(SnapshotVersion snapshotVersion) { new RemoteEvent( snapshotVersion, Collections.unmodifiableMap(targetChanges), - Collections.unmodifiableSet(pendingTargetResets), + Collections.unmodifiableMap(pendingTargetResets), Collections.unmodifiableMap(pendingDocumentUpdates), Collections.unmodifiableSet(resolvedLimboDocuments)); // Re-initialize the current state to ensure that we do not modify the generated RemoteEvent. pendingDocumentUpdates = new HashMap<>(); pendingDocumentTargetMapping = new HashMap<>(); - pendingTargetResets = new HashSet<>(); + pendingTargetResets = new HashMap<>(); return remoteEvent; } diff --git a/firebase-firestore/src/test/resources/json/bundle_spec_test.json b/firebase-firestore/src/test/resources/json/bundle_spec_test.json index 94bc9cc0da1..617f5946d5f 100644 --- a/firebase-firestore/src/test/resources/json/bundle_spec_test.json +++ b/firebase-firestore/src/test/resources/json/bundle_spec_test.json @@ -1166,7 +1166,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ diff --git a/firebase-firestore/src/test/resources/json/existence_filter_spec_test.json b/firebase-firestore/src/test/resources/json/existence_filter_spec_test.json index 16442ba1702..131d47cd4a1 100644 --- a/firebase-firestore/src/test/resources/json/existence_filter_spec_test.json +++ b/firebase-firestore/src/test/resources/json/existence_filter_spec_test.json @@ -91,7 +91,7 @@ { "added": [ { - "key": "collection/ÀÒ∑", + "key": "collection/ÀÒ∑", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -102,7 +102,7 @@ "version": 1000 }, { - "key": "collection/À∑Ò", + "key": "collection/À∑Ò", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -178,7 +178,8 @@ "path": "collection/À∑Ò" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "2": { "queries": [ @@ -289,7 +290,7 @@ { "added": [ { - "key": "collection/a", + "key": "collection/a", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -300,7 +301,7 @@ "version": 1000 }, { - "key": "collection/b", + "key": "collection/b", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -371,7 +372,8 @@ "path": "collection" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 1 } } } @@ -470,7 +472,7 @@ { "added": [ { - "key": "collection/a", + "key": "collection/a", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -481,7 +483,7 @@ "version": 1000 }, { - "key": "collection/b", + "key": "collection/b", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -552,7 +554,7 @@ { "added": [ { - "key": "collection/c", + "key": "collection/c", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -590,7 +592,8 @@ "path": "collection/b" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "2": { "queries": [ @@ -701,7 +704,7 @@ { "added": [ { - "key": "collection/a", + "key": "collection/a", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -712,7 +715,7 @@ "version": 1000 }, { - "key": "collection/b", + "key": "collection/b", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -788,7 +791,8 @@ "path": "collection/b" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "2": { "queries": [ @@ -828,7 +832,7 @@ }, "removed": [ { - "key": "collection/b", + "key": "collection/b", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2032,7 +2036,7 @@ { "added": [ { - "key": "collection/doc0", + "key": "collection/doc0", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2043,7 +2047,7 @@ "version": 1000 }, { - "key": "collection/doc1", + "key": "collection/doc1", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2054,7 +2058,7 @@ "version": 1000 }, { - "key": "collection/doc2", + "key": "collection/doc2", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2065,7 +2069,7 @@ "version": 1000 }, { - "key": "collection/doc3", + "key": "collection/doc3", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2076,7 +2080,7 @@ "version": 1000 }, { - "key": "collection/doc4", + "key": "collection/doc4", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2087,7 +2091,7 @@ "version": 1000 }, { - "key": "collection/doc5", + "key": "collection/doc5", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2098,7 +2102,7 @@ "version": 1000 }, { - "key": "collection/doc6", + "key": "collection/doc6", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2109,7 +2113,7 @@ "version": 1000 }, { - "key": "collection/doc7", + "key": "collection/doc7", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2120,7 +2124,7 @@ "version": 1000 }, { - "key": "collection/doc8", + "key": "collection/doc8", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2131,7 +2135,7 @@ "version": 1000 }, { - "key": "collection/doc9", + "key": "collection/doc9", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2142,7 +2146,7 @@ "version": 1000 }, { - "key": "collection/doc10", + "key": "collection/doc10", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2153,7 +2157,7 @@ "version": 1000 }, { - "key": "collection/doc11", + "key": "collection/doc11", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2164,7 +2168,7 @@ "version": 1000 }, { - "key": "collection/doc12", + "key": "collection/doc12", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2175,7 +2179,7 @@ "version": 1000 }, { - "key": "collection/doc13", + "key": "collection/doc13", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2186,7 +2190,7 @@ "version": 1000 }, { - "key": "collection/doc14", + "key": "collection/doc14", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2197,7 +2201,7 @@ "version": 1000 }, { - "key": "collection/doc15", + "key": "collection/doc15", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2208,7 +2212,7 @@ "version": 1000 }, { - "key": "collection/doc16", + "key": "collection/doc16", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2219,7 +2223,7 @@ "version": 1000 }, { - "key": "collection/doc17", + "key": "collection/doc17", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2230,7 +2234,7 @@ "version": 1000 }, { - "key": "collection/doc18", + "key": "collection/doc18", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2241,7 +2245,7 @@ "version": 1000 }, { - "key": "collection/doc19", + "key": "collection/doc19", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2252,7 +2256,7 @@ "version": 1000 }, { - "key": "collection/doc20", + "key": "collection/doc20", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2263,7 +2267,7 @@ "version": 1000 }, { - "key": "collection/doc21", + "key": "collection/doc21", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2274,7 +2278,7 @@ "version": 1000 }, { - "key": "collection/doc22", + "key": "collection/doc22", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2285,7 +2289,7 @@ "version": 1000 }, { - "key": "collection/doc23", + "key": "collection/doc23", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2296,7 +2300,7 @@ "version": 1000 }, { - "key": "collection/doc24", + "key": "collection/doc24", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2307,7 +2311,7 @@ "version": 1000 }, { - "key": "collection/doc25", + "key": "collection/doc25", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2318,7 +2322,7 @@ "version": 1000 }, { - "key": "collection/doc26", + "key": "collection/doc26", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2329,7 +2333,7 @@ "version": 1000 }, { - "key": "collection/doc27", + "key": "collection/doc27", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2340,7 +2344,7 @@ "version": 1000 }, { - "key": "collection/doc28", + "key": "collection/doc28", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2351,7 +2355,7 @@ "version": 1000 }, { - "key": "collection/doc29", + "key": "collection/doc29", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2362,7 +2366,7 @@ "version": 1000 }, { - "key": "collection/doc30", + "key": "collection/doc30", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2373,7 +2377,7 @@ "version": 1000 }, { - "key": "collection/doc31", + "key": "collection/doc31", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2384,7 +2388,7 @@ "version": 1000 }, { - "key": "collection/doc32", + "key": "collection/doc32", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2395,7 +2399,7 @@ "version": 1000 }, { - "key": "collection/doc33", + "key": "collection/doc33", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2406,7 +2410,7 @@ "version": 1000 }, { - "key": "collection/doc34", + "key": "collection/doc34", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2417,7 +2421,7 @@ "version": 1000 }, { - "key": "collection/doc35", + "key": "collection/doc35", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2428,7 +2432,7 @@ "version": 1000 }, { - "key": "collection/doc36", + "key": "collection/doc36", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2439,7 +2443,7 @@ "version": 1000 }, { - "key": "collection/doc37", + "key": "collection/doc37", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2450,7 +2454,7 @@ "version": 1000 }, { - "key": "collection/doc38", + "key": "collection/doc38", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2461,7 +2465,7 @@ "version": 1000 }, { - "key": "collection/doc39", + "key": "collection/doc39", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2472,7 +2476,7 @@ "version": 1000 }, { - "key": "collection/doc40", + "key": "collection/doc40", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2483,7 +2487,7 @@ "version": 1000 }, { - "key": "collection/doc41", + "key": "collection/doc41", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2494,7 +2498,7 @@ "version": 1000 }, { - "key": "collection/doc42", + "key": "collection/doc42", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2505,7 +2509,7 @@ "version": 1000 }, { - "key": "collection/doc43", + "key": "collection/doc43", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2516,7 +2520,7 @@ "version": 1000 }, { - "key": "collection/doc44", + "key": "collection/doc44", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2527,7 +2531,7 @@ "version": 1000 }, { - "key": "collection/doc45", + "key": "collection/doc45", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2538,7 +2542,7 @@ "version": 1000 }, { - "key": "collection/doc46", + "key": "collection/doc46", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2549,7 +2553,7 @@ "version": 1000 }, { - "key": "collection/doc47", + "key": "collection/doc47", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2560,7 +2564,7 @@ "version": 1000 }, { - "key": "collection/doc48", + "key": "collection/doc48", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2571,7 +2575,7 @@ "version": 1000 }, { - "key": "collection/doc49", + "key": "collection/doc49", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2582,7 +2586,7 @@ "version": 1000 }, { - "key": "collection/doc50", + "key": "collection/doc50", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2593,7 +2597,7 @@ "version": 1000 }, { - "key": "collection/doc51", + "key": "collection/doc51", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2604,7 +2608,7 @@ "version": 1000 }, { - "key": "collection/doc52", + "key": "collection/doc52", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2615,7 +2619,7 @@ "version": 1000 }, { - "key": "collection/doc53", + "key": "collection/doc53", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2626,7 +2630,7 @@ "version": 1000 }, { - "key": "collection/doc54", + "key": "collection/doc54", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2637,7 +2641,7 @@ "version": 1000 }, { - "key": "collection/doc55", + "key": "collection/doc55", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2648,7 +2652,7 @@ "version": 1000 }, { - "key": "collection/doc56", + "key": "collection/doc56", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2659,7 +2663,7 @@ "version": 1000 }, { - "key": "collection/doc57", + "key": "collection/doc57", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2670,7 +2674,7 @@ "version": 1000 }, { - "key": "collection/doc58", + "key": "collection/doc58", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2681,7 +2685,7 @@ "version": 1000 }, { - "key": "collection/doc59", + "key": "collection/doc59", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2692,7 +2696,7 @@ "version": 1000 }, { - "key": "collection/doc60", + "key": "collection/doc60", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2703,7 +2707,7 @@ "version": 1000 }, { - "key": "collection/doc61", + "key": "collection/doc61", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2714,7 +2718,7 @@ "version": 1000 }, { - "key": "collection/doc62", + "key": "collection/doc62", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2725,7 +2729,7 @@ "version": 1000 }, { - "key": "collection/doc63", + "key": "collection/doc63", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2736,7 +2740,7 @@ "version": 1000 }, { - "key": "collection/doc64", + "key": "collection/doc64", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2747,7 +2751,7 @@ "version": 1000 }, { - "key": "collection/doc65", + "key": "collection/doc65", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2758,7 +2762,7 @@ "version": 1000 }, { - "key": "collection/doc66", + "key": "collection/doc66", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2769,7 +2773,7 @@ "version": 1000 }, { - "key": "collection/doc67", + "key": "collection/doc67", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2780,7 +2784,7 @@ "version": 1000 }, { - "key": "collection/doc68", + "key": "collection/doc68", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2791,7 +2795,7 @@ "version": 1000 }, { - "key": "collection/doc69", + "key": "collection/doc69", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2802,7 +2806,7 @@ "version": 1000 }, { - "key": "collection/doc70", + "key": "collection/doc70", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2813,7 +2817,7 @@ "version": 1000 }, { - "key": "collection/doc71", + "key": "collection/doc71", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2824,7 +2828,7 @@ "version": 1000 }, { - "key": "collection/doc72", + "key": "collection/doc72", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2835,7 +2839,7 @@ "version": 1000 }, { - "key": "collection/doc73", + "key": "collection/doc73", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2846,7 +2850,7 @@ "version": 1000 }, { - "key": "collection/doc74", + "key": "collection/doc74", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2857,7 +2861,7 @@ "version": 1000 }, { - "key": "collection/doc75", + "key": "collection/doc75", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2868,7 +2872,7 @@ "version": 1000 }, { - "key": "collection/doc76", + "key": "collection/doc76", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2879,7 +2883,7 @@ "version": 1000 }, { - "key": "collection/doc77", + "key": "collection/doc77", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2890,7 +2894,7 @@ "version": 1000 }, { - "key": "collection/doc78", + "key": "collection/doc78", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2901,7 +2905,7 @@ "version": 1000 }, { - "key": "collection/doc79", + "key": "collection/doc79", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2912,7 +2916,7 @@ "version": 1000 }, { - "key": "collection/doc80", + "key": "collection/doc80", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2923,7 +2927,7 @@ "version": 1000 }, { - "key": "collection/doc81", + "key": "collection/doc81", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2934,7 +2938,7 @@ "version": 1000 }, { - "key": "collection/doc82", + "key": "collection/doc82", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2945,7 +2949,7 @@ "version": 1000 }, { - "key": "collection/doc83", + "key": "collection/doc83", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2956,7 +2960,7 @@ "version": 1000 }, { - "key": "collection/doc84", + "key": "collection/doc84", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2967,7 +2971,7 @@ "version": 1000 }, { - "key": "collection/doc85", + "key": "collection/doc85", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2978,7 +2982,7 @@ "version": 1000 }, { - "key": "collection/doc86", + "key": "collection/doc86", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -2989,7 +2993,7 @@ "version": 1000 }, { - "key": "collection/doc87", + "key": "collection/doc87", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3000,7 +3004,7 @@ "version": 1000 }, { - "key": "collection/doc88", + "key": "collection/doc88", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3011,7 +3015,7 @@ "version": 1000 }, { - "key": "collection/doc89", + "key": "collection/doc89", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3022,7 +3026,7 @@ "version": 1000 }, { - "key": "collection/doc90", + "key": "collection/doc90", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3033,7 +3037,7 @@ "version": 1000 }, { - "key": "collection/doc91", + "key": "collection/doc91", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3044,7 +3048,7 @@ "version": 1000 }, { - "key": "collection/doc92", + "key": "collection/doc92", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3055,7 +3059,7 @@ "version": 1000 }, { - "key": "collection/doc93", + "key": "collection/doc93", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3066,7 +3070,7 @@ "version": 1000 }, { - "key": "collection/doc94", + "key": "collection/doc94", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3077,7 +3081,7 @@ "version": 1000 }, { - "key": "collection/doc95", + "key": "collection/doc95", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3088,7 +3092,7 @@ "version": 1000 }, { - "key": "collection/doc96", + "key": "collection/doc96", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3099,7 +3103,7 @@ "version": 1000 }, { - "key": "collection/doc97", + "key": "collection/doc97", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3110,7 +3114,7 @@ "version": 1000 }, { - "key": "collection/doc98", + "key": "collection/doc98", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3121,7 +3125,7 @@ "version": 1000 }, { - "key": "collection/doc99", + "key": "collection/doc99", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -3295,7 +3299,8 @@ "path": "collection/doc50" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "11": { "queries": [ @@ -3307,7 +3312,8 @@ "path": "collection/doc55" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "13": { "queries": [ @@ -3319,7 +3325,8 @@ "path": "collection/doc56" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "15": { "queries": [ @@ -3331,7 +3338,8 @@ "path": "collection/doc57" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "17": { "queries": [ @@ -3343,7 +3351,8 @@ "path": "collection/doc58" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "19": { "queries": [ @@ -3355,7 +3364,8 @@ "path": "collection/doc59" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "2": { "queries": [ @@ -3379,7 +3389,8 @@ "path": "collection/doc60" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "23": { "queries": [ @@ -3391,7 +3402,8 @@ "path": "collection/doc61" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "25": { "queries": [ @@ -3403,7 +3415,8 @@ "path": "collection/doc62" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "27": { "queries": [ @@ -3415,7 +3428,8 @@ "path": "collection/doc63" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "29": { "queries": [ @@ -3427,7 +3441,8 @@ "path": "collection/doc64" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "3": { "queries": [ @@ -3439,7 +3454,8 @@ "path": "collection/doc51" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "31": { "queries": [ @@ -3451,7 +3467,8 @@ "path": "collection/doc65" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "33": { "queries": [ @@ -3463,7 +3480,8 @@ "path": "collection/doc66" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "35": { "queries": [ @@ -3475,7 +3493,8 @@ "path": "collection/doc67" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "37": { "queries": [ @@ -3487,7 +3506,8 @@ "path": "collection/doc68" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "39": { "queries": [ @@ -3499,7 +3519,8 @@ "path": "collection/doc69" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "41": { "queries": [ @@ -3511,7 +3532,8 @@ "path": "collection/doc70" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "43": { "queries": [ @@ -3523,7 +3545,8 @@ "path": "collection/doc71" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "45": { "queries": [ @@ -3535,7 +3558,8 @@ "path": "collection/doc72" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "47": { "queries": [ @@ -3547,7 +3571,8 @@ "path": "collection/doc73" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "49": { "queries": [ @@ -3559,7 +3584,8 @@ "path": "collection/doc74" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "5": { "queries": [ @@ -3571,7 +3597,8 @@ "path": "collection/doc52" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "51": { "queries": [ @@ -3583,7 +3610,8 @@ "path": "collection/doc75" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "53": { "queries": [ @@ -3595,7 +3623,8 @@ "path": "collection/doc76" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "55": { "queries": [ @@ -3607,7 +3636,8 @@ "path": "collection/doc77" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "57": { "queries": [ @@ -3619,7 +3649,8 @@ "path": "collection/doc78" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "59": { "queries": [ @@ -3631,7 +3662,8 @@ "path": "collection/doc79" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "61": { "queries": [ @@ -3643,7 +3675,8 @@ "path": "collection/doc80" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "63": { "queries": [ @@ -3655,7 +3688,8 @@ "path": "collection/doc81" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "65": { "queries": [ @@ -3667,7 +3701,8 @@ "path": "collection/doc82" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "67": { "queries": [ @@ -3679,7 +3714,8 @@ "path": "collection/doc83" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "69": { "queries": [ @@ -3691,7 +3727,8 @@ "path": "collection/doc84" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "7": { "queries": [ @@ -3703,7 +3740,8 @@ "path": "collection/doc53" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "71": { "queries": [ @@ -3715,7 +3753,8 @@ "path": "collection/doc85" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "73": { "queries": [ @@ -3727,7 +3766,8 @@ "path": "collection/doc86" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "75": { "queries": [ @@ -3739,7 +3779,8 @@ "path": "collection/doc87" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "77": { "queries": [ @@ -3751,7 +3792,8 @@ "path": "collection/doc88" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "79": { "queries": [ @@ -3763,7 +3805,8 @@ "path": "collection/doc89" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "81": { "queries": [ @@ -3775,7 +3818,8 @@ "path": "collection/doc90" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "83": { "queries": [ @@ -3787,7 +3831,8 @@ "path": "collection/doc91" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "85": { "queries": [ @@ -3799,7 +3844,8 @@ "path": "collection/doc92" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "87": { "queries": [ @@ -3811,7 +3857,8 @@ "path": "collection/doc93" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "89": { "queries": [ @@ -3823,7 +3870,8 @@ "path": "collection/doc94" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "9": { "queries": [ @@ -3835,7 +3883,8 @@ "path": "collection/doc54" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "91": { "queries": [ @@ -3847,7 +3896,8 @@ "path": "collection/doc95" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "93": { "queries": [ @@ -3859,7 +3909,8 @@ "path": "collection/doc96" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "95": { "queries": [ @@ -3871,7 +3922,8 @@ "path": "collection/doc97" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "97": { "queries": [ @@ -3883,7 +3935,8 @@ "path": "collection/doc98" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "99": { "queries": [ @@ -3895,7 +3948,8 @@ "path": "collection/doc99" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 } } } @@ -3995,7 +4049,7 @@ { "added": [ { - "key": "collection/1", + "key": "collection/1", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -4006,7 +4060,7 @@ "version": 1000 }, { - "key": "collection/2", + "key": "collection/2", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -4104,7 +4158,7 @@ { "added": [ { - "key": "collection/1", + "key": "collection/1", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -4115,7 +4169,7 @@ "version": 1000 }, { - "key": "collection/2", + "key": "collection/2", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -4238,7 +4292,7 @@ { "added": [ { - "key": "collection/1", + "key": "collection/1", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -4303,7 +4357,7 @@ { "added": [ { - "key": "collection/3", + "key": "collection/3", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -4416,7 +4470,7 @@ { "added": [ { - "key": "collection/2", + "key": "collection/2", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -4523,7 +4577,7 @@ { "added": [ { - "key": "collection/1", + "key": "collection/1", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -4578,7 +4632,7 @@ { "added": [ { - "key": "collection/1", + "key": "collection/1", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -4762,7 +4816,7 @@ { "added": [ { - "key": "collection/1", + "key": "collection/1", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -4773,7 +4827,7 @@ "version": 1000 }, { - "key": "collection/2", + "key": "collection/2", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -4907,7 +4961,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -4948,7 +5002,7 @@ }, "removed": [ { - "key": "collection/2", + "key": "collection/2", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -5064,7 +5118,7 @@ { "added": [ { - "key": "collection/1", + "key": "collection/1", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -5219,7 +5273,7 @@ { "added": [ { - "key": "collection/1", + "key": "collection/1", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -5337,7 +5391,7 @@ { "added": [ { - "key": "collection/1", + "key": "collection/1", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -5348,7 +5402,7 @@ "version": 1000 }, { - "key": "collection/2", + "key": "collection/2", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -5482,7 +5536,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5533,7 +5587,7 @@ }, "removed": [ { - "key": "collection/2", + "key": "collection/2", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -5660,7 +5714,7 @@ { "added": [ { - "key": "collection/1", + "key": "collection/1", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -5671,7 +5725,7 @@ "version": 1000 }, { - "key": "collection/2", + "key": "collection/2", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -5835,7 +5889,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5886,7 +5940,7 @@ }, "removed": [ { - "key": "collection/2", + "key": "collection/2", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -6002,7 +6056,7 @@ { "added": [ { - "key": "collection/a", + "key": "collection/a", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -6055,7 +6109,7 @@ }, "removed": [ { - "key": "collection/a", + "key": "collection/a", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -6285,7 +6339,7 @@ { "added": [ { - "key": "collection/a", + "key": "collection/a", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -6296,7 +6350,7 @@ "version": 1000 }, { - "key": "collection/b", + "key": "collection/b", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -6372,7 +6426,8 @@ "path": "collection/b" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "2": { "queries": [ @@ -6422,7 +6477,7 @@ }, "removed": [ { - "key": "collection/b", + "key": "collection/b", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -6550,7 +6605,7 @@ { "added": [ { - "key": "collection/a", + "key": "collection/a", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -6561,7 +6616,7 @@ "version": 1000 }, { - "key": "collection/b", + "key": "collection/b", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -6634,7 +6689,8 @@ "path": "collection" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 1 } } } @@ -6744,7 +6800,7 @@ { "added": [ { - "key": "collection/a", + "key": "collection/a", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -6755,7 +6811,7 @@ "version": 1000 }, { - "key": "collection/b", + "key": "collection/b", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -6766,7 +6822,7 @@ "version": 1000 }, { - "key": "collection/c", + "key": "collection/c", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -6826,14 +6882,7 @@ "path": "collection" } } - ] - }, - { - "watchRemove": { - "targetIds": [ - 2 - ] - }, + ], "expectedState": { "activeTargets": { "2": { @@ -6846,7 +6895,8 @@ "path": "collection" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 2 } } } @@ -6945,7 +6995,7 @@ { "added": [ { - "key": "collection/a", + "key": "collection/a", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -6956,7 +7006,7 @@ "version": 1000 }, { - "key": "collection/b", + "key": "collection/b", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -7029,7 +7079,8 @@ "path": "collection" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 1 } } } @@ -7128,7 +7179,7 @@ { "added": [ { - "key": "collection/a", + "key": "collection/a", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -7139,7 +7190,7 @@ "version": 1000 }, { - "key": "collection/b", + "key": "collection/b", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -7212,7 +7263,8 @@ "path": "collection" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 1 } } } @@ -7321,7 +7373,7 @@ { "added": [ { - "key": "collection/a", + "key": "collection/a", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -7332,7 +7384,7 @@ "version": 1000 }, { - "key": "collection/b", + "key": "collection/b", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -7381,7 +7433,7 @@ { "added": [ { - "key": "collection/b", + "key": "collection/b", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -7502,7 +7554,7 @@ { "added": [ { - "key": "collection/c", + "key": "collection/c", "options": { "hasCommittedMutations": false, "hasLocalMutations": false @@ -7588,7 +7640,8 @@ "path": "collection/a" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "2": { "queries": [ @@ -7685,7 +7738,8 @@ "path": "collection/a" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "2": { "queries": [ @@ -7714,7 +7768,8 @@ "path": "collection/c" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "4": { "queries": [ diff --git a/firebase-firestore/src/test/resources/json/limbo_spec_test.json b/firebase-firestore/src/test/resources/json/limbo_spec_test.json index d966cb1f238..de82951040a 100644 --- a/firebase-firestore/src/test/resources/json/limbo_spec_test.json +++ b/firebase-firestore/src/test/resources/json/limbo_spec_test.json @@ -235,7 +235,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -281,7 +281,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -406,7 +406,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -489,7 +489,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -572,7 +572,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -675,7 +675,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "10": { "queries": [ @@ -775,7 +775,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "10": { "queries": [ @@ -866,7 +866,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -940,7 +940,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -1202,7 +1202,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -1248,7 +1248,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -1373,7 +1373,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -1456,7 +1456,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -1539,7 +1539,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -1642,7 +1642,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "10": { "queries": [ @@ -1742,7 +1742,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "10": { "queries": [ @@ -2038,7 +2038,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -2123,7 +2123,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -2206,7 +2206,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -2420,7 +2420,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -2834,7 +2834,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -3119,7 +3119,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -3386,7 +3386,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -3633,7 +3633,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -3921,7 +3921,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -4037,7 +4037,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -4298,7 +4298,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -4646,7 +4646,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5025,7 +5025,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5114,7 +5114,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5486,7 +5486,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5511,7 +5511,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -5623,7 +5623,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -5648,7 +5648,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -5703,7 +5703,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -5822,7 +5822,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -6255,7 +6255,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -6782,7 +6782,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -7109,7 +7109,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -7193,7 +7193,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -7512,7 +7512,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -7537,7 +7537,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -7646,7 +7646,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "7": { "queries": [ @@ -7659,7 +7659,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -7765,7 +7765,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -8187,7 +8187,8 @@ "path": "collection/a1" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "2": { "queries": [ @@ -8211,7 +8212,8 @@ "path": "collection/a2" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -8632,7 +8634,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -8658,7 +8660,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -8765,7 +8767,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -9095,7 +9097,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -9120,7 +9122,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -9210,7 +9212,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "5": { "queries": [ @@ -9223,7 +9225,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -9307,7 +9309,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "7": { "queries": [ @@ -9320,7 +9322,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -9403,7 +9405,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "9": { "queries": [ @@ -9416,7 +9418,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -9497,7 +9499,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } }, "enqueuedLimboDocs": [ @@ -9869,7 +9871,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ diff --git a/firebase-firestore/src/test/resources/json/limit_spec_test.json b/firebase-firestore/src/test/resources/json/limit_spec_test.json index 3b226ee1061..ed2b461ce74 100644 --- a/firebase-firestore/src/test/resources/json/limit_spec_test.json +++ b/firebase-firestore/src/test/resources/json/limit_spec_test.json @@ -214,7 +214,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -4334,7 +4334,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ @@ -4361,7 +4361,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -4495,7 +4495,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -4520,7 +4520,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -4661,7 +4661,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "7": { "queries": [ @@ -4674,7 +4674,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -4814,7 +4814,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 } } } @@ -5304,7 +5304,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -5565,7 +5565,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "2": { "queries": [ diff --git a/firebase-firestore/src/test/resources/json/offline_spec_test.json b/firebase-firestore/src/test/resources/json/offline_spec_test.json index eb8a35f3074..91e4205e441 100644 --- a/firebase-firestore/src/test/resources/json/offline_spec_test.json +++ b/firebase-firestore/src/test/resources/json/offline_spec_test.json @@ -1149,7 +1149,8 @@ "path": "collection/a" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "2": { "queries": [ @@ -1186,7 +1187,8 @@ "path": "collection/a" } ], - "resumeToken": "" + "resumeToken": "", + "targetPurpose": 3 }, "2": { "queries": [ diff --git a/firebase-firestore/src/test/resources/json/recovery_spec_test.json b/firebase-firestore/src/test/resources/json/recovery_spec_test.json index bb7306476a3..2e66d63b8d5 100644 --- a/firebase-firestore/src/test/resources/json/recovery_spec_test.json +++ b/firebase-firestore/src/test/resources/json/recovery_spec_test.json @@ -3095,7 +3095,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -3184,7 +3184,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -3569,7 +3569,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [ @@ -3629,7 +3629,7 @@ } ], "resumeToken": "", - "targetPurpose": 2 + "targetPurpose": 3 }, "4": { "queries": [