1
0
Fork 0

Added CXX implementation for ROUND and RAND

This commit is contained in:
Michael Hackstein 2015-10-30 11:06:57 +01:00
parent 858a8ba4f8
commit ac1cf36daf
3 changed files with 34 additions and 10 deletions

View File

@ -144,9 +144,9 @@ std::unordered_map<std::string, Function const> const Executor::FunctionNames{
// numeric functions
{ "FLOOR", Function("FLOOR", "AQL_FLOOR", "n", true, true, false, true, true, &Functions::Floor) },
{ "CEIL", Function("CEIL", "AQL_CEIL", "n", true, true, false, true, true, &Functions::Ceil) },
{ "ROUND", Function("ROUND", "AQL_ROUND", "n", true, true, false, true, true) },
{ "ROUND", Function("ROUND", "AQL_ROUND", "n", true, true, false, true, true, &Functions::Round) },
{ "ABS", Function("ABS", "AQL_ABS", "n", true, true, false, true, true, &Functions::Abs) },
{ "RAND", Function("RAND", "AQL_RAND", "", false, false, false, true, true) },
{ "RAND", Function("RAND", "AQL_RAND", "", false, false, false, true, true, &Functions::Rand) },
{ "SQRT", Function("SQRT", "AQL_SQRT", "n", true, true, false, true, true, &Functions::Sqrt) },
// list functions

View File

@ -3043,7 +3043,7 @@ AqlValue Functions::Round (triagens::aql::Query* query,
Json inputJson = ExtractFunctionParameter(trx, parameters, 0, false);
double input = TRI_ToDoubleJson(inputJson.json());
input = round(input);
input = floor(input + 0.5); // Rounds down for < x.4999 and up for > x.50000
return AqlValue(new Json(input));
}
@ -3057,7 +3057,7 @@ AqlValue Functions::Abs (triagens::aql::Query* query,
size_t const n = parameters.size();
if (n != 1) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "ROUND", (int) 1, (int) 1);
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "ABS", (int) 1, (int) 1);
}
Json inputJson = ExtractFunctionParameter(trx, parameters, 0, false);
@ -3068,7 +3068,7 @@ AqlValue Functions::Abs (triagens::aql::Query* query,
}
////////////////////////////////////////////////////////////////////////////////
/// @brief function ABS
/// @brief function CEIL
////////////////////////////////////////////////////////////////////////////////
AqlValue Functions::Ceil (triagens::aql::Query* query,
@ -3077,7 +3077,7 @@ AqlValue Functions::Ceil (triagens::aql::Query* query,
size_t const n = parameters.size();
if (n != 1) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "ROUND", (int) 1, (int) 1);
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "CEIL", (int) 1, (int) 1);
}
Json inputJson = ExtractFunctionParameter(trx, parameters, 0, false);
@ -3088,7 +3088,7 @@ AqlValue Functions::Ceil (triagens::aql::Query* query,
}
////////////////////////////////////////////////////////////////////////////////
/// @brief function ABS
/// @brief function FLOOR
////////////////////////////////////////////////////////////////////////////////
AqlValue Functions::Floor (triagens::aql::Query* query,
@ -3097,7 +3097,7 @@ AqlValue Functions::Floor (triagens::aql::Query* query,
size_t const n = parameters.size();
if (n != 1) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "ROUND", (int) 1, (int) 1);
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "FLOOR", (int) 1, (int) 1);
}
Json inputJson = ExtractFunctionParameter(trx, parameters, 0, false);
@ -3108,7 +3108,7 @@ AqlValue Functions::Floor (triagens::aql::Query* query,
}
////////////////////////////////////////////////////////////////////////////////
/// @brief function ABS
/// @brief function SQRT
////////////////////////////////////////////////////////////////////////////////
AqlValue Functions::Sqrt (triagens::aql::Query* query,
@ -3117,7 +3117,7 @@ AqlValue Functions::Sqrt (triagens::aql::Query* query,
size_t const n = parameters.size();
if (n != 1) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "ROUND", (int) 1, (int) 1);
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "SQRT", (int) 1, (int) 1);
}
Json inputJson = ExtractFunctionParameter(trx, parameters, 0, false);
@ -3127,6 +3127,24 @@ AqlValue Functions::Sqrt (triagens::aql::Query* query,
return AqlValue(new Json(input));
}
////////////////////////////////////////////////////////////////////////////////
/// @brief function RAND
////////////////////////////////////////////////////////////////////////////////
AqlValue Functions::Rand (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
FunctionParameters const& parameters) {
size_t const n = parameters.size();
if (n != 0) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "RAND", (int) 0, (int) 0);
}
// This Random functionality is not too good yet...
double output = static_cast<double>(std::rand()) / RAND_MAX;
return AqlValue(new Json(output));
}
// -----------------------------------------------------------------------------
// --SECTION-- END-OF-FILE
// -----------------------------------------------------------------------------

View File

@ -119,6 +119,12 @@ namespace triagens {
static AqlValue Minus (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
static AqlValue Document (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
static AqlValue Edges (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
static AqlValue Round (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
static AqlValue Abs (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
static AqlValue Ceil (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
static AqlValue Floor (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
static AqlValue Sqrt (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
static AqlValue Rand (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
};
}