From ae5f454bfce236623feafe8561346e9ea5d8f3c8 Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Fri, 19 Sep 2014 17:46:36 +0200 Subject: [PATCH] added unary operator --- arangod/Aql/AstNode.cpp | 4 ++++ arangod/Aql/Expression.cpp | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/arangod/Aql/AstNode.cpp b/arangod/Aql/AstNode.cpp index f041d254aa..35c7f9e4f9 100644 --- a/arangod/Aql/AstNode.cpp +++ b/arangod/Aql/AstNode.cpp @@ -664,6 +664,10 @@ bool AstNode::isSimple () const { return (getMember(0)->isSimple() && getMember(1)->isSimple()); } + if (type == NODE_TYPE_OPERATOR_UNARY_NOT) { + return getMember(0)->isSimple(); + } + if (type == NODE_TYPE_FCALL) { // some functions have C++ handlers // check if the called function is one of them diff --git a/arangod/Aql/Expression.cpp b/arangod/Aql/Expression.cpp index d75482b209..c01a8688fb 100644 --- a/arangod/Aql/Expression.cpp +++ b/arangod/Aql/Expression.cpp @@ -404,6 +404,22 @@ AqlValue Expression::executeSimpleExpression (AstNode const* node, return res; } + else if (node->type == NODE_TYPE_OPERATOR_UNARY_NOT) { + TRI_document_collection_t const* myCollection = nullptr; + AqlValue operand = executeSimpleExpression(node->getMember(0), &myCollection, trx, docColls, argv, startPos, vars, regs); + + bool operandIsBoolean = operand.isBoolean(); + bool operandIsTrue = operand.isTrue(); + + operand.destroy(); + + if (! operandIsBoolean) { + THROW_ARANGO_EXCEPTION(TRI_ERROR_QUERY_INVALID_LOGICAL_VALUE); + } + + return AqlValue(new triagens::basics::Json(! operandIsTrue)); + } + else if (node->type == NODE_TYPE_OPERATOR_BINARY_AND || node->type == NODE_TYPE_OPERATOR_BINARY_OR) { TRI_document_collection_t const* leftCollection = nullptr;