aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/Source/API
diff options
context:
space:
mode:
authorGravatar zxu <zxu@google.com>2018-04-10 16:28:22 -0400
committerGravatar GitHub <noreply@github.com>2018-04-10 16:28:22 -0400
commit2ac778f312301a8dd10c3c6498a59ce536abd738 (patch)
tree68ac918167ec2e474c552f821297ade071e33a20 /Firestore/Source/API
parent59f9dcb72f46258ffefea3aaf93f51e927c1cc10 (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.h18
-rw-r--r--Firestore/Source/API/FSTUserDataConverter.mm83
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;