mirror of https://gitee.com/bigwinds/arangodb
Added more VPackStyle functions: firstDocument firstArray push.
This commit is contained in:
parent
7976903c43
commit
acbc7cdad2
|
@ -632,7 +632,6 @@ static bool ListContainsElement(Json const& list, Json const& testee) {
|
||||||
return ListContainsElement(list, testee, unused);
|
return ListContainsElement(list, testee, unused);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static bool ListContainsElement(VPackSlice const& list,
|
static bool ListContainsElement(VPackSlice const& list,
|
||||||
VPackSlice const& testee, size_t& index) {
|
VPackSlice const& testee, size_t& index) {
|
||||||
TRI_ASSERT(list.isArray());
|
TRI_ASSERT(list.isArray());
|
||||||
|
@ -645,14 +644,11 @@ static bool ListContainsElement(VPackSlice const& list,
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static bool ListContainsElement(VPackSlice const& list, VPackSlice const& testee) {
|
static bool ListContainsElement(VPackSlice const& list, VPackSlice const& testee) {
|
||||||
size_t unused;
|
size_t unused;
|
||||||
return ListContainsElement(list, testee, unused);
|
return ListContainsElement(list, testee, unused);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief Computes the Variance of the given list.
|
/// @brief Computes the Variance of the given list.
|
||||||
|
@ -6757,6 +6753,10 @@ AqlValue$ Functions::RandVPack(arangodb::aql::Query* query,
|
||||||
AqlValue Functions::FirstDocument(arangodb::aql::Query* query,
|
AqlValue Functions::FirstDocument(arangodb::aql::Query* query,
|
||||||
arangodb::AqlTransaction* trx,
|
arangodb::AqlTransaction* trx,
|
||||||
FunctionParameters const& parameters) {
|
FunctionParameters const& parameters) {
|
||||||
|
#ifdef TMPUSEVPACK
|
||||||
|
auto tmp = transformParameters(parameters, trx);
|
||||||
|
return AqlValue(FirstDocumentVPack(query, trx, tmp));
|
||||||
|
#else
|
||||||
size_t const n = parameters.size();
|
size_t const n = parameters.size();
|
||||||
for (size_t i = 0; i < n; ++i) {
|
for (size_t i = 0; i < n; ++i) {
|
||||||
Json element = ExtractFunctionParameter(trx, parameters, i, false);
|
Json element = ExtractFunctionParameter(trx, parameters, i, false);
|
||||||
|
@ -6766,6 +6766,22 @@ AqlValue Functions::FirstDocument(arangodb::aql::Query* query,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return AqlValue(new Json(Json::Null));
|
return AqlValue(new Json(Json::Null));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
AqlValue$ Functions::FirstDocumentVPack(
|
||||||
|
arangodb::aql::Query* query, arangodb::AqlTransaction* trx,
|
||||||
|
VPackFunctionParameters const& parameters) {
|
||||||
|
size_t const n = parameters.size();
|
||||||
|
for (size_t i = 0; i < n; ++i) {
|
||||||
|
VPackSlice element = ExtractFunctionParameter(trx, parameters, i);
|
||||||
|
if (element.isObject()) {
|
||||||
|
return AqlValue$(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::shared_ptr<VPackBuilder> b = query->getSharedBuilder();
|
||||||
|
b->add(VPackValue(VPackValueType::Null));
|
||||||
|
return AqlValue$(b.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -6775,6 +6791,10 @@ AqlValue Functions::FirstDocument(arangodb::aql::Query* query,
|
||||||
AqlValue Functions::FirstList(arangodb::aql::Query* query,
|
AqlValue Functions::FirstList(arangodb::aql::Query* query,
|
||||||
arangodb::AqlTransaction* trx,
|
arangodb::AqlTransaction* trx,
|
||||||
FunctionParameters const& parameters) {
|
FunctionParameters const& parameters) {
|
||||||
|
#ifdef TMPUSEVPACK
|
||||||
|
auto tmp = transformParameters(parameters, trx);
|
||||||
|
return AqlValue(RandVPack(query, trx, tmp));
|
||||||
|
#else
|
||||||
size_t const n = parameters.size();
|
size_t const n = parameters.size();
|
||||||
for (size_t i = 0; i < n; ++i) {
|
for (size_t i = 0; i < n; ++i) {
|
||||||
Json element = ExtractFunctionParameter(trx, parameters, i, false);
|
Json element = ExtractFunctionParameter(trx, parameters, i, false);
|
||||||
|
@ -6784,6 +6804,22 @@ AqlValue Functions::FirstList(arangodb::aql::Query* query,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return AqlValue(new Json(Json::Null));
|
return AqlValue(new Json(Json::Null));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
AqlValue$ Functions::FirstListVPack(arangodb::aql::Query* query,
|
||||||
|
arangodb::AqlTransaction* trx,
|
||||||
|
VPackFunctionParameters const& parameters) {
|
||||||
|
size_t const n = parameters.size();
|
||||||
|
for (size_t i = 0; i < n; ++i) {
|
||||||
|
VPackSlice element = ExtractFunctionParameter(trx, parameters, i);
|
||||||
|
if (element.isArray()) {
|
||||||
|
return AqlValue$(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::shared_ptr<VPackBuilder> b = query->getSharedBuilder();
|
||||||
|
b->add(VPackValue(VPackValueType::Null));
|
||||||
|
return AqlValue$(b.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -6793,6 +6829,10 @@ AqlValue Functions::FirstList(arangodb::aql::Query* query,
|
||||||
AqlValue Functions::Push(arangodb::aql::Query* query,
|
AqlValue Functions::Push(arangodb::aql::Query* query,
|
||||||
arangodb::AqlTransaction* trx,
|
arangodb::AqlTransaction* trx,
|
||||||
FunctionParameters const& parameters) {
|
FunctionParameters const& parameters) {
|
||||||
|
#ifdef TMPUSEVPACK
|
||||||
|
auto tmp = transformParameters(parameters, trx);
|
||||||
|
return AqlValue(PushVPack(query, trx, tmp));
|
||||||
|
#else
|
||||||
size_t const n = parameters.size();
|
size_t const n = parameters.size();
|
||||||
if (n != 2 && n != 3) {
|
if (n != 2 && n != 3) {
|
||||||
THROW_ARANGO_EXCEPTION_PARAMS(
|
THROW_ARANGO_EXCEPTION_PARAMS(
|
||||||
|
@ -6821,6 +6861,44 @@ AqlValue Functions::Push(arangodb::aql::Query* query,
|
||||||
RegisterWarning(query, "PUSH",
|
RegisterWarning(query, "PUSH",
|
||||||
TRI_ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH);
|
TRI_ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH);
|
||||||
return AqlValue(new Json(Json::Null));
|
return AqlValue(new Json(Json::Null));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
AqlValue$ Functions::PushVPack(arangodb::aql::Query* query,
|
||||||
|
arangodb::AqlTransaction* trx,
|
||||||
|
VPackFunctionParameters const& parameters) {
|
||||||
|
size_t const n = parameters.size();
|
||||||
|
if (n != 2 && n != 3) {
|
||||||
|
THROW_ARANGO_EXCEPTION_PARAMS(
|
||||||
|
TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "PUSH", (int)2,
|
||||||
|
(int)3);
|
||||||
|
}
|
||||||
|
VPackSlice list = ExtractFunctionParameter(trx, parameters, 0);
|
||||||
|
VPackSlice toPush = ExtractFunctionParameter(trx, parameters, 1);
|
||||||
|
|
||||||
|
std::shared_ptr<VPackBuilder> b = query->getSharedBuilder();
|
||||||
|
if (list.isNull()) {
|
||||||
|
VPackArrayBuilder guard(b.get());
|
||||||
|
b->add(toPush);
|
||||||
|
} else if (list.isArray()) {
|
||||||
|
VPackArrayBuilder guard(b.get());
|
||||||
|
for (auto const& it : VPackArrayIterator(list)) {
|
||||||
|
b->add(it);
|
||||||
|
}
|
||||||
|
if (n == 3) {
|
||||||
|
VPackSlice unique = ExtractFunctionParameter(trx, parameters, 2);
|
||||||
|
if (!ValueToBoolean(unique) || !ListContainsElement(list, toPush)) {
|
||||||
|
b->add(toPush);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
b->add(toPush);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
RegisterWarning(query, "PUSH",
|
||||||
|
TRI_ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH);
|
||||||
|
b->add(VPackValue(VPackValueType::Null));
|
||||||
|
}
|
||||||
|
return AqlValue$(b.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -348,6 +348,18 @@ struct Functions {
|
||||||
VPackFunctionParameters const&);
|
VPackFunctionParameters const&);
|
||||||
static AqlValue$ RandVPack(arangodb::aql::Query*, arangodb::AqlTransaction*,
|
static AqlValue$ RandVPack(arangodb::aql::Query*, arangodb::AqlTransaction*,
|
||||||
VPackFunctionParameters const&);
|
VPackFunctionParameters const&);
|
||||||
|
static AqlValue$ FirstDocumentVPack(arangodb::aql::Query*,
|
||||||
|
arangodb::AqlTransaction*,
|
||||||
|
VPackFunctionParameters const&);
|
||||||
|
static AqlValue$ FirstListVPack(arangodb::aql::Query*,
|
||||||
|
arangodb::AqlTransaction*,
|
||||||
|
VPackFunctionParameters const&);
|
||||||
|
static AqlValue$ PushVPack(arangodb::aql::Query*, arangodb::AqlTransaction*,
|
||||||
|
VPackFunctionParameters const&);
|
||||||
|
static AqlValue$ PopVPack(arangodb::aql::Query*, arangodb::AqlTransaction*,
|
||||||
|
VPackFunctionParameters const&);
|
||||||
|
static AqlValue$ AppendVPack(arangodb::aql::Query*, arangodb::AqlTransaction*,
|
||||||
|
VPackFunctionParameters const&);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue