Skip to content

Port Precondition to C++ #1040

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 30 commits into from
Apr 13, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
96a64b3
port FieldMask to C++
zxu123 Mar 29, 2018
c6ee4b0
address changes
zxu123 Apr 3, 2018
64cfaac
address changes
zxu123 Apr 3, 2018
d27dc11
fix test
zxu123 Apr 3, 2018
235bc20
address change
zxu123 Apr 3, 2018
a97ef14
Port transform operations (FSTTransformOperation, FSTServerTimestampT…
zxu123 Apr 3, 2018
6d47fe4
address changes
zxu123 Apr 4, 2018
9ea9ab2
address changes
zxu123 Apr 4, 2018
f25eebc
address changes
zxu123 Apr 4, 2018
a579ba5
Merge branch 'master' into cpp/port_transform
zxu123 Apr 4, 2018
8eecd35
implement `FieldTransform` in C++
zxu123 Apr 4, 2018
b4c78da
port `FieldTransform`
zxu123 Apr 5, 2018
84e85d4
Merge branch 'master' into cpp/port_field_transform
zxu123 Apr 5, 2018
78a8bb9
make `fieldTransforms` shared inside `context`
zxu123 Apr 5, 2018
f7bcff7
Implement Precondition in C++ w/o test yet
zxu123 Apr 5, 2018
07d297c
add unit test for `Precondition`
zxu123 Apr 6, 2018
d4df4b3
port `Precondition`
zxu123 Apr 6, 2018
a87cb0a
address changes
zxu123 Apr 6, 2018
7936f8b
address changes
zxu123 Apr 9, 2018
46bd043
Merge branch 'master' into cpp/port_precondition
zxu123 Apr 9, 2018
0991762
Merge branch 'master' into cpp/port_field_transform
zxu123 Apr 9, 2018
53af7c9
Merge branch 'cpp/port_field_transform' into cpp/port_precondition
zxu123 Apr 9, 2018
6969212
fix bugs for integration test
zxu123 Apr 9, 2018
93cf65a
Merge branch 'master' into cpp/port_field_transform
zxu123 Apr 10, 2018
f15922a
address changes
zxu123 Apr 10, 2018
e6edf9a
fix lint
zxu123 Apr 10, 2018
2e78fd6
Merge branch 'cpp/port_field_transform' into cpp/port_precondition
zxu123 Apr 10, 2018
dfadc12
Merge branch 'master' into cpp/port_precondition
zxu123 Apr 10, 2018
ff7703b
address changes
zxu123 Apr 11, 2018
fe1f777
address changes
zxu123 Apr 12, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Firestore/Example/Tests/Integration/FSTDatastoreTests.mm
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,14 @@
#include "Firestore/core/src/firebase/firestore/auth/empty_credentials_provider.h"
#include "Firestore/core/src/firebase/firestore/core/database_info.h"
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
#include "Firestore/core/src/firebase/firestore/model/precondition.h"
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"

namespace util = firebase::firestore::util;
using firebase::firestore::auth::EmptyCredentialsProvider;
using firebase::firestore::core::DatabaseInfo;
using firebase::firestore::model::DatabaseId;
using firebase::firestore::model::Precondition;
using firebase::firestore::model::TargetId;

NS_ASSUME_NONNULL_BEGIN
Expand Down Expand Up @@ -238,7 +240,7 @@ - (FSTSetMutation *)setMutation {
initWithKey:[FSTDocumentKey keyWithPathString:@"rooms/eros"]
value:[[FSTObjectValue alloc]
initWithDictionary:@{@"name" : [FSTStringValue stringValue:@"Eros"]}]
precondition:[FSTPrecondition none]];
precondition:Precondition::None()];
}

@end
Expand Down
15 changes: 8 additions & 7 deletions Firestore/Example/Tests/Local/FSTLocalSerializerTests.mm
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,14 @@

#include "Firestore/core/src/firebase/firestore/model/database_id.h"
#include "Firestore/core/src/firebase/firestore/model/field_mask.h"
#include "Firestore/core/src/firebase/firestore/model/precondition.h"
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
#include "Firestore/core/test/firebase/firestore/testutil/testutil.h"

namespace testutil = firebase::firestore::testutil;
using firebase::firestore::model::DatabaseId;
using firebase::firestore::model::FieldMask;
using firebase::firestore::model::Precondition;

NS_ASSUME_NONNULL_BEGIN

Expand Down Expand Up @@ -78,13 +80,12 @@ - (void)setUp {

- (void)testEncodesMutationBatch {
FSTMutation *set = FSTTestSetMutation(@"foo/bar", @{ @"a" : @"b", @"num" : @1 });
FSTMutation *patch =
[[FSTPatchMutation alloc] initWithKey:FSTTestDocKey(@"bar/baz")
fieldMask:FieldMask{testutil::Field("a")}
value:FSTTestObjectValue(
@{ @"a" : @"b",
@"num" : @1 })
precondition:[FSTPrecondition preconditionWithExists:YES]];
FSTMutation *patch = [[FSTPatchMutation alloc] initWithKey:FSTTestDocKey(@"bar/baz")
fieldMask:FieldMask{testutil::Field("a")}
value:FSTTestObjectValue(
@{ @"a" : @"b",
@"num" : @1 })
precondition:Precondition::Exists(true)];
FSTMutation *del = FSTTestDeleteMutation(@"baz/quux");
FIRTimestamp *writeTime = [FIRTimestamp timestamp];
FSTMutationBatch *model = [[FSTMutationBatch alloc] initWithBatchID:42
Expand Down
4 changes: 3 additions & 1 deletion Firestore/Example/Tests/Model/FSTMutationTests.mm
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,13 @@

#include "Firestore/core/src/firebase/firestore/model/document_key.h"
#include "Firestore/core/src/firebase/firestore/model/field_mask.h"
#include "Firestore/core/src/firebase/firestore/model/precondition.h"
#include "Firestore/core/test/firebase/firestore/testutil/testutil.h"

namespace testutil = firebase::firestore::testutil;
using firebase::firestore::model::DocumentKey;
using firebase::firestore::model::FieldMask;
using firebase::firestore::model::Precondition;

@interface FSTMutationTests : XCTestCase
@end
Expand Down Expand Up @@ -74,7 +76,7 @@ - (void)testDeletesValuesFromTheFieldMask {
FSTMutation *patch = [[FSTPatchMutation alloc] initWithKey:key
fieldMask:{testutil::Field("foo.bar")}
value:[FSTObjectValue objectValue]
precondition:[FSTPrecondition none]];
precondition:Precondition::None()];
FSTMaybeDocument *patchedDoc =
[patch applyTo:baseDoc baseDocument:baseDoc localWriteTime:_timestamp];

Expand Down
14 changes: 8 additions & 6 deletions Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
#include "Firestore/core/src/firebase/firestore/model/field_mask.h"
#include "Firestore/core/src/firebase/firestore/model/field_transform.h"
#include "Firestore/core/src/firebase/firestore/model/precondition.h"
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
#include "Firestore/core/test/firebase/firestore/testutil/testutil.h"

Expand All @@ -58,6 +59,7 @@
using firebase::firestore::model::DatabaseId;
using firebase::firestore::model::FieldMask;
using firebase::firestore::model::FieldTransform;
using firebase::firestore::model::Precondition;

NS_ASSUME_NONNULL_BEGIN

Expand Down Expand Up @@ -377,12 +379,12 @@ - (void)testEncodesTransformMutation {
}

- (void)testEncodesSetMutationWithPrecondition {
FSTSetMutation *mutation = [[FSTSetMutation alloc]
initWithKey:FSTTestDocKey(@"foo/bar")
value:FSTTestObjectValue(
@{ @"a" : @"b",
@"num" : @1 })
precondition:[FSTPrecondition preconditionWithUpdateTime:FSTTestVersion(4)]];
FSTSetMutation *mutation =
[[FSTSetMutation alloc] initWithKey:FSTTestDocKey(@"foo/bar")
value:FSTTestObjectValue(
@{ @"a" : @"b",
@"num" : @1 })
precondition:Precondition::UpdateTime(testutil::Version(4))];
GCFSWrite *proto = [GCFSWrite message];
proto.update = [self.serializer encodedDocumentWithFields:mutation.value key:mutation.key];
proto.currentDocument.updateTime =
Expand Down
10 changes: 6 additions & 4 deletions Firestore/Example/Tests/Util/FSTHelpers.mm
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#include "Firestore/core/src/firebase/firestore/model/field_mask.h"
#include "Firestore/core/src/firebase/firestore/model/field_transform.h"
#include "Firestore/core/src/firebase/firestore/model/field_value.h"
#include "Firestore/core/src/firebase/firestore/model/precondition.h"
#include "Firestore/core/src/firebase/firestore/model/resource_path.h"
#include "Firestore/core/src/firebase/firestore/model/transform_operations.h"
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
Expand All @@ -62,6 +63,7 @@
using firebase::firestore::model::FieldPath;
using firebase::firestore::model::FieldTransform;
using firebase::firestore::model::FieldValue;
using firebase::firestore::model::Precondition;
using firebase::firestore::model::ResourcePath;
using firebase::firestore::model::ServerTimestampTransform;
using firebase::firestore::model::TransformOperation;
Expand Down Expand Up @@ -250,7 +252,7 @@ NSComparator FSTTestDocComparator(const absl::string_view fieldPath) {
FSTSetMutation *FSTTestSetMutation(NSString *path, NSDictionary<NSString *, id> *values) {
return [[FSTSetMutation alloc] initWithKey:FSTTestDocKey(path)
value:FSTTestObjectValue(values)
precondition:[FSTPrecondition none]];
precondition:Precondition::None()];
}

FSTPatchMutation *FSTTestPatchMutation(const absl::string_view path,
Expand All @@ -274,7 +276,7 @@ NSComparator FSTTestDocComparator(const absl::string_view fieldPath) {
return [[FSTPatchMutation alloc] initWithKey:key
fieldMask:mask
value:objectValue
precondition:[FSTPrecondition preconditionWithExists:YES]];
precondition:Precondition::Exists(true)];
}

// For now this only creates TransformMutations with server timestamps.
Expand All @@ -291,8 +293,8 @@ NSComparator FSTTestDocComparator(const absl::string_view fieldPath) {
}

FSTDeleteMutation *FSTTestDeleteMutation(NSString *path) {
return [[FSTDeleteMutation alloc] initWithKey:FSTTestDocKey(path)
precondition:[FSTPrecondition none]];
return
[[FSTDeleteMutation alloc] initWithKey:FSTTestDocKey(path) precondition:Precondition::None()];
}

FSTMaybeDocumentDictionary *FSTTestDocUpdates(NSArray<FSTMaybeDocument *> *docs) {
Expand Down
9 changes: 5 additions & 4 deletions Firestore/Source/API/FIRDocumentReference.mm
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,13 @@
#import "Firestore/Source/Util/FSTUsageValidation.h"

#include "Firestore/core/src/firebase/firestore/model/document_key.h"
#include "Firestore/core/src/firebase/firestore/model/precondition.h"
#include "Firestore/core/src/firebase/firestore/model/resource_path.h"
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"

namespace util = firebase::firestore::util;
using firebase::firestore::model::DocumentKey;
using firebase::firestore::model::Precondition;
using firebase::firestore::model::ResourcePath;

NS_ASSUME_NONNULL_BEGIN
Expand Down Expand Up @@ -168,7 +170,7 @@ - (void)setData:(NSDictionary<NSString *, id> *)documentData
? [self.firestore.dataConverter parsedMergeData:documentData]
: [self.firestore.dataConverter parsedSetData:documentData];
return [self.firestore.client
writeMutations:[parsed mutationsWithKey:self.key precondition:[FSTPrecondition none]]
writeMutations:[parsed mutationsWithKey:self.key precondition:Precondition::None()]
completion:completion];
}

Expand All @@ -180,8 +182,7 @@ - (void)updateData:(NSDictionary<id, id> *)fields
completion:(nullable void (^)(NSError *_Nullable error))completion {
FSTParsedUpdateData *parsed = [self.firestore.dataConverter parsedUpdateData:fields];
return [self.firestore.client
writeMutations:[parsed mutationsWithKey:self.key
precondition:[FSTPrecondition preconditionWithExists:YES]]
writeMutations:[parsed mutationsWithKey:self.key precondition:Precondition::Exists(true)]
completion:completion];
}

Expand All @@ -191,7 +192,7 @@ - (void)deleteDocument {

- (void)deleteDocumentWithCompletion:(nullable void (^)(NSError *_Nullable error))completion {
FSTDeleteMutation *mutation =
[[FSTDeleteMutation alloc] initWithKey:self.key precondition:[FSTPrecondition none]];
[[FSTDeleteMutation alloc] initWithKey:self.key precondition:Precondition::None()];
return [self.firestore.client writeMutations:@[ mutation ] completion:completion];
}

Expand Down
15 changes: 9 additions & 6 deletions Firestore/Source/API/FIRWriteBatch.mm
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
#import "Firestore/Source/Model/FSTMutation.h"
#import "Firestore/Source/Util/FSTUsageValidation.h"

#include "Firestore/core/src/firebase/firestore/model/precondition.h"

using firebase::firestore::model::Precondition;

NS_ASSUME_NONNULL_BEGIN

#pragma mark - FIRWriteBatch
Expand Down Expand Up @@ -69,8 +73,8 @@ - (FIRWriteBatch *)setData:(NSDictionary<NSString *, id> *)data
[self validateReference:document];
FSTParsedSetData *parsed = options.isMerge ? [self.firestore.dataConverter parsedMergeData:data]
: [self.firestore.dataConverter parsedSetData:data];
[self.mutations addObjectsFromArray:[parsed mutationsWithKey:document.key
precondition:[FSTPrecondition none]]];
[self.mutations
addObjectsFromArray:[parsed mutationsWithKey:document.key precondition:Precondition::None()]];
return self;
}

Expand All @@ -79,17 +83,16 @@ - (FIRWriteBatch *)updateData:(NSDictionary<id, id> *)fields
[self verifyNotCommitted];
[self validateReference:document];
FSTParsedUpdateData *parsed = [self.firestore.dataConverter parsedUpdateData:fields];
[self.mutations
addObjectsFromArray:[parsed mutationsWithKey:document.key
precondition:[FSTPrecondition preconditionWithExists:YES]]];
[self.mutations addObjectsFromArray:[parsed mutationsWithKey:document.key
precondition:Precondition::Exists(true)]];
return self;
}

- (FIRWriteBatch *)deleteDocument:(FIRDocumentReference *)document {
[self verifyNotCommitted];
[self validateReference:document];
[self.mutations addObject:[[FSTDeleteMutation alloc] initWithKey:document.key
precondition:[FSTPrecondition none]]];
precondition:Precondition::None()]];
return self;
}

Expand Down
8 changes: 5 additions & 3 deletions Firestore/Source/API/FSTUserDataConverter.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
#include "Firestore/core/src/firebase/firestore/model/field_mask.h"
#include "Firestore/core/src/firebase/firestore/model/field_transform.h"
#include "Firestore/core/src/firebase/firestore/model/precondition.h"

@class FIRSetOptions;
@class FSTObjectValue;
@class FSTFieldValue;
@class FSTMutation;
@class FSTPrecondition;
@class FSTSnapshotVersion;

NS_ASSUME_NONNULL_BEGIN
Expand Down Expand Up @@ -58,7 +58,8 @@ NS_ASSUME_NONNULL_BEGIN
* field transforms) using the specified document key and precondition.
*/
- (NSArray<FSTMutation *> *)mutationsWithKey:(const firebase::firestore::model::DocumentKey &)key
precondition:(FSTPrecondition *)precondition;
precondition:
(const firebase::firestore::model::Precondition &)precondition;

@end

Expand All @@ -83,7 +84,8 @@ NS_ASSUME_NONNULL_BEGIN
* field transforms) using the specified document key and precondition.
*/
- (NSArray<FSTMutation *> *)mutationsWithKey:(const firebase::firestore::model::DocumentKey &)key
precondition:(FSTPrecondition *)precondition;
precondition:
(const firebase::firestore::model::Precondition &)precondition;

@end

Expand Down
6 changes: 4 additions & 2 deletions Firestore/Source/API/FSTUserDataConverter.mm
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include "Firestore/core/src/firebase/firestore/model/field_mask.h"
#include "Firestore/core/src/firebase/firestore/model/field_path.h"
#include "Firestore/core/src/firebase/firestore/model/field_transform.h"
#include "Firestore/core/src/firebase/firestore/model/precondition.h"
#include "Firestore/core/src/firebase/firestore/model/transform_operations.h"
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
#include "absl/memory/memory.h"
Expand All @@ -48,6 +49,7 @@
using firebase::firestore::model::FieldMask;
using firebase::firestore::model::FieldPath;
using firebase::firestore::model::FieldTransform;
using firebase::firestore::model::Precondition;
using firebase::firestore::model::ServerTimestampTransform;
using firebase::firestore::model::TransformOperation;

Expand Down Expand Up @@ -91,7 +93,7 @@ - (instancetype)initWithData:(FSTObjectValue *)data
}

