diff options
author | zxu <zxu@google.com> | 2018-04-10 16:28:22 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-10 16:28:22 -0400 |
commit | 2ac778f312301a8dd10c3c6498a59ce536abd738 (patch) | |
tree | 68ac918167ec2e474c552f821297ade071e33a20 /Firestore/Source/API | |
parent | 59f9dcb72f46258ffefea3aaf93f51e927c1cc10 (diff) |
Port FieldTransform to C++ (#1033)
* port FieldMask to C++
* address changes
* address changes
* fix test
* address change
* Port transform operations (FSTTransformOperation, FSTServerTimestampTransform) to C++
* address changes
* address changes
* address changes
* implement `FieldTransform` in C++
* port `FieldTransform`
* make `fieldTransforms` shared inside `context`
* address changes
* fix lint
* address changes
Diffstat (limited to 'Firestore/Source/API')
-rw-r--r-- | Firestore/Source/API/FSTUserDataConverter.h | 18 | ||||
-rw-r--r-- | Firestore/Source/API/FSTUserDataConverter.mm | 83 |
2 files changed, 67 insertions, 34 deletions
diff --git a/Firestore/Source/API/FSTUserDataConverter.h b/Firestore/Source/API/FSTUserDataConverter.h index 2b4b340..a2f947a 100644 --- a/Firestore/Source/API/FSTUserDataConverter.h +++ b/Firestore/Source/API/FSTUserDataConverter.h @@ -16,14 +16,16 @@ #import <Foundation/Foundation.h> +#include <vector> + #include "Firestore/core/src/firebase/firestore/model/database_id.h" #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" @class FIRSetOptions; @class FSTObjectValue; @class FSTFieldValue; -@class FSTFieldTransform; @class FSTMutation; @class FSTPrecondition; @class FSTSnapshotVersion; @@ -36,16 +38,19 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithData:(FSTObjectValue *)data - fieldTransforms:(NSArray<FSTFieldTransform *> *)fieldTransforms + fieldTransforms: + (std::vector<firebase::firestore::model::FieldTransform>)fieldTransforms NS_DESIGNATED_INITIALIZER; - (instancetype)initWithData:(FSTObjectValue *)data fieldMask:(firebase::firestore::model::FieldMask)fieldMask - fieldTransforms:(NSArray<FSTFieldTransform *> *)fieldTransforms + fieldTransforms: + (std::vector<firebase::firestore::model::FieldTransform>)fieldTransforms NS_DESIGNATED_INITIALIZER; +- (const std::vector<firebase::firestore::model::FieldTransform> &)fieldTransforms; + @property(nonatomic, strong, readonly) FSTObjectValue *data; -@property(nonatomic, strong, readonly) NSArray<FSTFieldTransform *> *fieldTransforms; @property(nonatomic, assign, readonly) BOOL isPatch; /** @@ -64,13 +69,14 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithData:(FSTObjectValue *)data fieldMask:(firebase::firestore::model::FieldMask)fieldMask - fieldTransforms:(NSArray<FSTFieldTransform *> *)fieldTransforms + fieldTransforms: + (std::vector<firebase::firestore::model::FieldTransform>)fieldTransforms NS_DESIGNATED_INITIALIZER; - (const firebase::firestore::model::FieldMask &)fieldMask; +- (const std::vector<firebase::firestore::model::FieldTransform> &)fieldTransforms; @property(nonatomic, strong, readonly) FSTObjectValue *data; -@property(nonatomic, strong, readonly) NSArray<FSTFieldTransform *> *fieldTransforms; /** * Converts the parsed update data into 1 or 2 mutations (depending on whether there are any diff --git a/Firestore/Source/API/FSTUserDataConverter.mm b/Firestore/Source/API/FSTUserDataConverter.mm index c6a6e34..2eee878 100644 --- a/Firestore/Source/API/FSTUserDataConverter.mm +++ b/Firestore/Source/API/FSTUserDataConverter.mm @@ -37,6 +37,7 @@ #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_path.h" +#include "Firestore/core/src/firebase/firestore/model/field_transform.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" @@ -46,7 +47,9 @@ using firebase::firestore::model::DatabaseId; using firebase::firestore::model::DocumentKey; using firebase::firestore::model::FieldMask; using firebase::firestore::model::FieldPath; +using firebase::firestore::model::FieldTransform; using firebase::firestore::model::ServerTimestampTransform; +using firebase::firestore::model::TransformOperation; NS_ASSUME_NONNULL_BEGIN @@ -56,14 +59,15 @@ static NSString *const RESERVED_FIELD_DESIGNATOR = @"__"; @implementation FSTParsedSetData { FieldMask _fieldMask; + std::vector<FieldTransform> _fieldTransforms; } - (instancetype)initWithData:(FSTObjectValue *)data - fieldTransforms:(NSArray<FSTFieldTransform *> *)fieldTransforms { + fieldTransforms:(std::vector<FieldTransform>)fieldTransforms { self = [super init]; if (self) { _data = data; - _fieldTransforms = fieldTransforms; + _fieldTransforms = std::move(fieldTransforms); _isPatch = NO; } return self; @@ -71,17 +75,21 @@ static NSString *const RESERVED_FIELD_DESIGNATOR = @"__"; - (instancetype)initWithData:(FSTObjectValue *)data fieldMask:(FieldMask)fieldMask - fieldTransforms:(NSArray<FSTFieldTransform *> *)fieldTransforms { + fieldTransforms:(std::vector<FieldTransform>)fieldTransforms { self = [super init]; if (self) { _data = data; _fieldMask = std::move(fieldMask); - _fieldTransforms = fieldTransforms; + _fieldTransforms = std::move(fieldTransforms); _isPatch = YES; } return self; } +- (const std::vector<FieldTransform> &)fieldTransforms { + return _fieldTransforms; +} + - (NSArray<FSTMutation *> *)mutationsWithKey:(const DocumentKey &)key precondition:(FSTPrecondition *)precondition { NSMutableArray<FSTMutation *> *mutations = [NSMutableArray array]; @@ -95,7 +103,7 @@ static NSString *const RESERVED_FIELD_DESIGNATOR = @"__"; value:self.data precondition:precondition]]; } - if (self.fieldTransforms.count > 0) { + if (!self.fieldTransforms.empty()) { [mutations addObject:[[FSTTransformMutation alloc] initWithKey:key fieldTransforms:self.fieldTransforms]]; } @@ -108,16 +116,17 @@ static NSString *const RESERVED_FIELD_DESIGNATOR = @"__"; @implementation FSTParsedUpdateData { FieldMask _fieldMask; + std::vector<FieldTransform> _fieldTransforms; } - (instancetype)initWithData:(FSTObjectValue *)data fieldMask:(FieldMask)fieldMask - fieldTransforms:(NSArray<FSTFieldTransform *> *)fieldTransforms { + fieldTransforms:(std::vector<FieldTransform>)fieldTransforms { self = [super init]; if (self) { _data = data; _fieldMask = std::move(fieldMask); - _fieldTransforms = fieldTransforms; + _fieldTransforms = std::move(fieldTransforms); } return self; } @@ -129,7 +138,7 @@ static NSString *const RESERVED_FIELD_DESIGNATOR = @"__"; fieldMask:self.fieldMask value:self.data precondition:precondition]]; - if (self.fieldTransforms.count > 0) { + if (!self.fieldTransforms.empty()) { [mutations addObject:[[FSTTransformMutation alloc] initWithKey:key fieldTransforms:self.fieldTransforms]]; } @@ -140,6 +149,10 @@ static NSString *const RESERVED_FIELD_DESIGNATOR = @"__"; return _fieldMask; } +- (const std::vector<FieldTransform> &)fieldTransforms { + return _fieldTransforms; +} + @end /** @@ -168,7 +181,6 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { * conditions apply during parsing and providing better error messages. */ @property(nonatomic, assign) FSTUserDataSource dataSource; -@property(nonatomic, strong, readonly) NSMutableArray<FSTFieldTransform *> *fieldTransforms; - (instancetype)init NS_UNAVAILABLE; /** @@ -186,7 +198,7 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { - (instancetype)initWithSource:(FSTUserDataSource)dataSource path:(std::unique_ptr<FieldPath>)path arrayElement:(BOOL)arrayElement - fieldTransforms:(NSMutableArray<FSTFieldTransform *> *)fieldTransforms + fieldTransforms:(std::shared_ptr<std::vector<FieldTransform>>)fieldTransforms fieldMask:(std::shared_ptr<std::vector<FieldPath>>)fieldMask NS_DESIGNATED_INITIALIZER; @@ -204,16 +216,22 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { - (void)appendToFieldMaskWithFieldPath:(FieldPath)fieldPath; +- (const std::vector<FieldTransform> *)fieldTransforms; + +- (void)appendToFieldTransformsWithFieldPath:(FieldPath)fieldPath + transformOperation: + (std::unique_ptr<TransformOperation>)transformOperation; @end @implementation FSTParseContext { /** The current path being parsed. */ // TODO(b/34871131): path should never be nullptr, but we don't support array paths right now. std::unique_ptr<FieldPath> _path; - // _fieldMask is shared across all active context objects to accumulate the result. For example, - // the result of calling any of contextForField, contextForFieldPath and contextForArrayIndex - // shares the ownership of _fieldMask. + // _fieldMask and _fieldTransforms are shared across all active context objects to accumulate the + // result. For example, the result of calling any of contextForField, contextForFieldPath and + // contextForArrayIndex shares the ownership of _fieldMask and _fieldTransforms. std::shared_ptr<std::vector<FieldPath>> _fieldMask; + std::shared_ptr<std::vector<FieldTransform>> _fieldTransforms; } + (instancetype)contextWithSource:(FSTUserDataSource)dataSource @@ -222,7 +240,7 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { [[FSTParseContext alloc] initWithSource:dataSource path:std::move(path) arrayElement:NO - fieldTransforms:[NSMutableArray array] + fieldTransforms:std::make_shared<std::vector<FieldTransform>>() fieldMask:std::make_shared<std::vector<FieldPath>>()]; [context validatePath]; return context; @@ -231,13 +249,13 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { - (instancetype)initWithSource:(FSTUserDataSource)dataSource path:(std::unique_ptr<FieldPath>)path arrayElement:(BOOL)arrayElement - fieldTransforms:(NSMutableArray<FSTFieldTransform *> *)fieldTransforms + fieldTransforms:(std::shared_ptr<std::vector<FieldTransform>>)fieldTransforms fieldMask:(std::shared_ptr<std::vector<FieldPath>>)fieldMask { if (self = [super init]) { _dataSource = dataSource; _path = std::move(path); _arrayElement = arrayElement; - _fieldTransforms = fieldTransforms; + _fieldTransforms = std::move(fieldTransforms); _fieldMask = std::move(fieldMask); } return self; @@ -251,7 +269,7 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { FSTParseContext *context = [[FSTParseContext alloc] initWithSource:self.dataSource path:std::move(path) arrayElement:NO - fieldTransforms:self.fieldTransforms + fieldTransforms:_fieldTransforms fieldMask:_fieldMask]; [context validatePathSegment:fieldName]; return context; @@ -265,7 +283,7 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { FSTParseContext *context = [[FSTParseContext alloc] initWithSource:self.dataSource path:std::move(path) arrayElement:NO - fieldTransforms:self.fieldTransforms + fieldTransforms:_fieldTransforms fieldMask:_fieldMask]; [context validatePath]; return context; @@ -276,7 +294,7 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { return [[FSTParseContext alloc] initWithSource:self.dataSource path:nil arrayElement:YES - fieldTransforms:self.fieldTransforms + fieldTransforms:_fieldTransforms fieldMask:_fieldMask]; } @@ -335,6 +353,16 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { _fieldMask->push_back(std::move(fieldPath)); } +- (const std::vector<FieldTransform> *)fieldTransforms { + return _fieldTransforms.get(); +} + +- (void)appendToFieldTransformsWithFieldPath:(FieldPath)fieldPath + transformOperation: + (std::unique_ptr<TransformOperation>)transformOperation { + _fieldTransforms->emplace_back(std::move(fieldPath), std::move(transformOperation)); +} + @end #pragma mark - FSTDocumentKeyReference @@ -392,7 +420,7 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { return [[FSTParsedSetData alloc] initWithData:updateData fieldMask:FieldMask{*context.fieldMask} - fieldTransforms:context.fieldTransforms]; + fieldTransforms:*context.fieldTransforms]; } - (FSTParsedSetData *)parsedSetData:(id)input { @@ -407,7 +435,8 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { path:absl::make_unique<FieldPath>(FieldPath::EmptyPath())]; FSTObjectValue *updateData = (FSTObjectValue *)[self parseData:input context:context]; - return [[FSTParsedSetData alloc] initWithData:updateData fieldTransforms:context.fieldTransforms]; + return + [[FSTParsedSetData alloc] initWithData:updateData fieldTransforms:*context.fieldTransforms]; } - (FSTParsedUpdateData *)parsedUpdateData:(id)input { @@ -453,7 +482,7 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { return [[FSTParsedUpdateData alloc] initWithData:updateData fieldMask:FieldMask{fieldMaskPaths} - fieldTransforms:context.fieldTransforms]; + fieldTransforms:*context.fieldTransforms]; } - (FSTFieldValue *)parsedQueryValue:(id)input { @@ -462,7 +491,7 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { path:absl::make_unique<FieldPath>(FieldPath::EmptyPath())]; FSTFieldValue *_Nullable parsed = [self parseData:input context:context]; FSTAssert(parsed, @"Parsed data should not be nil."); - FSTAssert(context.fieldTransforms.count == 0, @"Field transforms should have been disallowed."); + FSTAssert(context.fieldTransforms->empty(), @"Field transforms should have been disallowed."); return parsed; } @@ -661,11 +690,9 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { @"FieldValue.serverTimestamp() is not currently supported inside arrays%@", [context fieldDescription]); } - [context.fieldTransforms - addObject:[[FSTFieldTransform alloc] - initWithPath:*context.path - transform:absl::make_unique<ServerTimestampTransform>( - ServerTimestampTransform::Get())]]; + [context appendToFieldTransformsWithFieldPath:*context.path + transformOperation:absl::make_unique<ServerTimestampTransform>( + ServerTimestampTransform::Get())]; // Return nil so this value is omitted from the parsed result. return nil; |