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) {