From 31dcdca4d3d858b571916abbf2241871a9ab2e4d Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Tue, 2 Aug 2016 16:56:21 +0200 Subject: [PATCH 1/2] fixed extraction of _id attribute in Traversal condition --- arangod/VocBase/Traverser.cpp | 21 +++++++++++++++++---- arangod/VocBase/Traverser.h | 3 ++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/arangod/VocBase/Traverser.cpp b/arangod/VocBase/Traverser.cpp index 2b24916fa4..72e0e801ce 100644 --- a/arangod/VocBase/Traverser.cpp +++ b/arangod/VocBase/Traverser.cpp @@ -211,19 +211,24 @@ void TraverserExpression::toVelocyPack(VPackBuilder& builder) const { //////////////////////////////////////////////////////////////////////////////// bool TraverserExpression::recursiveCheck(arangodb::aql::AstNode const* node, - arangodb::velocypack::Slice& element) const { + arangodb::velocypack::Slice& element, + arangodb::velocypack::Slice& base) const { + + base = arangodb::basics::VelocyPackHelper::EmptyObjectValue(); + switch (node->type) { case arangodb::aql::NODE_TYPE_REFERENCE: // We are on the variable access return true; case arangodb::aql::NODE_TYPE_ATTRIBUTE_ACCESS: { std::string name(node->getString()); - if (!recursiveCheck(node->getMember(0), element)) { + if (!recursiveCheck(node->getMember(0), element, base)) { return false; } if (!element.isObject() || !element.hasKey(name)) { return false; } + base = element; // set base object element = element.get(name); break; } @@ -232,7 +237,7 @@ bool TraverserExpression::recursiveCheck(arangodb::aql::AstNode const* node, if (!index->isIntValue()) { return false; } - if (!recursiveCheck(node->getMember(0), element)) { + if (!recursiveCheck(node->getMember(0), element, base)) { return false; } auto idx = index->getIntValue(); @@ -255,16 +260,24 @@ bool TraverserExpression::recursiveCheck(arangodb::aql::AstNode const* node, bool TraverserExpression::matchesCheck(arangodb::Transaction* trx, VPackSlice const& element) const { TRI_ASSERT(trx != nullptr); + VPackSlice base = arangodb::basics::VelocyPackHelper::EmptyObjectValue(); VPackSlice value = element.resolveExternal(); // initialize compare value to Null VPackSlice result = arangodb::basics::VelocyPackHelper::NullValue(); // perform recursive check. this may modify value - if (recursiveCheck(varAccess, value)) { + if (recursiveCheck(varAccess, value, base)) { result = value; } + // hack for _id attribute + TransactionBuilderLeaser builder(trx); + if (result.isCustom() && base.isObject()) { + builder->add(VPackValue(trx->extractIdString(base))); + result = builder->slice(); + } + TRI_ASSERT(compareTo != nullptr); VPackOptions* options = trx->transactionContext()->getVPackOptions(); diff --git a/arangod/VocBase/Traverser.h b/arangod/VocBase/Traverser.h index a262f6f1d6..eb0ed71978 100644 --- a/arangod/VocBase/Traverser.h +++ b/arangod/VocBase/Traverser.h @@ -81,7 +81,8 @@ class TraverserExpression { private: bool recursiveCheck(arangodb::aql::AstNode const*, - arangodb::velocypack::Slice&) const; + arangodb::velocypack::Slice& value, + arangodb::velocypack::Slice& base) const; // Required when creating this expression without AST std::vector> _nodeRegister; From 232d664843be53d66bf2dfe7b2af2c92074bf710 Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Tue, 2 Aug 2016 17:03:21 +0200 Subject: [PATCH 2/2] updated CHANGELOG --- CHANGELOG | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 13902a03da..8ddd2ce794 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -37,9 +37,21 @@ devel * Foxx OAuth2 module now correctly passes the `access_token` to the OAuth2 server -v3.0.4 (XXXX-XX-XX) +v3.0.5 (XXXX-XX-XX) ------------------- +* fixed extraction of _id attribute in AQL traversal conditions + + +v3.0.4 (2016-08-01) +------------------- + +* added missing lock for periodic jobs access + +* fix multiple foxx related cluster issues + +* fix handling of empty AQL query strings + * fixed issue in `INTERSECTION` AQL function with duplicate elements in the source arrays