aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/Source/Local
diff options
context:
space:
mode:
authorGravatar Greg Soltis <gsoltis@google.com>2018-04-02 16:01:03 -0700
committerGravatar GitHub <noreply@github.com>2018-04-02 16:01:03 -0700
commitc46e7f2928f9af3ad7767d072d6c9d4d8ad81012 (patch)
tree03b7c9f55e13dc4757610e2e68461ffadc9df266 /Firestore/Source/Local
parent549822959d6e2737e522cbec6a24f8bda1759e47 (diff)
Drop FSTRemoteDocumentChangeBuffer (#1013)
Diffstat (limited to 'Firestore/Source/Local')
-rw-r--r--Firestore/Source/Local/FSTLocalStore.mm44
-rw-r--r--Firestore/Source/Local/FSTRemoteDocumentChangeBuffer.h66
-rw-r--r--Firestore/Source/Local/FSTRemoteDocumentChangeBuffer.mm93
3 files changed, 12 insertions, 191 deletions
diff --git a/Firestore/Source/Local/FSTLocalStore.mm b/Firestore/Source/Local/FSTLocalStore.mm
index 412ade2..990e332 100644
--- a/Firestore/Source/Local/FSTLocalStore.mm
+++ b/Firestore/Source/Local/FSTLocalStore.mm
@@ -30,7 +30,6 @@
#import "Firestore/Source/Local/FSTQueryData.h"
#import "Firestore/Source/Local/FSTReferenceSet.h"
#import "Firestore/Source/Local/FSTRemoteDocumentCache.h"
-#import "Firestore/Source/Local/FSTRemoteDocumentChangeBuffer.h"
#import "Firestore/Source/Model/FSTDocument.h"
#import "Firestore/Source/Model/FSTDocumentDictionary.h"
#import "Firestore/Source/Model/FSTMutation.h"
@@ -221,12 +220,7 @@ NS_ASSUME_NONNULL_BEGIN
[self.heldBatchResults addObject:batchResult];
affected = [FSTDocumentKeySet keySet];
} else {
- FSTRemoteDocumentChangeBuffer *remoteDocuments =
- [FSTRemoteDocumentChangeBuffer changeBufferWithCache:self.remoteDocumentCache];
-
- affected = [self releaseBatchResults:@[ batchResult ] remoteDocuments:remoteDocuments];
-
- [remoteDocuments apply];
+ affected = [self releaseBatchResults:@[ batchResult ]];
}
[self.mutationQueue performConsistencyCheck];
@@ -268,9 +262,6 @@ NS_ASSUME_NONNULL_BEGIN
return self.persistence.run("Apply remote event", [&]() -> FSTMaybeDocumentDictionary * {
id<FSTQueryCache> queryCache = self.queryCache;
- FSTRemoteDocumentChangeBuffer *remoteDocuments =
- [FSTRemoteDocumentChangeBuffer changeBufferWithCache:self.remoteDocumentCache];
-
[remoteEvent.targetChanges enumerateKeysAndObjectsUsingBlock:^(
NSNumber *targetIDNumber, FSTTargetChange *change, BOOL *stop) {
FSTTargetID targetID = targetIDNumber.intValue;
@@ -315,13 +306,13 @@ NS_ASSUME_NONNULL_BEGIN
const DocumentKey &key = kv.first;
FSTMaybeDocument *doc = kv.second;
changedDocKeys = [changedDocKeys setByAddingObject:key];
- FSTMaybeDocument *existingDoc = [remoteDocuments entryForKey:key];
+ FSTMaybeDocument *existingDoc = [self.remoteDocumentCache entryForKey:key];
// Make sure we don't apply an old document version to the remote cache, though we
// make an exception for [SnapshotVersion noVersion] which can happen for manufactured
// events (e.g. in the case of a limbo document resolution failing).
if (!existingDoc || [doc.version isEqual:[FSTSnapshotVersion noVersion]] ||
[doc.version compare:existingDoc.version] != NSOrderedAscending) {
- [remoteDocuments addEntry:doc];
+ [self.remoteDocumentCache addEntry:doc];
} else {
FSTLog(
@"FSTLocalStore Ignoring outdated watch update for %s. "
@@ -346,10 +337,7 @@ NS_ASSUME_NONNULL_BEGIN
[self.queryCache setLastRemoteSnapshotVersion:remoteVersion];
}
- FSTDocumentKeySet *releasedWriteKeys =
- [self releaseHeldBatchResultsWithRemoteDocuments:remoteDocuments];
-
- [remoteDocuments apply];
+ FSTDocumentKeySet *releasedWriteKeys = [self releaseHeldBatchResults];
// Union the two key sets.
__block FSTDocumentKeySet *keysToRecalc = changedDocKeys;
@@ -423,12 +411,7 @@ NS_ASSUME_NONNULL_BEGIN
// If this was the last watch target, then we won't get any more watch snapshots, so we should
// release any held batch results.
if ([self.targetIDs count] == 0) {
- FSTRemoteDocumentChangeBuffer *remoteDocuments =
- [FSTRemoteDocumentChangeBuffer changeBufferWithCache:self.remoteDocumentCache];
-
- [self releaseHeldBatchResultsWithRemoteDocuments:remoteDocuments];
-
- [remoteDocuments apply];
+ [self releaseHeldBatchResults];
}
});
}
@@ -464,8 +447,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* @return the set of keys of docs that were modified by those writes.
*/
-- (FSTDocumentKeySet *)releaseHeldBatchResultsWithRemoteDocuments:
- (FSTRemoteDocumentChangeBuffer *)remoteDocuments {
+- (FSTDocumentKeySet *)releaseHeldBatchResults {
NSMutableArray<FSTMutationBatchResult *> *toRelease = [NSMutableArray array];
for (FSTMutationBatchResult *batchResult in self.heldBatchResults) {
if (![self isRemoteUpToVersion:batchResult.commitVersion]) {
@@ -478,7 +460,7 @@ NS_ASSUME_NONNULL_BEGIN
return [FSTDocumentKeySet keySet];
} else {
[self.heldBatchResults removeObjectsInRange:NSMakeRange(0, toRelease.count)];
- return [self releaseBatchResults:toRelease remoteDocuments:remoteDocuments];
+ return [self releaseBatchResults:toRelease];
}
}
@@ -493,11 +475,10 @@ NS_ASSUME_NONNULL_BEGIN
return ![self isRemoteUpToVersion:version] || self.heldBatchResults.count > 0;
}
-- (FSTDocumentKeySet *)releaseBatchResults:(NSArray<FSTMutationBatchResult *> *)batchResults
- remoteDocuments:(FSTRemoteDocumentChangeBuffer *)remoteDocuments {
+- (FSTDocumentKeySet *)releaseBatchResults:(NSArray<FSTMutationBatchResult *> *)batchResults {
NSMutableArray<FSTMutationBatch *> *batches = [NSMutableArray array];
for (FSTMutationBatchResult *batchResult in batchResults) {
- [self applyBatchResult:batchResult toRemoteDocuments:remoteDocuments];
+ [self applyBatchResult:batchResult];
[batches addObject:batchResult.batch];
}
@@ -525,12 +506,11 @@ NS_ASSUME_NONNULL_BEGIN
return affectedDocs;
}
-- (void)applyBatchResult:(FSTMutationBatchResult *)batchResult
- toRemoteDocuments:(FSTRemoteDocumentChangeBuffer *)remoteDocuments {
+- (void)applyBatchResult:(FSTMutationBatchResult *)batchResult {
FSTMutationBatch *batch = batchResult.batch;
FSTDocumentKeySet *docKeys = batch.keys;
[docKeys enumerateObjectsUsingBlock:^(FSTDocumentKey *docKey, BOOL *stop) {
- FSTMaybeDocument *_Nullable remoteDoc = [remoteDocuments entryForKey:docKey];
+ FSTMaybeDocument *_Nullable remoteDoc = [self.remoteDocumentCache entryForKey:docKey];
FSTMaybeDocument *_Nullable doc = remoteDoc;
FSTSnapshotVersion *ackVersion = batchResult.docVersions[docKey];
FSTAssert(ackVersion, @"docVersions should contain every doc in the write.");
@@ -540,7 +520,7 @@ NS_ASSUME_NONNULL_BEGIN
FSTAssert(!remoteDoc, @"Mutation batch %@ applied to document %@ resulted in nil.", batch,
remoteDoc);
} else {
- [remoteDocuments addEntry:doc];
+ [self.remoteDocumentCache addEntry:doc];
}
}
}];
diff --git a/Firestore/Source/Local/FSTRemoteDocumentChangeBuffer.h b/Firestore/Source/Local/FSTRemoteDocumentChangeBuffer.h
deleted file mode 100644
index be29a89..0000000
--- a/Firestore/Source/Local/FSTRemoteDocumentChangeBuffer.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2017 Google
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#import <Foundation/Foundation.h>
-
-#include "Firestore/core/src/firebase/firestore/model/document_key.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@protocol FSTRemoteDocumentCache;
-@class FSTMaybeDocument;
-
-/**
- * An in-memory buffer of entries to be written to an FSTRemoteDocumentCache. It can be used to
- * batch up a set of changes to be written to the cache, but additionally supports reading entries
- * back with the `entryForKey:` method, falling back to the underlying FSTRemoteDocumentCache if
- * no entry is buffered. In the absence of LevelDB transactions (that would allow reading back
- * uncommitted writes), this greatly simplifies the implementation of complex operations that
- * may want to freely read/write entries to the FSTRemoteDocumentCache while still ensuring that
- * the final writing of the buffered entries is atomic.
- *
- * For doing blind writes that don't depend on the current state of the FSTRemoteDocumentCache
- * or for plain reads, you can/should still just use the FSTRemoteDocumentCache directly.
- */
-@interface FSTRemoteDocumentChangeBuffer : NSObject
-
-+ (instancetype)changeBufferWithCache:(id<FSTRemoteDocumentCache>)cache;
-
-- (instancetype)init __attribute__((unavailable("Use a static constructor instead")));
-
-/** Buffers an `FSTRemoteDocumentCache addEntry:group:` call. */
-- (void)addEntry:(FSTMaybeDocument *)maybeDocument;
-
-// NOTE: removeEntryForKey: is not presently necessary and so is omitted.
-
-/**
- * Looks up an entry in the cache. The buffered changes will first be checked, and if no
- * buffered change applies, this will forward to `FSTRemoteDocumentCache entryForKey:`.
- *
- * @param documentKey The key of the entry to look up.
- * @return The cached FSTDocument or FSTDeletedDocument entry, or nil if we have nothing cached.
- */
-- (nullable FSTMaybeDocument *)entryForKey:
- (const firebase::firestore::model::DocumentKey &)documentKey;
-
-/**
- * Applies buffered changes to the underlying FSTRemoteDocumentCache
- */
-- (void)apply;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/Firestore/Source/Local/FSTRemoteDocumentChangeBuffer.mm b/Firestore/Source/Local/FSTRemoteDocumentChangeBuffer.mm
deleted file mode 100644
index 3812501..0000000
--- a/Firestore/Source/Local/FSTRemoteDocumentChangeBuffer.mm
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2017 Google
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#import "Firestore/Source/Local/FSTRemoteDocumentChangeBuffer.h"
-
-#include <map>
-#include <memory>
-
-#import "Firestore/Source/Local/FSTRemoteDocumentCache.h"
-#import "Firestore/Source/Model/FSTDocument.h"
-#import "Firestore/Source/Util/FSTAssert.h"
-
-#include "Firestore/core/src/firebase/firestore/model/document_key.h"
-#include "absl/memory/memory.h"
-
-using firebase::firestore::model::DocumentKey;
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface FSTRemoteDocumentChangeBuffer ()
-
-- (instancetype)initWithCache:(id<FSTRemoteDocumentCache>)cache;
-
-/** The underlying cache we're buffering changes for. */
-@property(nonatomic, strong, nonnull) id<FSTRemoteDocumentCache> remoteDocumentCache;
-
-@end
-
-@implementation FSTRemoteDocumentChangeBuffer {
- /** The buffered changes, stored as a dictionary for easy lookups. */
- std::unique_ptr<std::map<DocumentKey, FSTMaybeDocument *>> _changes;
-}
-
-+ (instancetype)changeBufferWithCache:(id<FSTRemoteDocumentCache>)cache {
- return [[FSTRemoteDocumentChangeBuffer alloc] initWithCache:cache];
-}
-
-- (instancetype)initWithCache:(id<FSTRemoteDocumentCache>)cache {
- if (self = [super init]) {
- _remoteDocumentCache = cache;
- _changes = absl::make_unique<std::map<DocumentKey, FSTMaybeDocument *>>();
- }
- return self;
-}
-
-- (void)addEntry:(FSTMaybeDocument *)maybeDocument {
- [self assertValid];
-
- (*_changes)[maybeDocument.key] = maybeDocument;
-}
-
-- (nullable FSTMaybeDocument *)entryForKey:(const DocumentKey &)documentKey {
- [self assertValid];
-
- const auto iter = _changes->find(documentKey);
- if (iter == _changes->end()) {
- return [self.remoteDocumentCache entryForKey:documentKey];
- } else {
- return iter->second;
- }
-}
-
-- (void)apply {
- [self assertValid];
-
- for (const auto &kv : *_changes) {
- [self.remoteDocumentCache addEntry:kv.second];
- }
-
- // We should not be used to buffer any more changes.
- _changes.reset();
-}
-
-- (void)assertValid {
- FSTAssert(_changes, @"Changes have already been applied.");
-}
-
-@end
-
-NS_ASSUME_NONNULL_END