From 597934203ee65edab43bdb218e09eb561f184089 Mon Sep 17 00:00:00 2001 From: florijan <florijan@memgraph.io> Date: Wed, 22 Nov 2017 10:23:33 +0100 Subject: [PATCH] Support explicit int->bool and bool->int Reviewers: teon.banek, buda, mislav.bradac Reviewed By: mislav.bradac Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D999 --- src/query/interpret/awesome_memgraph_functions.cpp | 4 ++++ tests/unit/query_expression_evaluator.cpp | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/query/interpret/awesome_memgraph_functions.cpp b/src/query/interpret/awesome_memgraph_functions.cpp index dd7d060eb..d1cca8b0f 100644 --- a/src/query/interpret/awesome_memgraph_functions.cpp +++ b/src/query/interpret/awesome_memgraph_functions.cpp @@ -180,6 +180,8 @@ TypedValue ToBoolean(const std::vector<TypedValue> &args, GraphDbAccessor &) { return TypedValue::Null; case TypedValue::Type::Bool: return args[0].Value<bool>(); + case TypedValue::Type::Int: + return args[0].ValueInt() != 0L; case TypedValue::Type::String: { auto s = utils::ToUpperCase(utils::Trim(args[0].Value<std::string>())); if (s == "TRUE") return true; @@ -222,6 +224,8 @@ TypedValue ToInteger(const std::vector<TypedValue> &args, GraphDbAccessor &) { switch (args[0].type()) { case TypedValue::Type::Null: return TypedValue::Null; + case TypedValue::Type::Bool: + return args[0].ValueBool() ? 1L : 0L; case TypedValue::Type::Int: return args[0]; case TypedValue::Type::Double: diff --git a/tests/unit/query_expression_evaluator.cpp b/tests/unit/query_expression_evaluator.cpp index a4f881978..4737bffbb 100644 --- a/tests/unit/query_expression_evaluator.cpp +++ b/tests/unit/query_expression_evaluator.cpp @@ -886,13 +886,15 @@ TEST(ExpressionEvaluator, FunctionToBoolean) { ASSERT_THROW(EvaluateFunction("TOBOOLEAN", {}), QueryRuntimeException); ASSERT_EQ(EvaluateFunction("TOBOOLEAN", {TypedValue::Null}).type(), TypedValue::Type::Null); + ASSERT_EQ(EvaluateFunction("TOBOOLEAN", {123}).ValueBool(), true); + ASSERT_EQ(EvaluateFunction("TOBOOLEAN", {-213}).ValueBool(), true); + ASSERT_EQ(EvaluateFunction("TOBOOLEAN", {0}).ValueBool(), false); ASSERT_EQ(EvaluateFunction("TOBOOLEAN", {" trUE \n\t"}).Value<bool>(), true); ASSERT_EQ(EvaluateFunction("TOBOOLEAN", {"\n\tFalsE "}).Value<bool>(), false); ASSERT_EQ(EvaluateFunction("TOBOOLEAN", {"\n\tFALSEA "}).type(), TypedValue::Type::Null); ASSERT_EQ(EvaluateFunction("TOBOOLEAN", {true}).Value<bool>(), true); ASSERT_EQ(EvaluateFunction("TOBOOLEAN", {false}).Value<bool>(), false); - ASSERT_THROW(EvaluateFunction("TOBOOLEAN", {2}), QueryRuntimeException); } TEST(ExpressionEvaluator, FunctionToFloat) { @@ -912,13 +914,14 @@ TEST(ExpressionEvaluator, FunctionToInteger) { ASSERT_THROW(EvaluateFunction("TOINTEGER", {}), QueryRuntimeException); ASSERT_EQ(EvaluateFunction("TOINTEGER", {TypedValue::Null}).type(), TypedValue::Type::Null); + ASSERT_EQ(EvaluateFunction("TOINTEGER", {false}).Value<int64_t>(), 0); + ASSERT_EQ(EvaluateFunction("TOINTEGER", {true}).Value<int64_t>(), 1); ASSERT_EQ(EvaluateFunction("TOINTEGER", {"\n\t3"}).Value<int64_t>(), 3); ASSERT_EQ(EvaluateFunction("TOINTEGER", {" -3.5 \n\t"}).Value<int64_t>(), -3); ASSERT_EQ(EvaluateFunction("TOINTEGER", {"\n\t3X "}).type(), TypedValue::Type::Null); ASSERT_EQ(EvaluateFunction("TOINTEGER", {-3.5}).Value<int64_t>(), -3); ASSERT_EQ(EvaluateFunction("TOINTEGER", {3.5}).Value<int64_t>(), 3); - ASSERT_THROW(EvaluateFunction("TOINTEGER", {true}), QueryRuntimeException); } TEST(ExpressionEvaluator, FunctionType) {