Skip to content

Commit b3050e4

Browse files
authored
port C++ DocumentKey to Remote/* (#965)
* port C++ DocumentKey to Remote's * port C++ DocumentKey to Remote's * address changes * address changes * address changes
1 parent 3817034 commit b3050e4

15 files changed

+173
-138
lines changed

Firestore/Example/Tests/Remote/FSTRemoteEventTests.mm

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ - (void)testWillAccumulateDocumentAddedAndRemovedEvents {
7979

8080
FSTRemoteEvent *event = [aggregator remoteEvent];
8181
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
82-
XCTAssertEqual(event.documentUpdates.count, 2);
83-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc1.key], doc1);
84-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc2.key], doc2);
82+
XCTAssertEqual(event.documentUpdates.size(), 2);
83+
XCTAssertEqualObjects(event.documentUpdates.at(doc1.key), doc1);
84+
XCTAssertEqualObjects(event.documentUpdates.at(doc2.key), doc2);
8585

8686
XCTAssertEqual(event.targetChanges.count, 6);
8787

@@ -143,8 +143,8 @@ - (void)testWillIgnoreEventsForPendingTargets {
143143
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
144144
// doc1 is ignored because it was part of an inactive target, but doc2 is in the changes
145145
// because it become active.
146-
XCTAssertEqual(event.documentUpdates.count, 1);
147-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc2.key], doc2);
146+
XCTAssertEqual(event.documentUpdates.size(), 1);
147+
XCTAssertEqualObjects(event.documentUpdates.at(doc2.key), doc2);
148148

149149
XCTAssertEqual(event.targetChanges.count, 1);
150150
}
@@ -170,7 +170,7 @@ - (void)testWillIgnoreEventsForRemovedTargets {
170170
FSTRemoteEvent *event = [aggregator remoteEvent];
171171
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
172172
// doc1 is ignored because it was part of an inactive target
173-
XCTAssertEqual(event.documentUpdates.count, 0);
173+
XCTAssertEqual(event.documentUpdates.size(), 0);
174174

175175
// Target 1 is ignored because it was removed
176176
XCTAssertEqual(event.targetChanges.count, 0);
@@ -213,10 +213,10 @@ - (void)testWillKeepResetMappingEvenWithUpdates {
213213

214214
FSTRemoteEvent *event = [aggregator remoteEvent];
215215
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
216-
XCTAssertEqual(event.documentUpdates.count, 3);
217-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc1.key], doc1);
218-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc2.key], doc2);
219-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc3.key], doc3);
216+
XCTAssertEqual(event.documentUpdates.size(), 3);
217+
XCTAssertEqualObjects(event.documentUpdates.at(doc1.key), doc1);
218+
XCTAssertEqualObjects(event.documentUpdates.at(doc2.key), doc2);
219+
XCTAssertEqualObjects(event.documentUpdates.at(doc3.key), doc3);
220220

221221
XCTAssertEqual(event.targetChanges.count, 1);
222222

@@ -237,7 +237,7 @@ - (void)testWillHandleSingleReset {
237237

238238
FSTRemoteEvent *event = [aggregator remoteEvent];
239239
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
240-
XCTAssertEqual(event.documentUpdates.count, 0);
240+
XCTAssertEqual(event.documentUpdates.size(), 0);
241241

242242
XCTAssertEqual(event.targetChanges.count, 1);
243243

@@ -265,8 +265,8 @@ - (void)testWillHandleTargetAddAndRemovalInSameBatch {
265265

266266
FSTRemoteEvent *event = [aggregator remoteEvent];
267267
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
268-
XCTAssertEqual(event.documentUpdates.count, 1);
269-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc1b.key], doc1b);
268+
XCTAssertEqual(event.documentUpdates.size(), 1);
269+
XCTAssertEqualObjects(event.documentUpdates.at(doc1b.key), doc1b);
270270

271271
XCTAssertEqual(event.targetChanges.count, 2);
272272

@@ -289,7 +289,7 @@ - (void)testTargetCurrentChangeWillMarkTheTargetCurrent {
289289

290290
FSTRemoteEvent *event = [aggregator remoteEvent];
291291
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
292-
XCTAssertEqual(event.documentUpdates.count, 0);
292+
XCTAssertEqual(event.documentUpdates.size(), 0);
293293
XCTAssertEqual(event.targetChanges.count, 1);
294294
FSTTargetChange *targetChange = event.targetChanges[@1];
295295
XCTAssertEqualObjects(targetChange.mapping, [[FSTUpdateMapping alloc] init]);
@@ -331,9 +331,9 @@ - (void)testTargetAddedChangeWillResetPreviousState {
331331

332332
FSTRemoteEvent *event = [aggregator remoteEvent];
333333
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
334-
XCTAssertEqual(event.documentUpdates.count, 2);
335-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc1.key], doc1);
336-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc2.key], doc2);
334+
XCTAssertEqual(event.documentUpdates.size(), 2);
335+
XCTAssertEqualObjects(event.documentUpdates.at(doc1.key), doc1);
336+
XCTAssertEqualObjects(event.documentUpdates.at(doc2.key), doc2);
337337

338338
// target 1 and 3 are affected (1 because of re-add), target 2 is not because of remove
339339
XCTAssertEqual(event.targetChanges.count, 2);
@@ -364,7 +364,7 @@ - (void)testNoChangeWillStillMarkTheAffectedTargets {
364364

365365
FSTRemoteEvent *event = [aggregator remoteEvent];
366366
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
367-
XCTAssertEqual(event.documentUpdates.count, 0);
367+
XCTAssertEqual(event.documentUpdates.size(), 0);
368368
XCTAssertEqual(event.targetChanges.count, 1);
369369
XCTAssertEqualObjects(event.targetChanges[@1].mapping, [[FSTUpdateMapping alloc] init]);
370370
XCTAssertEqual(event.targetChanges[@1].currentStatusUpdate, FSTCurrentStatusUpdateNone);
@@ -386,7 +386,7 @@ - (void)testExistenceFiltersWillReplacePreviousExistenceFilters {
386386

387387
FSTRemoteEvent *event = [aggregator remoteEvent];
388388
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
389-
XCTAssertEqual(event.documentUpdates.count, 0);
389+
XCTAssertEqual(event.documentUpdates.size(), 0);
390390
XCTAssertEqual(event.targetChanges.count, 0);
391391
XCTAssertEqual(aggregator.existenceFilters.count, 2);
392392
XCTAssertEqual(aggregator.existenceFilters[@1], filter1);
@@ -418,9 +418,9 @@ - (void)testExistenceFilterMismatchResetsTarget {
418418

419419
FSTRemoteEvent *event = [aggregator remoteEvent];
420420
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
421-
XCTAssertEqual(event.documentUpdates.count, 2);
422-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc1.key], doc1);
423-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc2.key], doc2);
421+
XCTAssertEqual(event.documentUpdates.size(), 2);
422+
XCTAssertEqualObjects(event.documentUpdates.at(doc1.key), doc1);
423+
XCTAssertEqualObjects(event.documentUpdates.at(doc2.key), doc2);
424424

425425
XCTAssertEqual(event.targetChanges.count, 1);
426426

@@ -465,22 +465,22 @@ - (void)testDocumentUpdate {
465465

466466
FSTRemoteEvent *event = [aggregator remoteEvent];
467467
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
468-
XCTAssertEqual(event.documentUpdates.count, 2);
469-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc1.key], doc1);
470-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc2.key], doc2);
468+
XCTAssertEqual(event.documentUpdates.size(), 2);
469+
XCTAssertEqualObjects(event.documentUpdates.at(doc1.key), doc1);
470+
XCTAssertEqualObjects(event.documentUpdates.at(doc2.key), doc2);
471471

472472
// Update doc1
473473
[event addDocumentUpdate:deletedDoc1];
474474
[event addDocumentUpdate:doc3];
475475

476476
XCTAssertEqualObjects(event.snapshotVersion, FSTTestVersion(3));
477-
XCTAssertEqual(event.documentUpdates.count, 3);
477+
XCTAssertEqual(event.documentUpdates.size(), 3);
478478
// doc1 is replaced
479-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc1.key], deletedDoc1);
479+
XCTAssertEqualObjects(event.documentUpdates.at(doc1.key), deletedDoc1);
480480
// doc2 is untouched
481-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc2.key], doc2);
481+
XCTAssertEqualObjects(event.documentUpdates.at(doc2.key), doc2);
482482
// doc3 is new
483-
XCTAssertEqualObjects(event.documentUpdates[(FSTDocumentKey *)doc3.key], doc3);
483+
XCTAssertEqualObjects(event.documentUpdates.at(doc3.key), doc3);
484484

485485
// Target is unchanged
486486
XCTAssertEqual(event.targetChanges.count, 1);

Firestore/Source/API/FIRTransaction.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ - (void)getDocument:(FIRDocumentReference *)document
9494
NSError *_Nullable error))completion {
9595
[self validateReference:document];
9696
[self.internalTransaction
97-
lookupDocumentsForKeys:@[ document.key ]
97+
lookupDocumentsForKeys:{document.key}
9898
completion:^(NSArray<FSTMaybeDocument *> *_Nullable documents,
9999
NSError *_Nullable error) {
100100
if (error) {

Firestore/Source/Core/FSTSyncEngine.mm

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ - (void)applyRemoteEvent:(FSTRemoteEvent *)remoteEvent {
300300
FSTTargetChange *_Nonnull targetChange, BOOL *_Nonnull stop) {
301301
FSTDocumentKey *limboKey = self.limboKeysByTarget[targetID];
302302
if (limboKey && targetChange.currentStatusUpdate == FSTCurrentStatusUpdateMarkCurrent &&
303-
remoteEvent.documentUpdates[limboKey] == nil) {
303+
remoteEvent.documentUpdates.find(limboKey) == remoteEvent.documentUpdates.end()) {
304304
// When listening to a query the server responds with a snapshot containing documents
305305
// matching the query and a current marker telling us we're now in sync. It's possible for
306306
// these to arrive as separate remote events or as a single remote event. For a document
@@ -363,11 +363,9 @@ - (void)rejectListenWithTargetID:(FSTBoxedTargetID *)targetID error:(NSError *)e
363363
[NSMutableDictionary dictionary];
364364
FSTDeletedDocument *doc =
365365
[FSTDeletedDocument documentWithKey:limboKey version:[FSTSnapshotVersion noVersion]];
366-
NSMutableDictionary<FSTDocumentKey *, FSTMaybeDocument *> *docUpdate =
367-
[NSMutableDictionary dictionaryWithObject:doc forKey:limboKey];
368366
FSTRemoteEvent *event = [FSTRemoteEvent eventWithSnapshotVersion:[FSTSnapshotVersion noVersion]
369367
targetChanges:targetChanges
370-
documentUpdates:docUpdate];
368+
documentUpdates:{{limboKey, doc}}];
371369
[self applyRemoteEvent:event];
372370
} else {
373371
FSTQueryView *queryView = self.queryViewsByTarget[targetID];

Firestore/Source/Core/FSTTransaction.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,12 @@
1616

1717
#import <Foundation/Foundation.h>
1818

19+
#include <vector>
20+
1921
#import "Firestore/Source/Core/FSTTypes.h"
2022

23+
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
24+
2125
@class FIRSetOptions;
2226
@class FSTDatastore;
2327
@class FSTDocumentKey;
@@ -42,7 +46,7 @@ NS_ASSUME_NONNULL_BEGIN
4246
* Takes a set of keys and asynchronously attempts to fetch all the documents from the backend,
4347
* ignoring any local changes.
4448
*/
45-
- (void)lookupDocumentsForKeys:(NSArray<FSTDocumentKey *> *)keys
49+
- (void)lookupDocumentsForKeys:(const std::vector<firebase::firestore::model::DocumentKey> &)keys
4650
completion:(FSTVoidMaybeDocumentArrayErrorBlock)completion;
4751

