From 60d43d7b0980719beac21811da712f1cb4881308 Mon Sep 17 00:00:00 2001 From: Michael Lehenbauer Date: Fri, 13 Apr 2018 14:22:41 -0700 Subject: Array Transforms public API and parsing This includes the new FIRFieldValue sentinels, the FSTUserDataConverter code to parse them into internal ArrayTransform operations for use in an FSTTransformMutation, and some sanity testing in FSTMutationTests. I still need to implement FSTTransformMutation support for local application and serialization (and then integration tests). --- .../firestore/model/transform_operations.h | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'Firestore/core/src/firebase/firestore/model') diff --git a/Firestore/core/src/firebase/firestore/model/transform_operations.h b/Firestore/core/src/firebase/firestore/model/transform_operations.h index 6ff4dbc..aad5a9b 100644 --- a/Firestore/core/src/firebase/firestore/model/transform_operations.h +++ b/Firestore/core/src/firebase/firestore/model/transform_operations.h @@ -17,6 +17,12 @@ #ifndef FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_MODEL_TRANSFORM_OPERATIONS_H_ #define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_MODEL_TRANSFORM_OPERATIONS_H_ +#include + +#if defined(__OBJC__) +#import "Firestore/Source/Model/FSTFieldValue.h" +#endif + namespace firebase { namespace firestore { namespace model { @@ -31,6 +37,8 @@ class TransformOperation { /** All the different kinds to TransformOperation. */ enum class Type { ServerTimestamp, + ArrayUnion, + ArrayRemove, Test, // Purely for test purpose. }; @@ -90,6 +98,65 @@ class ServerTimestampTransform : public TransformOperation { } }; +// TODO(mikelehen): ArrayTransform can only be used from Obj-C until we switch +// to using FieldValue instead of FSTFieldValue. +#if defined(__OBJC__) +/** + * Transforms an array via a union or remove operation (for convenience, we use + * this class for both Type::ArrayUnion and Type::ArrayRemove). + */ +class ArrayTransform : public TransformOperation { + public: + ArrayTransform(const Type& type, const std::vector elements) + : type_(type), elements_(elements) { + } + + ~ArrayTransform() override { + } + + Type type() const override { + return type_; + } + + const std::vector& elements() const { + return elements_; + } + + bool operator==(const TransformOperation& other) const override { + if (other.type() != type()) { + return false; + } + auto array_transform = static_cast(other); + if (array_transform.elements_.size() != elements_.size()) { + return false; + } + for (int i = 0; i < elements_.size(); i++) { + if (![array_transform.elements_[i] isEqual:elements_[i]]) { + return false; + } + } + return true; + } + +#if defined(__OBJC__) + // For Objective-C++ hash; to be removed after migration. + // Do NOT use in C++ code. + NSUInteger Hash() const override { + NSUInteger result = 37; + result = 31 * result + (type() == Type::ArrayUnion ? 1231 : 1237); + for (FSTFieldValue* element : elements_) { + result = 31 * result + [element hash]; + } + return result; + } +#endif // defined(__OBJC__) + + private: + Type type_; + std::vector elements_; +}; +#endif + } // namespace model } // namespace firestore } // namespace firebase -- cgit v1.2.3