1
0
Fork 0

issue #1593: add POW() AQL function

This commit is contained in:
Jan Steemann 2015-12-02 15:40:26 +01:00
parent 460b51734e
commit 61a8e4c686
6 changed files with 1711 additions and 0 deletions

View File

@ -1,6 +1,8 @@
v2.8.0 (XXXX-XX-XX)
-------------------
* issue #1593: added AQL `POW` function for exponentation
* added cluster execution site info in explain output for AQL queries
* replication improvements:

View File

@ -149,6 +149,7 @@ std::unordered_map<std::string, Function const> const Executor::FunctionNames{
{ "ABS", Function("ABS", "AQL_ABS", "n", true, true, false, true, true, &Functions::Abs) },
{ "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) },
{ "POW", Function("POW", "AQL_POW", "n,n", true, true, false, true, true, &Functions::Pow) },
// list functions
{ "RANGE", Function("RANGE", "AQL_RANGE", "n,n|n", true, true, false, true, true, &Functions::Range) },

View File

@ -3486,9 +3486,38 @@ AqlValue Functions::Sqrt (triagens::aql::Query* query,
bool unused = false;
double input = TRI_ToDoubleJson(inputJson.json(), unused);
input = sqrt(input);
if (std::isnan(input)) {
return AqlValue(new Json(Json::Null));
}
return AqlValue(new Json(input));
}
////////////////////////////////////////////////////////////////////////////////
/// @brief function POW
////////////////////////////////////////////////////////////////////////////////
AqlValue Functions::Pow (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx,
FunctionParameters const& parameters) {
size_t const n = parameters.size();
if (n != 2) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "POW", (int) 2, (int) 2);
}
Json baseJson = ExtractFunctionParameter(trx, parameters, 0, false);
Json expJson = ExtractFunctionParameter(trx, parameters, 1, false);
bool unused = false;
double base = TRI_ToDoubleJson(baseJson.json(), unused);
double exp = TRI_ToDoubleJson(expJson.json(), unused);
base = pow(base, exp);
if (std::isnan(base) || ! std::isfinite(base)) {
return AqlValue(new Json(Json::Null));
}
return AqlValue(new Json(base));
}
////////////////////////////////////////////////////////////////////////////////
/// @brief function RAND
////////////////////////////////////////////////////////////////////////////////

View File

@ -129,6 +129,7 @@ namespace triagens {
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 Pow (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
static AqlValue Rand (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
static AqlValue FirstDocument (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
static AqlValue FirstList (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);

View File

@ -2767,6 +2767,16 @@ function AQL_SQRT (value) {
return NUMERIC_VALUE(Math.sqrt(AQL_TO_NUMBER(value)));
}
////////////////////////////////////////////////////////////////////////////////
/// @brief exponentation
////////////////////////////////////////////////////////////////////////////////
function AQL_POW (base, exp) {
'use strict';
return NUMERIC_VALUE(Math.pow(AQL_TO_NUMBER(base), AQL_TO_NUMBER(exp)));
}
// -----------------------------------------------------------------------------
// --SECTION-- list processing functions
// -----------------------------------------------------------------------------
@ -9154,6 +9164,7 @@ exports.AQL_ROUND = AQL_ROUND;
exports.AQL_ABS = AQL_ABS;
exports.AQL_RAND = AQL_RAND;
exports.AQL_SQRT = AQL_SQRT;
exports.AQL_POW = AQL_POW;
exports.AQL_LENGTH = AQL_LENGTH;
exports.AQL_FIRST = AQL_FIRST;
exports.AQL_LAST = AQL_LAST;

File diff suppressed because it is too large Load Diff