4852
/**

Firestore/Source/Core/FSTTransaction.mm

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
#import "Firestore/Source/Core/FSTTransaction.h"
1818

19+
#include <vector>
20+
1921
#import <GRPCClient/GRPCCall.h>
2022

2123
#import "FIRFirestoreErrors.h"
@@ -32,6 +34,8 @@
3234

3335
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
3436

37+
using firebase::firestore::model::DocumentKey;
38+
3539
NS_ASSUME_NONNULL_BEGIN
3640

3741
#pragma mark - FSTTransaction
@@ -99,7 +103,7 @@ - (BOOL)recordVersionForDocument:(FSTMaybeDocument *)doc error:(NSError **)error
99103
}
100104
}
101105

102-
- (void)lookupDocumentsForKeys:(NSArray<FSTDocumentKey *> *)keys
106+
- (void)lookupDocumentsForKeys:(const std::vector<DocumentKey> &)keys
103107
completion:(FSTVoidMaybeDocumentArrayErrorBlock)completion {
104108
[self ensureCommitNotCalled];
105109
if (self.mutations.count) {

Firestore/Source/Local/FSTLocalStore.mm

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
using firebase::firestore::auth::User;
4848
using firebase::firestore::model::DocumentKey;
4949
using firebase::firestore::core::TargetIdGenerator;
50+
using firebase::firestore::model::DocumentKey;
5051

5152
NS_ASSUME_NONNULL_BEGIN
5253

@@ -320,28 +321,29 @@ - (FSTMaybeDocumentDictionary *)applyRemoteEvent:(FSTRemoteEvent *)remoteEvent {
320321
}];
321322

322323
// TODO(klimt): This could probably be an NSMutableDictionary.
323-
__block FSTDocumentKeySet *changedDocKeys = [FSTDocumentKeySet keySet];
324-
[remoteEvent.documentUpdates
325-
enumerateKeysAndObjectsUsingBlock:^(FSTDocumentKey *key, FSTMaybeDocument *doc, BOOL *stop) {
326-
changedDocKeys = [changedDocKeys setByAddingObject:key];
327-
FSTMaybeDocument *existingDoc = [remoteDocuments entryForKey:key];
328-
// Make sure we don't apply an old document version to the remote cache, though we
329-
// make an exception for [SnapshotVersion noVersion] which can happen for manufactured
330-
// events (e.g. in the case of a limbo document resolution failing).
331-
if (!existingDoc || [doc.version isEqual:[FSTSnapshotVersion noVersion]] ||
332-
[doc.version compare:existingDoc.version] != NSOrderedAscending) {
333-
[remoteDocuments addEntry:doc];
334-
} else {
335-
FSTLog(
336-
@"FSTLocalStore Ignoring outdated watch update for %@. "
337-
"Current version: %@ Watch version: %@",
338-
key, existingDoc.version, doc.version);
339-
}
340-
341-
// The document might be garbage because it was unreferenced by everything.
342-
// Make sure to mark it as garbage if it is...
343-
[self.garbageCollector addPotentialGarbageKey:key];
344-
}];
324+
FSTDocumentKeySet *changedDocKeys = [FSTDocumentKeySet keySet];
325+
for (const auto &kv : remoteEvent.documentUpdates) {
326+
const DocumentKey &key = kv.first;
327+
FSTMaybeDocument *doc = kv.second;
328+
changedDocKeys = [changedDocKeys setByAddingObject:key];
329+
FSTMaybeDocument *existingDoc = [remoteDocuments entryForKey:key];
330+
// Make sure we don't apply an old document version to the remote cache, though we
331+
// make an exception for [SnapshotVersion noVersion] which can happen for manufactured
332+
// events (e.g. in the case of a limbo document resolution failing).
333+
if (!existingDoc || [doc.version isEqual:[FSTSnapshotVersion noVersion]] ||
334+
[doc.version compare:existingDoc.version] != NSOrderedAscending) {
335+
[remoteDocuments addEntry:doc];
336+
} else {
337+
FSTLog(
338+
@"FSTLocalStore Ignoring outdated watch update for %s. "
339+
"Current version: %@ Watch version: %@",
340+
key.ToString().c_str(), existingDoc.version, doc.version);
341+
}
342+
343+
// The document might be garbage because it was unreferenced by everything.
344+
// Make sure to mark it as garbage if it is...
345+
[self.garbageCollector addPotentialGarbageKey:key];
346+
}
345347

346348
// HACK: The only reason we allow omitting snapshot version is so we can synthesize remote events
347349
// when we get permission denied errors while trying to resolve the state of a locally cached

Firestore/Source/Remote/FSTDatastore.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@
1616

1717
#import <Foundation/Foundation.h>
1818

19+
#include <vector>
20+
1921
#import "Firestore/Source/Core/FSTTypes.h"
2022

2123
#include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h"
2224
#include "Firestore/core/src/firebase/firestore/core/database_info.h"
2325
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
26+
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
2427
#include "absl/strings/string_view.h"
2528

26-
@class FSTDocumentKey;
2729
@class FSTDispatchQueue;
2830
@class FSTMutation;
2931
@class FSTMutationResult;
@@ -88,7 +90,7 @@ NS_ASSUME_NONNULL_BEGIN
8890
token:(const absl::string_view)token;
8991

9092
/** Looks up a list of documents in datastore. */
91-
- (void)lookupDocuments:(NSArray<FSTDocumentKey *> *)keys
93+
- (void)lookupDocuments:(const std::vector<firebase::firestore::model::DocumentKey> &)keys
9294
completion:(FSTVoidMaybeDocumentArrayErrorBlock)completion;
9395

9496
/** Commits data to datastore. */

0 commit comments

Comments
 (0)