Skip to content

Commit a390058

Browse files
wilhuffCorrob
authored andcommitted
Port FSTDocumentSet to C++ (#2608)
* Replace FSTDocumentSet's guts with immutable::SortedSet. * Port FSTDocumentSet to C++ DocumentSet. * Replace implementation of FSTDocumentSet with C++ DocumentSet * Update all usages of FSTDocumentSet * Remove FSTDocumentSet * Add Objective-C++ guard * Use absl::c_equal instead of hand-rolling it. * Split SortedContainer out of SortedMapBase ... and use it * Fix NSNotFound -> npos * Remove = default constructors that aren't true. These are implicitly deleted because DocumentSet is a member and isn't default constructible. * Fix usage of FSTQuery.limit
1 parent db1bc95 commit a390058

38 files changed

+613
-556
lines changed

Firestore/Example/Tests/API/FIRQuerySnapshotTests.mm

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,16 @@
2929
#import "Firestore/Source/API/FIRQuerySnapshot+Internal.h"
3030
#import "Firestore/Source/API/FIRSnapshotMetadata+Internal.h"
3131
#import "Firestore/Source/Model/FSTDocument.h"
32-
#import "Firestore/Source/Model/FSTDocumentSet.h"
3332

3433
#include "Firestore/core/src/firebase/firestore/core/view_snapshot.h"
34+
#include "Firestore/core/src/firebase/firestore/model/document_set.h"
3535
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
3636

3737
namespace util = firebase::firestore::util;
3838
using firebase::firestore::core::DocumentViewChange;
3939
using firebase::firestore::core::ViewSnapshot;
4040
using firebase::firestore::model::DocumentKeySet;
41+
using firebase::firestore::model::DocumentSet;
4142

4243
NS_ASSUME_NONNULL_BEGIN
4344

@@ -87,8 +88,8 @@ - (void)testIncludeMetadataChanges {
8788
FSTDocument *doc2Old = FSTTestDoc("foo/baz", 1, @{@"a" : @"b"}, FSTDocumentStateSynced);
8889
FSTDocument *doc2New = FSTTestDoc("foo/baz", 1, @{@"a" : @"c"}, FSTDocumentStateSynced);
8990

90-
FSTDocumentSet *oldDocuments = FSTTestDocSet(FSTDocumentComparatorByKey, @[ doc1Old, doc2Old ]);
91-
FSTDocumentSet *newDocuments = FSTTestDocSet(FSTDocumentComparatorByKey, @[ doc2New, doc2New ]);
91+
DocumentSet oldDocuments = FSTTestDocSet(FSTDocumentComparatorByKey, @[ doc1Old, doc2Old ]);
92+
DocumentSet newDocuments = FSTTestDocSet(FSTDocumentComparatorByKey, @[ doc2New, doc2New ]);
9293
std::vector<DocumentViewChange> documentChanges{
9394
DocumentViewChange{doc1New, DocumentViewChange::Type::kMetadata},
9495
DocumentViewChange{doc2New, DocumentViewChange::Type::kModified},

Firestore/Example/Tests/API/FSTAPIHelpers.mm

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@
3232
#import "Firestore/Source/API/FIRSnapshotMetadata+Internal.h"
3333
#import "Firestore/Source/Core/FSTQuery.h"
3434
#import "Firestore/Source/Model/FSTDocument.h"
35-
#import "Firestore/Source/Model/FSTDocumentSet.h"
3635

3736
#include "Firestore/core/src/firebase/firestore/core/view_snapshot.h"
37+
#include "Firestore/core/src/firebase/firestore/model/document_set.h"
3838
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
3939
#include "Firestore/core/test/firebase/firestore/testutil/testutil.h"
4040

@@ -43,6 +43,7 @@
4343
using firebase::firestore::core::DocumentViewChange;
4444
using firebase::firestore::core::ViewSnapshot;
4545
using firebase::firestore::model::DocumentKeySet;
46+
using firebase::firestore::model::DocumentSet;
4647

4748
NS_ASSUME_NONNULL_BEGIN
4849

@@ -98,26 +99,24 @@
9899
bool hasPendingWrites,
99100
bool fromCache) {
100101
SnapshotMetadata metadata(hasPendingWrites, fromCache);
101-
FSTDocumentSet *oldDocuments = FSTTestDocSet(FSTDocumentComparatorByKey, @[]);
102+
DocumentSet oldDocuments = FSTTestDocSet(FSTDocumentComparatorByKey, @[]);
102103
DocumentKeySet mutatedKeys;
103104
for (NSString *key in oldDocs) {
104-
oldDocuments = [oldDocuments
105-
documentSetByAddingDocument:FSTTestDoc(util::StringFormat("%s/%s", path, key), 1,
106-
oldDocs[key],
107-
hasPendingWrites ? FSTDocumentStateLocalMutations
108-
: FSTDocumentStateSynced)];
105+
oldDocuments = oldDocuments.insert(
106+
FSTTestDoc(util::StringFormat("%s/%s", path, key), 1, oldDocs[key],
107+
hasPendingWrites ? FSTDocumentStateLocalMutations : FSTDocumentStateSynced));
109108
if (hasPendingWrites) {
110109
const std::string documentKey = util::StringFormat("%s/%s", path, key);
111110
mutatedKeys = mutatedKeys.insert(testutil::Key(documentKey));
112111
}
113112
}
114-
FSTDocumentSet *newDocuments = oldDocuments;
113+
DocumentSet newDocuments = oldDocuments;
115114
std::vector<DocumentViewChange> documentChanges;
116115
for (NSString *key in docsToAdd) {
117116
FSTDocument *docToAdd =
118117
FSTTestDoc(util::StringFormat("%s/%s", path, key), 1, docsToAdd[key],
119118
hasPendingWrites ? FSTDocumentStateLocalMutations : FSTDocumentStateSynced);
120-
newDocuments = [newDocuments documentSetByAddingDocument:docToAdd];
119+
newDocuments = newDocuments.insert(docToAdd);
121120
documentChanges.emplace_back(docToAdd, DocumentViewChange::Type::kAdded);
122121
if (hasPendingWrites) {
123122
const std::string documentKey = util::StringFormat("%s/%s", path, key);

Firestore/Example/Tests/Core/FSTEventManagerTests.mm

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,19 @@
2323

2424
#import "Firestore/Source/Core/FSTQuery.h"
2525
#import "Firestore/Source/Core/FSTSyncEngine.h"
26-
#import "Firestore/Source/Model/FSTDocumentSet.h"
2726

2827
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
2928

3029
#include "Firestore/core/src/firebase/firestore/core/view_snapshot.h"
3130
#include "Firestore/core/src/firebase/firestore/model/document_key_set.h"
31+
#include "Firestore/core/src/firebase/firestore/model/document_set.h"
3232
#include "Firestore/core/src/firebase/firestore/model/types.h"
3333
#include "Firestore/core/src/firebase/firestore/util/statusor.h"
3434

3535
using firebase::firestore::core::ViewSnapshot;
3636
using firebase::firestore::core::ViewSnapshotHandler;
3737
using firebase::firestore::model::DocumentKeySet;
38+
using firebase::firestore::model::DocumentSet;
3839
using firebase::firestore::model::OnlineState;
3940
using firebase::firestore::util::StatusOr;
4041

@@ -106,7 +107,7 @@ - (FSTQueryListener *)queryListenerForQuery:(FSTQuery *)query
106107
}
107108

108109
- (ViewSnapshot)makeEmptyViewSnapshotWithQuery:(FSTQuery *)query {
109-
FSTDocumentSet *emptyDocs = [FSTDocumentSet documentSetWithComparator:query.comparator];
110+
DocumentSet emptyDocs{query.comparator};
110111
// sync_state_changed has to be `true` to prevent an assertion about a meaningless view snapshot.
111112
return ViewSnapshot{
112113
query, emptyDocs, emptyDocs, {}, DocumentKeySet{}, false, /*sync_state_changed=*/true, false};

Firestore/Example/Tests/Core/FSTQueryListenerTests.mm

Lines changed: 42 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@
2424
#import "Firestore/Source/Core/FSTQuery.h"
2525
#import "Firestore/Source/Core/FSTView.h"
2626
#import "Firestore/Source/Model/FSTDocument.h"
27-
#import "Firestore/Source/Model/FSTDocumentSet.h"
2827
#import "Firestore/Source/Util/FSTAsyncQueryListener.h"
2928

3029
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
3130

3231
#include "Firestore/core/include/firebase/firestore/firestore_errors.h"
3332
#include "Firestore/core/src/firebase/firestore/core/view_snapshot.h"
33+
#include "Firestore/core/src/firebase/firestore/model/document_set.h"
3434
#include "Firestore/core/src/firebase/firestore/model/types.h"
3535
#include "Firestore/core/src/firebase/firestore/remote/remote_event.h"
3636
#include "Firestore/core/src/firebase/firestore/util/delayed_constructor.h"
@@ -44,6 +44,7 @@
4444
using firebase::firestore::core::ViewSnapshot;
4545
using firebase::firestore::core::ViewSnapshotHandler;
4646
using firebase::firestore::model::DocumentKeySet;
47+
using firebase::firestore::model::DocumentSet;
4748
using firebase::firestore::model::OnlineState;
4849
using firebase::firestore::remote::TargetChange;
4950
using firebase::firestore::util::DelayedConstructor;
@@ -119,15 +120,14 @@ - (void)testRaisesCollectionEvents {
119120
XC_ASSERT_THAT(accum[0].document_changes(), ElementsAre(change1, change2));
120121
XC_ASSERT_THAT(accum[1].document_changes(), ElementsAre(change3));
121122

122-
ViewSnapshot expectedSnap2{
123-
snap2.query(),
124-
snap2.documents(),
125-
/*old_documents=*/[FSTDocumentSet documentSetWithComparator : snap2.query().comparator],
126-
/*document_changes=*/{ change1, change4 },
127-
snap2.mutated_keys(),
128-
snap2.from_cache(),
129-
/*sync_state_changed=*/true,
130-
/*excludes_metadata_changes=*/true};
123+
ViewSnapshot expectedSnap2{snap2.query(),
124+
snap2.documents(),
125+
/*old_documents=*/DocumentSet{snap2.query().comparator},
126+
/*document_changes=*/{change1, change4},
127+
snap2.mutated_keys(),
128+
snap2.from_cache(),
129+
/*sync_state_changed=*/true,
130+
/*excludes_metadata_changes=*/true};
131131
XC_ASSERT_THAT(otherAccum, ElementsAre(expectedSnap2));
132132
}
133133

@@ -395,15 +395,14 @@ - (void)testWillWaitForSyncIfOnline {
395395

396396
DocumentViewChange change1{doc1, DocumentViewChange::Type::kAdded};
397397
DocumentViewChange change2{doc2, DocumentViewChange::Type::kAdded};
398-
ViewSnapshot expectedSnap{
399-
snap3.query(),
400-
snap3.documents(),
401-
/*old_documents=*/[FSTDocumentSet documentSetWithComparator : snap3.query().comparator],
402-
/*document_changes=*/{ change1, change2 },
403-
snap3.mutated_keys(),
404-
/*from_cache=*/false,
405-
/*sync_state_changed=*/true,
406-
/*excludes_metadata_changes=*/true};
398+
ViewSnapshot expectedSnap{snap3.query(),
399+
snap3.documents(),
400+
/*old_documents=*/DocumentSet{snap3.query().comparator},
401+
/*document_changes=*/{change1, change2},
402+
snap3.mutated_keys(),
403+
/*from_cache=*/false,
404+
/*sync_state_changed=*/true,
405+
/*excludes_metadata_changes=*/true};
407406
XC_ASSERT_THAT(events, ElementsAre(expectedSnap));
408407
}
409408

@@ -433,15 +432,14 @@ - (void)testWillRaiseInitialEventWhenGoingOffline {
433432

434433
DocumentViewChange change1{doc1, DocumentViewChange::Type::kAdded};
435434
DocumentViewChange change2{doc2, DocumentViewChange::Type::kAdded};
436-
ViewSnapshot expectedSnap1{
437-
query,
438-
/*documents=*/snap1.documents(),
439-
/*old_documents=*/[FSTDocumentSet documentSetWithComparator : snap1.query().comparator],
440-
/*document_changes=*/{ change1 },
441-
snap1.mutated_keys(),
442-
/*from_cache=*/true,
443-
/*sync_state_changed=*/true,
444-
/*excludes_metadata_changes=*/true};
435+
ViewSnapshot expectedSnap1{query,
436+
/*documents=*/snap1.documents(),
437+
/*old_documents=*/DocumentSet{snap1.query().comparator},
438+
/*document_changes=*/{change1},
439+
snap1.mutated_keys(),
440+
/*from_cache=*/true,
441+
/*sync_state_changed=*/true,
442+
/*excludes_metadata_changes=*/true};
445443

446444
ViewSnapshot expectedSnap2{query,
447445
/*documents=*/snap2.documents(),
@@ -469,15 +467,14 @@ - (void)testWillRaiseInitialEventWhenGoingOfflineAndThereAreNoDocs {
469467
[listener queryDidChangeViewSnapshot:snap1]; // no event
470468
[listener applyChangedOnlineState:OnlineState::Offline]; // event
471469

472-
ViewSnapshot expectedSnap{
473-
query,
474-
/*documents=*/snap1.documents(),
475-
/*old_documents=*/[FSTDocumentSet documentSetWithComparator : snap1.query().comparator],
476-
/*document_changes=*/{},
477-
snap1.mutated_keys(),
478-
/*from_cache=*/true,
479-
/*sync_state_changed=*/true,
480-
/*excludes_metadata_changes=*/true};
470+
ViewSnapshot expectedSnap{query,
471+
/*documents=*/snap1.documents(),
472+
/*old_documents=*/DocumentSet{snap1.query().comparator},
473+
/*document_changes=*/{},
474+
snap1.mutated_keys(),
475+
/*from_cache=*/true,
476+
/*sync_state_changed=*/true,
477+
/*excludes_metadata_changes=*/true};
481478
XC_ASSERT_THAT(events, ElementsAre(expectedSnap));
482479
}
483480

@@ -495,15 +492,14 @@ - (void)testWillRaiseInitialEventWhenStartingOfflineAndThereAreNoDocs {
495492
[listener applyChangedOnlineState:OnlineState::Offline]; // no event
496493
[listener queryDidChangeViewSnapshot:snap1]; // event
497494

498-
ViewSnapshot expectedSnap{
499-
query,
500-
/*documents=*/snap1.documents(),
501-
/*old_documents=*/[FSTDocumentSet documentSetWithComparator : snap1.query().comparator],
502-
/*document_changes=*/{},
503-
snap1.mutated_keys(),
504-
/*from_cache=*/true,
505-
/*sync_state_changed=*/true,
506-
/*excludes_metadata_changes=*/true};
495+
ViewSnapshot expectedSnap{query,
496+
/*documents=*/snap1.documents(),
497+
/*old_documents=*/DocumentSet{snap1.query().comparator},
498+
/*document_changes=*/{},
499+
snap1.mutated_keys(),
500+
/*from_cache=*/true,
501+
/*sync_state_changed=*/true,
502+
/*excludes_metadata_changes=*/true};
507503
XC_ASSERT_THAT(events, ElementsAre(expectedSnap));
508504
}
509505

Firestore/Example/Tests/Core/FSTViewSnapshotTest.mm

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,17 @@
2020

2121
#import "Firestore/Source/Core/FSTQuery.h"
2222
#import "Firestore/Source/Model/FSTDocument.h"
23-
#import "Firestore/Source/Model/FSTDocumentSet.h"
2423

2524
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
2625

2726
#include "Firestore/core/src/firebase/firestore/core/view_snapshot.h"
27+
#include "Firestore/core/src/firebase/firestore/model/document_set.h"
2828

2929
using firebase::firestore::core::DocumentViewChange;
3030
using firebase::firestore::core::DocumentViewChangeSet;
3131
using firebase::firestore::core::ViewSnapshot;
3232
using firebase::firestore::model::DocumentKeySet;
33+
using firebase::firestore::model::DocumentSet;
3334

3435
NS_ASSUME_NONNULL_BEGIN
3536

@@ -100,10 +101,9 @@ - (void)testTrack {
100101

101102
- (void)testViewSnapshotConstructor {
102103
FSTQuery *query = FSTTestQuery("a");
103-
FSTDocumentSet *documents = [FSTDocumentSet documentSetWithComparator:FSTDocumentComparatorByKey];
104-
FSTDocumentSet *oldDocuments = documents;
105-
documents =
106-
[documents documentSetByAddingDocument:FSTTestDoc("c/a", 1, @{}, FSTDocumentStateSynced)];
104+
DocumentSet documents = DocumentSet{FSTDocumentComparatorByKey};
105+
DocumentSet oldDocuments = documents;
106+
documents = documents.insert(FSTTestDoc("c/a", 1, @{}, FSTDocumentStateSynced));
107107
std::vector<DocumentViewChange> documentChanges{DocumentViewChange{
108108
FSTTestDoc("c/a", 1, @{}, FSTDocumentStateSynced), DocumentViewChange::Type::kAdded}};
109109

0 commit comments

Comments
 (0)