- (NSArray<FSTMutation *> *)mutationsWithKey:(const DocumentKey &)key
precondition:(FSTPrecondition *)precondition {
precondition:(const Precondition &)precondition {
NSMutableArray<FSTMutation *> *mutations = [NSMutableArray array];
if (self.isPatch) {
[mutations addObject:[[FSTPatchMutation alloc] initWithKey:key
Expand Down Expand Up @@ -132,7 +134,7 @@ - (instancetype)initWithData:(FSTObjectValue *)data
}

- (NSArray<FSTMutation *> *)mutationsWithKey:(const DocumentKey &)key
precondition:(FSTPrecondition *)precondition {
precondition:(const Precondition &)precondition {
NSMutableArray<FSTMutation *> *mutations = [NSMutableArray array];
[mutations addObject:[[FSTPatchMutation alloc] initWithKey:key
fieldMask:self.fieldMask
Expand Down
32 changes: 17 additions & 15 deletions Firestore/Source/Core/FSTTransaction.mm
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,10 @@
#import "Firestore/Source/Util/FSTUsageValidation.h"

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

using firebase::firestore::model::DocumentKey;
using firebase::firestore::model::Precondition;

NS_ASSUME_NONNULL_BEGIN

Expand Down Expand Up @@ -136,25 +138,26 @@ - (void)writeMutations:(NSArray<FSTMutation *> *)mutations {
* Returns version of this doc when it was read in this transaction as a precondition, or no
* precondition if it was not read.
*/
- (FSTPrecondition *)preconditionForDocumentKey:(const DocumentKey &)key {
- (Precondition)preconditionForDocumentKey:(const DocumentKey &)key {
const auto iter = _readVersions.find(key);
if (iter == _readVersions.end()) {
return [FSTPrecondition none];
return Precondition::None();
} else {
return [FSTPrecondition preconditionWithUpdateTime:iter->second];
return Precondition::UpdateTime(iter->second);
}
}

/**
* Returns the precondition for a document if the operation is an update, based on the provided
* UpdateOptions. Will return nil if an error occurred, in which case it sets the error parameter.
* UpdateOptions. Will return none precondition if an error occurred, in which case it sets the
* error parameter.
*/
- (nullable FSTPrecondition *)preconditionForUpdateWithDocumentKey:(const DocumentKey &)key
error:(NSError **)error {
- (Precondition)preconditionForUpdateWithDocumentKey:(const DocumentKey &)key
error:(NSError **)error {
const auto iter = _readVersions.find(key);
if (iter == _readVersions.end()) {
// Document was not read, so we just use the preconditions for an update.
return [FSTPrecondition preconditionWithExists:YES];
return Precondition::Exists(true);
}

FSTSnapshotVersion *version = iter->second;
Expand All @@ -169,10 +172,10 @@ - (nullable FSTPrecondition *)preconditionForUpdateWithDocumentKey:(const Docume
NSLocalizedDescriptionKey : @"Can't update a document that doesn't exist."
}];
}
return nil;
return Precondition::None();
} else {
// Document exists, just base precondition on document update time.
return [FSTPrecondition preconditionWithUpdateTime:version];
return Precondition::UpdateTime(version);
}
}

Expand All @@ -183,13 +186,12 @@ - (void)setData:(FSTParsedSetData *)data forDocument:(const DocumentKey &)key {

- (void)updateData:(FSTParsedUpdateData *)data forDocument:(const DocumentKey &)key {
NSError *error = nil;
FSTPrecondition *_Nullable precondition =
[self preconditionForUpdateWithDocumentKey:key error:&error];
if (precondition) {
[self writeMutations:[data mutationsWithKey:key precondition:precondition]];
} else {
const Precondition precondition = [self preconditionForUpdateWithDocumentKey:key error:&error];
if (precondition.IsNone()) {
FSTAssert(error, @"Got nil precondition, but error was not set");
self.lastWriteError = error;
} else {
[self writeMutations:[data mutationsWithKey:key precondition:precondition]];
}
}

Expand All @@ -198,7 +200,7 @@ - (void)deleteDocument:(const DocumentKey &)key {
initWithKey:key
precondition:[self preconditionForDocumentKey:key]] ]];
// Since the delete will be applied before all following writes, we need to ensure that the
// precondition for the next write will be exists: false.
// precondition for the next write will be exists without timestamp.
_readVersions[key] = [FSTSnapshotVersion noVersion];
}

Expand Down
Loading