diff options
Diffstat (limited to 'Firestore/Source/API')
-rw-r--r-- | Firestore/Source/API/FIRDocumentReference.mm | 4 | ||||
-rw-r--r-- | Firestore/Source/API/FIRFieldPath.mm | 3 | ||||
-rw-r--r-- | Firestore/Source/API/FIRFirestore.mm | 7 | ||||
-rw-r--r-- | Firestore/Source/API/FIRFirestoreVersion.mm | 2 | ||||
-rw-r--r-- | Firestore/Source/API/FSTUserDataConverter.h | 31 | ||||
-rw-r--r-- | Firestore/Source/API/FSTUserDataConverter.mm | 130 |
6 files changed, 120 insertions, 57 deletions
diff --git a/Firestore/Source/API/FIRDocumentReference.mm b/Firestore/Source/API/FIRDocumentReference.mm index cc52d45..67e401d 100644 --- a/Firestore/Source/API/FIRDocumentReference.mm +++ b/Firestore/Source/API/FIRDocumentReference.mm @@ -16,11 +16,11 @@ #import "FIRDocumentReference.h" +#import <GRPCClient/GRPCCall.h> + #include <memory> #include <utility> -#import <GRPCClient/GRPCCall.h> - #import "FIRFirestoreErrors.h" #import "FIRSnapshotMetadata.h" #import "Firestore/Source/API/FIRCollectionReference+Internal.h" diff --git a/Firestore/Source/API/FIRFieldPath.mm b/Firestore/Source/API/FIRFieldPath.mm index c651160..d0d8714 100644 --- a/Firestore/Source/API/FIRFieldPath.mm +++ b/Firestore/Source/API/FIRFieldPath.mm @@ -14,13 +14,14 @@ * limitations under the License. */ -#import "Firestore/Source/API/FIRFieldPath+Internal.h" +#import "FIRFieldPath.h" #include <functional> #include <string> #include <utility> #include <vector> +#import "Firestore/Source/API/FIRFieldPath+Internal.h" #import "Firestore/Source/Util/FSTUsageValidation.h" #include "Firestore/core/src/firebase/firestore/model/field_path.h" diff --git a/Firestore/Source/API/FIRFirestore.mm b/Firestore/Source/API/FIRFirestore.mm index 45d67cf..fe461d6 100644 --- a/Firestore/Source/API/FIRFirestore.mm +++ b/Firestore/Source/API/FIRFirestore.mm @@ -16,14 +16,14 @@ #import "FIRFirestore.h" -#include <memory> -#include <utility> - #import <FirebaseCore/FIRApp.h> #import <FirebaseCore/FIRAppInternal.h> #import <FirebaseCore/FIRLogger.h> #import <FirebaseCore/FIROptions.h> +#include <memory> +#include <utility> + #import "FIRFirestoreSettings.h" #import "Firestore/Source/API/FIRCollectionReference+Internal.h" #import "Firestore/Source/API/FIRDocumentReference+Internal.h" @@ -31,7 +31,6 @@ #import "Firestore/Source/API/FIRTransaction+Internal.h" #import "Firestore/Source/API/FIRWriteBatch+Internal.h" #import "Firestore/Source/API/FSTUserDataConverter.h" - #import "Firestore/Source/Core/FSTFirestoreClient.h" #import "Firestore/Source/Util/FSTAssert.h" #import "Firestore/Source/Util/FSTDispatchQueue.h" diff --git a/Firestore/Source/API/FIRFirestoreVersion.mm b/Firestore/Source/API/FIRFirestoreVersion.mm index b1fe480..8ebe814 100644 --- a/Firestore/Source/API/FIRFirestoreVersion.mm +++ b/Firestore/Source/API/FIRFirestoreVersion.mm @@ -14,6 +14,8 @@ * limitations under the License. */ +#import "Firestore/Source/API/FIRFirestoreVersion.h" + #ifndef FIRFirestore_VERSION #error "FIRFirestore_VERSION is not defined: add -DFIRFirestore_VERSION=... to the build invocation" #endif diff --git a/Firestore/Source/API/FSTUserDataConverter.h b/Firestore/Source/API/FSTUserDataConverter.h index 3b178be..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 FSTFieldMask; @class FSTFieldValue; -@class FSTFieldTransform; @class FSTMutation; @class FSTPrecondition; @class FSTSnapshotVersion; @@ -36,13 +38,20 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithData:(FSTObjectValue *)data - fieldMask:(nullable FSTFieldMask *)fieldMask - 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: + (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, nullable) FSTFieldMask *fieldMask; -@property(nonatomic, strong, readonly) NSArray<FSTFieldTransform *> *fieldTransforms; +@property(nonatomic, assign, readonly) BOOL isPatch; /** * Converts the parsed document data into 1 or 2 mutations (depending on whether there are any @@ -59,13 +68,15 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithData:(FSTObjectValue *)data - fieldMask:(FSTFieldMask *)fieldMask - fieldTransforms:(NSArray<FSTFieldTransform *> *)fieldTransforms + fieldMask:(firebase::firestore::model::FieldMask)fieldMask + 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) FSTFieldMask *fieldMask; -@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 7ee16de..2eee878 100644 --- a/Firestore/Source/API/FSTUserDataConverter.mm +++ b/Firestore/Source/API/FSTUserDataConverter.mm @@ -35,14 +35,21 @@ #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_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" namespace util = firebase::firestore::util; 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 @@ -50,25 +57,45 @@ static NSString *const RESERVED_FIELD_DESIGNATOR = @"__"; #pragma mark - FSTParsedSetData -@implementation FSTParsedSetData +@implementation FSTParsedSetData { + FieldMask _fieldMask; + std::vector<FieldTransform> _fieldTransforms; +} + +- (instancetype)initWithData:(FSTObjectValue *)data + fieldTransforms:(std::vector<FieldTransform>)fieldTransforms { + self = [super init]; + if (self) { + _data = data; + _fieldTransforms = std::move(fieldTransforms); + _isPatch = NO; + } + return self; +} + - (instancetype)initWithData:(FSTObjectValue *)data - fieldMask:(nullable FSTFieldMask *)fieldMask - fieldTransforms:(NSArray<FSTFieldTransform *> *)fieldTransforms { + fieldMask:(FieldMask)fieldMask + fieldTransforms:(std::vector<FieldTransform>)fieldTransforms { self = [super init]; if (self) { _data = data; - _fieldMask = fieldMask; - _fieldTransforms = fieldTransforms; + _fieldMask = std::move(fieldMask); + _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]; - if (self.fieldMask) { + if (self.isPatch) { [mutations addObject:[[FSTPatchMutation alloc] initWithKey:key - fieldMask:self.fieldMask + fieldMask:_fieldMask value:self.data precondition:precondition]]; } else { @@ -76,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]]; } @@ -87,15 +114,19 @@ static NSString *const RESERVED_FIELD_DESIGNATOR = @"__"; #pragma mark - FSTParsedUpdateData -@implementation FSTParsedUpdateData +@implementation FSTParsedUpdateData { + FieldMask _fieldMask; + std::vector<FieldTransform> _fieldTransforms; +} + - (instancetype)initWithData:(FSTObjectValue *)data - fieldMask:(FSTFieldMask *)fieldMask - fieldTransforms:(NSArray<FSTFieldTransform *> *)fieldTransforms { + fieldMask:(FieldMask)fieldMask + fieldTransforms:(std::vector<FieldTransform>)fieldTransforms { self = [super init]; if (self) { _data = data; - _fieldMask = fieldMask; - _fieldTransforms = fieldTransforms; + _fieldMask = std::move(fieldMask); + _fieldTransforms = std::move(fieldTransforms); } return self; } @@ -107,13 +138,21 @@ 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]]; } return mutations; } +- (const firebase::firestore::model::FieldMask &)fieldMask { + return _fieldMask; +} + +- (const std::vector<FieldTransform> &)fieldTransforms { + return _fieldTransforms; +} + @end /** @@ -142,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; /** @@ -160,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; @@ -178,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 @@ -196,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; @@ -205,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; @@ -225,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; @@ -239,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; @@ -250,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]; } @@ -309,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 @@ -364,10 +418,9 @@ 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 - fieldMask:[[FSTFieldMask alloc] initWithFields:*context.fieldMask] - fieldTransforms:context.fieldTransforms]; + return [[FSTParsedSetData alloc] initWithData:updateData + fieldMask:FieldMask{*context.fieldMask} + fieldTransforms:*context.fieldTransforms]; } - (FSTParsedSetData *)parsedSetData:(id)input { @@ -382,9 +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 - fieldMask:nil - fieldTransforms:context.fieldTransforms]; + return + [[FSTParsedSetData alloc] initWithData:updateData fieldTransforms:*context.fieldTransforms]; } - (FSTParsedUpdateData *)parsedUpdateData:(id)input { @@ -428,10 +480,9 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { } }]; - FSTFieldMask *mask = [[FSTFieldMask alloc] initWithFields:fieldMaskPaths]; return [[FSTParsedUpdateData alloc] initWithData:updateData - fieldMask:mask - fieldTransforms:context.fieldTransforms]; + fieldMask:FieldMask{fieldMaskPaths} + fieldTransforms:*context.fieldTransforms]; } - (FSTFieldValue *)parsedQueryValue:(id)input { @@ -440,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; } @@ -639,10 +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:[FSTServerTimestampTransform serverTimestampTransform]]]; + [context appendToFieldTransformsWithFieldPath:*context.path + transformOperation:absl::make_unique<ServerTimestampTransform>( + ServerTimestampTransform::Get())]; // Return nil so this value is omitted from the parsed result. return nil; |