1
0
Fork 0

Fixed invalid traversal optimization if vertex is not existing but filter would let null pass

This commit is contained in:
Michael Hackstein 2015-12-04 11:21:15 +01:00
parent 07e1bac837
commit 9495117238
2 changed files with 27 additions and 8 deletions

View File

@ -777,8 +777,14 @@ Json* SingleServerTraversalPath::vertexToJson (Transaction* trx,
}
}
TRI_doc_mptr_copy_t mptr;
trx->readSingle(collection, &mptr, v.key);
int res = trx->readSingle(collection, &mptr, v.key);
++_readDocuments;
if (res != TRI_ERROR_NO_ERROR) {
if (res == TRI_ERROR_ARANGO_DOCUMENT_NOT_FOUND) {
return new Json(Json::Null);
}
THROW_ARANGO_EXCEPTION(res);
}
return new Json(TRI_ExpandShapedJson(
collection->_collection->_collection->getShaper(),
resolver,
@ -849,8 +855,22 @@ bool DepthFirstTraverser::vertexMatchesConditions (VertexId const& v, size_t dep
int res = _trx->readSingle(collection, &mptr, v.key);
++_readDocuments;
if (res != TRI_ERROR_NO_ERROR) {
// Vertex does not exist. Do not try filter
return false;
if (res == TRI_ERROR_ARANGO_DOCUMENT_NOT_FOUND) {
// Vertex does not exist. Do not try filter
triagens::basics::Json tmp(triagens::basics::Json::Null);
// This needs a different check method now.
// Innerloop here
for (auto const& exp2 : it->second) {
if (! exp2->isEdgeAccess) {
if (! exp2->matchesCheck(tmp.json())) {
++_filteredPaths;
return false;
}
}
}
return true;
}
THROW_ARANGO_EXCEPTION(res);
}
docCol = collection->_collection->_collection;
}

View File

@ -30,7 +30,6 @@
#include "Traverser.h"
#include "Basics/json-utilities.h"
#include "VocBase/KeyGenerator.h"
#include <iostream>
using TraverserExpression = triagens::arango::traverser::TraverserExpression;
@ -153,11 +152,11 @@ bool TraverserExpression::recursiveCheck (triagens::aql::AstNode const* node,
////////////////////////////////////////////////////////////////////////////////
bool TraverserExpression::matchesCheck (DocumentAccessor& accessor) const {
if (! recursiveCheck(varAccess, accessor)) {
return false;
}
triagens::basics::Json result = accessor.toJson();
triagens::basics::Json result(triagens::basics::Json::Null);
if (recursiveCheck(varAccess, accessor)) {
result = accessor.toJson();
}
TRI_ASSERT(compareTo != nullptr);
TRI_ASSERT(compareTo->json() != nullptr);