diff options
Diffstat (limited to 'Firestore/Source')
-rw-r--r-- | Firestore/Source/API/FIRDocumentReference.mm | 9 | ||||
-rw-r--r-- | Firestore/Source/API/FIRWriteBatch.mm | 15 | ||||
-rw-r--r-- | Firestore/Source/API/FSTUserDataConverter.h | 8 | ||||
-rw-r--r-- | Firestore/Source/API/FSTUserDataConverter.mm | 6 | ||||
-rw-r--r-- | Firestore/Source/Core/FSTTransaction.mm | 32 | ||||
-rw-r--r-- | Firestore/Source/Model/FSTMutation.h | 64 | ||||
-rw-r--r-- | Firestore/Source/Model/FSTMutation.mm | 154 | ||||
-rw-r--r-- | Firestore/Source/Remote/FSTSerializerBeta.mm | 37 |
8 files changed, 102 insertions, 223 deletions
diff --git a/Firestore/Source/API/FIRDocumentReference.mm b/Firestore/Source/API/FIRDocumentReference.mm index 67e401d..9fb4541 100644 --- a/Firestore/Source/API/FIRDocumentReference.mm +++ b/Firestore/Source/API/FIRDocumentReference.mm @@ -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 @@ -168,7 +170,7 @@ NS_ASSUME_NONNULL_BEGIN ? [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]; } @@ -180,8 +182,7 @@ NS_ASSUME_NONNULL_BEGIN 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]; } @@ -191,7 +192,7 @@ NS_ASSUME_NONNULL_BEGIN - (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]; } diff --git a/Firestore/Source/API/FIRWriteBatch.mm b/Firestore/Source/API/FIRWriteBatch.mm index b1cfa09..df6e5e0 100644 --- a/Firestore/Source/API/FIRWriteBatch.mm +++ b/Firestore/Source/API/FIRWriteBatch.mm @@ -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 @@ -69,8 +73,8 @@ NS_ASSUME_NONNULL_BEGIN [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; } @@ -79,9 +83,8 @@ NS_ASSUME_NONNULL_BEGIN [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; } @@ -89,7 +92,7 @@ NS_ASSUME_NONNULL_BEGIN [self verifyNotCommitted]; [self validateReference:document]; [self.mutations addObject:[[FSTDeleteMutation alloc] initWithKey:document.key - precondition:[FSTPrecondition none]]]; + precondition:Precondition::None()]]; return self; } diff --git a/Firestore/Source/API/FSTUserDataConverter.h b/Firestore/Source/API/FSTUserDataConverter.h index a2f947a..ea20b3e 100644 --- a/Firestore/Source/API/FSTUserDataConverter.h +++ b/Firestore/Source/API/FSTUserDataConverter.h @@ -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 @@ -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 @@ -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 diff --git a/Firestore/Source/API/FSTUserDataConverter.mm b/Firestore/Source/API/FSTUserDataConverter.mm index 6320e83..dff9235 100644 --- a/Firestore/Source/API/FSTUserDataConverter.mm +++ b/Firestore/Source/API/FSTUserDataConverter.mm @@ -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" @@ -48,6 +49,7 @@ using firebase::firestore::model::DocumentKey; 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; @@ -91,7 +93,7 @@ static NSString *const RESERVED_FIELD_DESIGNATOR = @"__"; } - (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 @@ -132,7 +134,7 @@ static NSString *const RESERVED_FIELD_DESIGNATOR = @"__"; } - (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 diff --git a/Firestore/Source/Core/FSTTransaction.mm b/Firestore/Source/Core/FSTTransaction.mm index 71c1f35..681f9ca 100644 --- a/Firestore/Source/Core/FSTTransaction.mm +++ b/Firestore/Source/Core/FSTTransaction.mm @@ -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 @@ -136,25 +138,26 @@ NS_ASSUME_NONNULL_BEGIN * 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; @@ -169,10 +172,10 @@ NS_ASSUME_NONNULL_BEGIN 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); } } @@ -183,13 +186,12 @@ NS_ASSUME_NONNULL_BEGIN - (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]]; } } @@ -198,7 +200,7 @@ NS_ASSUME_NONNULL_BEGIN 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]; } diff --git a/Firestore/Source/Model/FSTMutation.h b/Firestore/Source/Model/FSTMutation.h index 38c35bf..7261f30 100644 --- a/Firestore/Source/Model/FSTMutation.h +++ b/Firestore/Source/Model/FSTMutation.h @@ -23,6 +23,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" @class FSTDocument; @@ -34,49 +35,6 @@ NS_ASSUME_NONNULL_BEGIN -#pragma mark - FSTPrecondition - -typedef NS_ENUM(NSUInteger, FSTPreconditionExists) { - FSTPreconditionExistsNotSet, - FSTPreconditionExistsYes, - FSTPreconditionExistsNo, -}; - -/** - * Encodes a precondition for a mutation. This follows the model that the backend accepts with the - * special case of an explicit "empty" precondition (meaning no precondition). - */ -@interface FSTPrecondition : NSObject - -/** Creates a new FSTPrecondition with an exists flag. */ -+ (FSTPrecondition *)preconditionWithExists:(BOOL)exists; - -/** Creates a new FSTPrecondition based on a time the document exists at. */ -+ (FSTPrecondition *)preconditionWithUpdateTime:(FSTSnapshotVersion *)updateTime; - -/** Returns a precondition representing no precondition. */ -+ (FSTPrecondition *)none; - -/** - * Returns true if the preconditions is valid for the given document (or null if no document is - * available). - */ -- (BOOL)isValidForDocument:(FSTMaybeDocument *_Nullable)maybeDoc; - -/** Returns whether this Precondition represents no precondition. */ -- (BOOL)isNone; - -/** If set, preconditions a mutation based on the last updateTime. */ -@property(nonatomic, strong, readonly, nullable) FSTSnapshotVersion *updateTime; - -/** - * If set, preconditions a mutation based on whether the document exists. - * Uses FSTPreconditionExistsNotSet to mark as unset. - */ -@property(nonatomic, assign, readonly) FSTPreconditionExists exists; - -@end - #pragma mark - FSTMutationResult @interface FSTMutationResult : NSObject @@ -115,7 +73,8 @@ typedef NS_ENUM(NSUInteger, FSTPreconditionExists) { - (id)init NS_UNAVAILABLE; - (instancetype)initWithKey:(firebase::firestore::model::DocumentKey)key - precondition:(FSTPrecondition *)precondition NS_DESIGNATED_INITIALIZER; + precondition:(firebase::firestore::model::Precondition)precondition + NS_DESIGNATED_INITIALIZER; /** * Applies this mutation to the given FSTDocument, FSTDeletedDocument or nil, if we don't have @@ -176,8 +135,7 @@ typedef NS_ENUM(NSUInteger, FSTPreconditionExists) { - (const firebase::firestore::model::DocumentKey &)key; -/** The precondition for this mutation. */ -@property(nonatomic, strong, readonly) FSTPrecondition *precondition; +- (const firebase::firestore::model::Precondition &)precondition; @end @@ -190,7 +148,7 @@ typedef NS_ENUM(NSUInteger, FSTPreconditionExists) { @interface FSTSetMutation : FSTMutation - (instancetype)initWithKey:(firebase::firestore::model::DocumentKey)key - precondition:(FSTPrecondition *)precondition NS_UNAVAILABLE; + precondition:(firebase::firestore::model::Precondition)precondition NS_UNAVAILABLE; /** * Initializes the set mutation. @@ -202,7 +160,8 @@ typedef NS_ENUM(NSUInteger, FSTPreconditionExists) { */ - (instancetype)initWithKey:(firebase::firestore::model::DocumentKey)key value:(FSTObjectValue *)value - precondition:(FSTPrecondition *)precondition NS_DESIGNATED_INITIALIZER; + precondition:(firebase::firestore::model::Precondition)precondition + NS_DESIGNATED_INITIALIZER; /** The object value to use when setting the document. */ @property(nonatomic, strong, readonly) FSTObjectValue *value; @@ -221,9 +180,9 @@ typedef NS_ENUM(NSUInteger, FSTPreconditionExists) { */ @interface FSTPatchMutation : FSTMutation -/** Returns the precondition for the given FSTPrecondition. */ +/** Returns the precondition for the given Precondition. */ - (instancetype)initWithKey:(firebase::firestore::model::DocumentKey)key - precondition:(FSTPrecondition *)precondition NS_UNAVAILABLE; + precondition:(firebase::firestore::model::Precondition)precondition NS_UNAVAILABLE; /** * Initializes a new patch mutation with an explicit FieldMask and FSTObjectValue representing @@ -239,7 +198,8 @@ typedef NS_ENUM(NSUInteger, FSTPreconditionExists) { - (instancetype)initWithKey:(firebase::firestore::model::DocumentKey)key fieldMask:(firebase::firestore::model::FieldMask)fieldMask value:(FSTObjectValue *)value - precondition:(FSTPrecondition *)precondition NS_DESIGNATED_INITIALIZER; + precondition:(firebase::firestore::model::Precondition)precondition + NS_DESIGNATED_INITIALIZER; /** * A mask to apply to |value|, where only fields that are in both the fieldMask and the value @@ -266,7 +226,7 @@ typedef NS_ENUM(NSUInteger, FSTPreconditionExists) { @interface FSTTransformMutation : FSTMutation - (instancetype)initWithKey:(firebase::firestore::model::DocumentKey)key - precondition:(FSTPrecondition *)precondition NS_UNAVAILABLE; + precondition:(firebase::firestore::model::Precondition)precondition NS_UNAVAILABLE; /** * Initializes a new transform mutation with the specified field transforms. diff --git a/Firestore/Source/Model/FSTMutation.mm b/Firestore/Source/Model/FSTMutation.mm index dd649a0..99d2e51 100644 --- a/Firestore/Source/Model/FSTMutation.mm +++ b/Firestore/Source/Model/FSTMutation.mm @@ -33,115 +33,19 @@ #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" using firebase::firestore::model::DocumentKey; 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; NS_ASSUME_NONNULL_BEGIN -#pragma mark - FSTPrecondition - -@implementation FSTPrecondition - -+ (FSTPrecondition *)preconditionWithExists:(BOOL)exists { - FSTPreconditionExists existsEnum = exists ? FSTPreconditionExistsYes : FSTPreconditionExistsNo; - return [[FSTPrecondition alloc] initWithUpdateTime:nil exists:existsEnum]; -} - -+ (FSTPrecondition *)preconditionWithUpdateTime:(FSTSnapshotVersion *)updateTime { - return [[FSTPrecondition alloc] initWithUpdateTime:updateTime exists:FSTPreconditionExistsNotSet]; -} - -+ (FSTPrecondition *)none { - static dispatch_once_t onceToken; - static FSTPrecondition *noPrecondition; - dispatch_once(&onceToken, ^{ - noPrecondition = - [[FSTPrecondition alloc] initWithUpdateTime:nil exists:FSTPreconditionExistsNotSet]; - }); - return noPrecondition; -} - -- (instancetype)initWithUpdateTime:(FSTSnapshotVersion *_Nullable)updateTime - exists:(FSTPreconditionExists)exists { - if (self = [super init]) { - _updateTime = updateTime; - _exists = exists; - } - return self; -} - -- (BOOL)isValidForDocument:(FSTMaybeDocument *_Nullable)maybeDoc { - if (self.updateTime) { - return - [maybeDoc isKindOfClass:[FSTDocument class]] && [maybeDoc.version isEqual:self.updateTime]; - } else if (self.exists != FSTPreconditionExistsNotSet) { - if (self.exists == FSTPreconditionExistsYes) { - return [maybeDoc isKindOfClass:[FSTDocument class]]; - } else { - FSTAssert(self.exists == FSTPreconditionExistsNo, @"Invalid precondition"); - return maybeDoc == nil || [maybeDoc isKindOfClass:[FSTDeletedDocument class]]; - } - } else { - FSTAssert(self.isNone, @"Precondition should be empty"); - return YES; - } -} - -- (BOOL)isNone { - return self.updateTime == nil && self.exists == FSTPreconditionExistsNotSet; -} - -- (BOOL)isEqual:(id)other { - if (self == other) { - return YES; - } - - if (![other isKindOfClass:[FSTPrecondition class]]) { - return NO; - } - - FSTPrecondition *otherPrecondition = (FSTPrecondition *)other; - // Compare references to cover nil equality - return (self.updateTime == otherPrecondition.updateTime || - [self.updateTime isEqual:otherPrecondition.updateTime]) && - self.exists == otherPrecondition.exists; -} - -- (NSUInteger)hash { - NSUInteger hash = [self.updateTime hash]; - hash = hash * 31 + self.exists; - return hash; -} - -- (NSString *)description { - if (self.isNone) { - return @"<FSTPrecondition <none>>"; - } else { - NSString *existsString; - switch (self.exists) { - case FSTPreconditionExistsYes: - existsString = @"yes"; - break; - case FSTPreconditionExistsNo: - existsString = @"no"; - break; - default: - existsString = @"<not-set>"; - break; - } - return [NSString stringWithFormat:@"<FSTPrecondition updateTime=%@ exists=%@>", self.updateTime, - existsString]; - } -} - -@end - #pragma mark - FSTMutationResult @implementation FSTMutationResult @@ -161,12 +65,13 @@ NS_ASSUME_NONNULL_BEGIN @implementation FSTMutation { DocumentKey _key; + Precondition _precondition; } -- (instancetype)initWithKey:(DocumentKey)key precondition:(FSTPrecondition *)precondition { +- (instancetype)initWithKey:(DocumentKey)key precondition:(Precondition)precondition { if (self = [super init]) { _key = std::move(key); - _precondition = precondition; + _precondition = std::move(precondition); } return self; } @@ -189,6 +94,10 @@ NS_ASSUME_NONNULL_BEGIN return _key; } +- (const firebase::firestore::model::Precondition &)precondition { + return _precondition; +} + @end #pragma mark - FSTSetMutation @@ -197,8 +106,8 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithKey:(DocumentKey)key value:(FSTObjectValue *)value - precondition:(FSTPrecondition *)precondition { - if (self = [super initWithKey:std::move(key) precondition:precondition]) { + precondition:(Precondition)precondition { + if (self = [super initWithKey:std::move(key) precondition:std::move(precondition)]) { _value = value; } return self; @@ -206,7 +115,8 @@ NS_ASSUME_NONNULL_BEGIN - (NSString *)description { return [NSString stringWithFormat:@"<FSTSetMutation key=%s value=%@ precondition=%@>", - self.key.ToString().c_str(), self.value, self.precondition]; + self.key.ToString().c_str(), self.value, + self.precondition.description()]; } - (BOOL)isEqual:(id)other { @@ -219,12 +129,12 @@ NS_ASSUME_NONNULL_BEGIN FSTSetMutation *otherMutation = (FSTSetMutation *)other; return [self.key isEqual:otherMutation.key] && [self.value isEqual:otherMutation.value] && - [self.precondition isEqual:otherMutation.precondition]; + self.precondition == otherMutation.precondition; } - (NSUInteger)hash { NSUInteger result = [self.key hash]; - result = 31 * result + [self.precondition hash]; + result = 31 * result + self.precondition.Hash(); result = 31 * result + [self.value hash]; return result; } @@ -237,7 +147,7 @@ NS_ASSUME_NONNULL_BEGIN FSTAssert(!mutationResult.transformResults, @"Transform results received by FSTSetMutation."); } - if (![self.precondition isValidForDocument:maybeDoc]) { + if (!self.precondition.IsValidFor(maybeDoc)) { return maybeDoc; } @@ -271,8 +181,8 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithKey:(DocumentKey)key fieldMask:(FieldMask)fieldMask value:(FSTObjectValue *)value - precondition:(FSTPrecondition *)precondition { - self = [super initWithKey:std::move(key) precondition:precondition]; + precondition:(Precondition)precondition { + self = [super initWithKey:std::move(key) precondition:std::move(precondition)]; if (self) { _fieldMask = std::move(fieldMask); _value = value; @@ -295,12 +205,12 @@ NS_ASSUME_NONNULL_BEGIN FSTPatchMutation *otherMutation = (FSTPatchMutation *)other; return [self.key isEqual:otherMutation.key] && self.fieldMask == otherMutation.fieldMask && [self.value isEqual:otherMutation.value] && - [self.precondition isEqual:otherMutation.precondition]; + self.precondition == otherMutation.precondition; } - (NSUInteger)hash { NSUInteger result = [self.key hash]; - result = 31 * result + [self.precondition hash]; + result = 31 * result + self.precondition.Hash(); result = 31 * result + self.fieldMask.Hash(); result = 31 * result + [self.value hash]; return result; @@ -309,7 +219,7 @@ NS_ASSUME_NONNULL_BEGIN - (NSString *)description { return [NSString stringWithFormat:@"<FSTPatchMutation key=%s mask=%s value=%@ precondition=%@>", self.key.ToString().c_str(), self.fieldMask.ToString().c_str(), - self.value, self.precondition]; + self.value, self.precondition.description()]; } - (nullable FSTMaybeDocument *)applyTo:(nullable FSTMaybeDocument *)maybeDoc @@ -320,7 +230,7 @@ NS_ASSUME_NONNULL_BEGIN FSTAssert(!mutationResult.transformResults, @"Transform results received by FSTPatchMutation."); } - if (![self.precondition isValidForDocument:maybeDoc]) { + if (!self.precondition.IsValidFor(maybeDoc)) { return maybeDoc; } @@ -373,8 +283,7 @@ NS_ASSUME_NONNULL_BEGIN // NOTE: We set a precondition of exists: true as a safety-check, since we always combine // FSTTransformMutations with a FSTSetMutation or FSTPatchMutation which (if successful) should // end up with an existing document. - if (self = [super initWithKey:std::move(key) - precondition:[FSTPrecondition preconditionWithExists:YES]]) { + if (self = [super initWithKey:std::move(key) precondition:Precondition::Exists(true)]) { _fieldTransforms = std::move(fieldTransforms); } return self; @@ -395,12 +304,12 @@ NS_ASSUME_NONNULL_BEGIN FSTTransformMutation *otherMutation = (FSTTransformMutation *)other; return [self.key isEqual:otherMutation.key] && self.fieldTransforms == otherMutation.fieldTransforms && - [self.precondition isEqual:otherMutation.precondition]; + self.precondition == otherMutation.precondition; } - (NSUInteger)hash { NSUInteger result = [self.key hash]; - result = 31 * result + [self.precondition hash]; + result = 31 * result + self.precondition.Hash(); for (const auto &transform : self.fieldTransforms) { result = 31 * result + transform.Hash(); } @@ -414,7 +323,7 @@ NS_ASSUME_NONNULL_BEGIN } return [NSString stringWithFormat:@"<FSTTransformMutation key=%s transforms=%s precondition=%@>", self.key.ToString().c_str(), fieldTransforms.c_str(), - self.precondition]; + self.precondition.description()]; } - (nullable FSTMaybeDocument *)applyTo:(nullable FSTMaybeDocument *)maybeDoc @@ -426,7 +335,7 @@ NS_ASSUME_NONNULL_BEGIN @"Transform results missing for FSTTransformMutation."); } - if (![self.precondition isValidForDocument:maybeDoc]) { + if (!self.precondition.IsValidFor(maybeDoc)) { return maybeDoc; } @@ -514,19 +423,18 @@ NS_ASSUME_NONNULL_BEGIN } FSTDeleteMutation *otherMutation = (FSTDeleteMutation *)other; - return [self.key isEqual:otherMutation.key] && - [self.precondition isEqual:otherMutation.precondition]; + return [self.key isEqual:otherMutation.key] && self.precondition == otherMutation.precondition; } - (NSUInteger)hash { NSUInteger result = [self.key hash]; - result = 31 * result + [self.precondition hash]; + result = 31 * result + self.precondition.Hash(); return result; } - (NSString *)description { return [NSString stringWithFormat:@"<FSTDeleteMutation key=%s precondition=%@>", - self.key.ToString().c_str(), self.precondition]; + self.key.ToString().c_str(), self.precondition.description()]; } - (nullable FSTMaybeDocument *)applyTo:(nullable FSTMaybeDocument *)maybeDoc @@ -538,7 +446,7 @@ NS_ASSUME_NONNULL_BEGIN @"Transform results received by FSTDeleteMutation."); } - if (![self.precondition isValidForDocument:maybeDoc]) { + if (!self.precondition.IsValidFor(maybeDoc)) { return maybeDoc; } diff --git a/Firestore/Source/Remote/FSTSerializerBeta.mm b/Firestore/Source/Remote/FSTSerializerBeta.mm index 1d9ad30..c8b0fa4 100644 --- a/Firestore/Source/Remote/FSTSerializerBeta.mm +++ b/Firestore/Source/Remote/FSTSerializerBeta.mm @@ -50,6 +50,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/resource_path.h" #include "Firestore/core/src/firebase/firestore/model/transform_operations.h" #include "Firestore/core/src/firebase/firestore/util/string_apple.h" @@ -61,8 +62,10 @@ using firebase::firestore::model::DocumentKey; using firebase::firestore::model::FieldMask; using firebase::firestore::model::FieldPath; using firebase::firestore::model::FieldTransform; +using firebase::firestore::model::Precondition; using firebase::firestore::model::ResourcePath; using firebase::firestore::model::ServerTimestampTransform; +using firebase::firestore::model::SnapshotVersion; using firebase::firestore::model::TransformOperation; NS_ASSUME_NONNULL_BEGIN @@ -475,7 +478,7 @@ NS_ASSUME_NONNULL_BEGIN FSTFail(@"Unknown mutation type %@", NSStringFromClass(mutationClass)); } - if (!mutation.precondition.isNone) { + if (!mutation.precondition.IsNone()) { proto.currentDocument = [self encodedPrecondition:mutation.precondition]; } @@ -483,9 +486,9 @@ NS_ASSUME_NONNULL_BEGIN } - (FSTMutation *)decodedMutation:(GCFSWrite *)mutation { - FSTPrecondition *precondition = [mutation hasCurrentDocument] - ? [self decodedPrecondition:mutation.currentDocument] - : [FSTPrecondition none]; + Precondition precondition = [mutation hasCurrentDocument] + ? [self decodedPrecondition:mutation.currentDocument] + : Precondition::None(); switch (mutation.operationOneOfCase) { case GCFSWrite_Operation_OneOfCase_Update: @@ -505,8 +508,7 @@ NS_ASSUME_NONNULL_BEGIN precondition:precondition]; case GCFSWrite_Operation_OneOfCase_Transform: { - FSTPreconditionExists exists = precondition.exists; - FSTAssert(exists == FSTPreconditionExistsYes, + FSTAssert(precondition == Precondition::Exists(true), @"Transforms must have precondition \"exists == true\""); return [[FSTTransformMutation alloc] @@ -520,30 +522,29 @@ NS_ASSUME_NONNULL_BEGIN } } -- (GCFSPrecondition *)encodedPrecondition:(FSTPrecondition *)precondition { - FSTAssert(!precondition.isNone, @"Can't serialize an empty precondition"); +- (GCFSPrecondition *)encodedPrecondition:(const Precondition &)precondition { + FSTAssert(!precondition.IsNone(), @"Can't serialize an empty precondition"); GCFSPrecondition *message = [GCFSPrecondition message]; - if (precondition.updateTime) { - message.updateTime = [self encodedVersion:precondition.updateTime]; - } else if (precondition.exists != FSTPreconditionExistsNotSet) { - message.exists = precondition.exists == FSTPreconditionExistsYes; + if (precondition.type() == Precondition::Type::UpdateTime) { + message.updateTime = [self encodedVersion:precondition.update_time()]; + } else if (precondition.type() == Precondition::Type::Exists) { + message.exists = precondition == Precondition::Exists(true); } else { - FSTFail(@"Unknown precondition: %@", precondition); + FSTFail(@"Unknown precondition: %@", precondition.description()); } return message; } -- (FSTPrecondition *)decodedPrecondition:(GCFSPrecondition *)precondition { +- (Precondition)decodedPrecondition:(GCFSPrecondition *)precondition { switch (precondition.conditionTypeOneOfCase) { case GCFSPrecondition_ConditionType_OneOfCase_GPBUnsetOneOfCase: - return [FSTPrecondition none]; + return Precondition::None(); case GCFSPrecondition_ConditionType_OneOfCase_Exists: - return [FSTPrecondition preconditionWithExists:precondition.exists]; + return Precondition::Exists(precondition.exists); case GCFSPrecondition_ConditionType_OneOfCase_UpdateTime: - return [FSTPrecondition - preconditionWithUpdateTime:[self decodedVersion:precondition.updateTime]]; + return Precondition::UpdateTime([self decodedVersion:precondition.updateTime]); default: FSTFail(@"Unrecognized Precondition one-of case %@", precondition); |