diff --git a/include/mgp.hpp b/include/mgp.hpp index afe606da5..e7b7fc982 100644 --- a/include/mgp.hpp +++ b/include/mgp.hpp @@ -1131,6 +1131,8 @@ class Value { /// @exception std::runtime_error Unknown value type. bool operator!=(const Value &other) const; + bool operator<(const Value &other) const; + private: mgp_value *ptr_; }; @@ -3257,6 +3259,44 @@ inline bool Value::operator==(const Value &other) const { return util::ValuesEqu inline bool Value::operator!=(const Value &other) const { return !(*this == other); } +inline bool Value::operator<(const Value &other) const { + const mgp::Type &type = Type(); + if (type != other.Type() && !(IsNumeric() && other.IsNumeric())) { + throw ValueException("Values have to be of the same type"); + } + + switch (type) { + case Type::Null: + throw ValueException("Cannot compare Null types"); + case Type::Bool: + return ValueBool() < other.ValueBool(); + case Type::Int: + return ValueNumeric() < other.ValueNumeric(); + case Type::Double: + return ValueNumeric() < other.ValueNumeric(); + case Type::String: + return ValueString() < other.ValueString(); + case Type::Node: + return ValueNode() < other.ValueNode(); + case Type::Relationship: + return ValueRelationship() < other.ValueRelationship(); + case Type::Date: + return ValueDate() < other.ValueDate(); + case Type::LocalTime: + return ValueLocalTime() < other.ValueLocalTime(); + case Type::LocalDateTime: + return ValueLocalDateTime() < other.ValueLocalDateTime(); + case Type::Duration: + return ValueDuration() < other.ValueDuration(); + case Type::Path: + case Type::List: + case Type::Map: + throw ValueException("Operator < is not defined for this Path, List or Map data type"); + default: + throw ValueException("Undefined behaviour"); + } +} + inline std::ostream &operator<<(std::ostream &os, const mgp::Type &type) { switch (type) { case mgp::Type::Null: @@ -3292,6 +3332,7 @@ inline std::ostream &operator<<(std::ostream &os, const mgp::Type &type) { } } + /* #endregion */ /* #region Record */ diff --git a/tests/unit/cpp_api.cpp b/tests/unit/cpp_api.cpp index 79a12741a..3e47ff782 100644 --- a/tests/unit/cpp_api.cpp +++ b/tests/unit/cpp_api.cpp @@ -473,6 +473,29 @@ TYPED_TEST(CppApiTestFixture, TestNodeProperties) { ASSERT_EQ(node_1.GetProperty("b").ValueString(), "b"); } + +TYPED_TEST(CppApiTestFixture, TestValueOperatorLessThan) { + const int64_t int1 = 3; + const int64_t int2 = 4; + const double double1 = 3.5; + const mgp::List list1 = mgp::List(); + const mgp::Map map1 = mgp::Map(); + const mgp::Value int_test1 = mgp::Value(int1); + const mgp::Value int_test2 = mgp::Value(int2); + const mgp::Value double_test1 = mgp::Value(double1); + const mgp::Value list_test = mgp::Value(list1); + const mgp::Value map_test = mgp::Value(map1); + + ASSERT_TRUE(int_test1 < int_test2); + ASSERT_TRUE(double_test1 < int_test2); + + const std::string string1 = "string"; + const mgp::Value string_test1 = mgp::Value(string1); + + ASSERT_THROW(int_test1 < string_test1, mgp::ValueException); + ASSERT_THROW(list_test < map_test, mgp::ValueException); + ASSERT_THROW(list_test < list_test, mgp::ValueException); +} TYPED_TEST(CppApiTestFixture, TestNumberEquality) { mgp::Value double_1{1.0}; mgp::Value int_1{static_cast<int64_t>(1)}; @@ -480,6 +503,7 @@ TYPED_TEST(CppApiTestFixture, TestNumberEquality) { mgp::Value double_2{2.01}; mgp::Value int_2{static_cast<int64_t>(2)}; ASSERT_FALSE(double_2 == int_2); + } TYPED_TEST(CppApiTestFixture, TestTypeOperatorStream) {