aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/core/src/firebase/firestore/model
diff options
context:
space:
mode:
authorGravatar Michael Lehenbauer <mikelehen@gmail.com>2018-04-13 14:22:41 -0700
committerGravatar GitHub <noreply@github.com>2018-04-13 14:22:41 -0700
commit60d43d7b0980719beac21811da712f1cb4881308 (patch)
tree268424fabe81a547ee17b737177f24130b1f4d89 /Firestore/core/src/firebase/firestore/model
parentdfdab5bee001546b3f36638c00b96b381cb4c040 (diff)
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).
Diffstat (limited to 'Firestore/core/src/firebase/firestore/model')
-rw-r--r--Firestore/core/src/firebase/firestore/model/transform_operations.h67
1 files changed, 67 insertions, 0 deletions
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 <vector>
+
+#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<FSTFieldValue*> elements)
+ : type_(type), elements_(elements) {
+ }
+
+ ~ArrayTransform() override {
+ }
+
+ Type type() const override {
+ return type_;
+ }
+
+ const std::vector<FSTFieldValue*>& elements() const {
+ return elements_;
+ }
+
+ bool operator==(const TransformOperation& other) const override {
+ if (other.type() != type()) {
+ return false;
+ }
+ auto array_transform = static_cast<const ArrayTransform&>(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<FSTFieldValue*> elements_;
+};
+#endif
+
} // namespace model
} // namespace firestore
} // namespace firebase