From 4637d0ff406f92c920c651eb95b048476233db89 Mon Sep 17 00:00:00 2001 From: Michael Hackstein Date: Fri, 1 Apr 2016 11:38:44 +0200 Subject: [PATCH] Fixed api/edges in Cluster --- arangod/RestHandler/RestEdgesHandler.cpp | 54 ++++++++++++++++++------ arangod/RestHandler/RestEdgesHandler.h | 2 +- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/arangod/RestHandler/RestEdgesHandler.cpp b/arangod/RestHandler/RestEdgesHandler.cpp index e4269f6cee..c0de4f7dd8 100644 --- a/arangod/RestHandler/RestEdgesHandler.cpp +++ b/arangod/RestHandler/RestEdgesHandler.cpp @@ -133,14 +133,13 @@ bool RestEdgesHandler::getEdgesForVertexList( bool RestEdgesHandler::getEdgesForVertex( std::string const& id, + std::string const& collectionName, std::vector const& expressions, TRI_edge_direction_e direction, SingleCollectionTransaction& trx, VPackBuilder& result, size_t& scannedIndex, size_t& filtered) { trx.orderDitch(trx.cid()); // will throw when it fails - std::string const collectionName - = trx.resolver()->getCollectionName(trx.cid()); Transaction::IndexHandle indexId = trx.edgeIndexHandle(collectionName); VPackBuilder searchValueBuilder; @@ -285,11 +284,6 @@ bool RestEdgesHandler::readEdges( return false; } - // If we are a DBserver, we want to use the cluster-wide collection - // name for error reporting: - if (ServerState::instance()->isDBServer()) { - collectionName = trx.resolver()->getCollectionName(trx.cid()); - } size_t filtered = 0; size_t scannedIndex = 0; @@ -299,8 +293,10 @@ bool RestEdgesHandler::readEdges( // build edges resultBuilder.add(VPackValue("edges")); // only key resultBuilder.openArray(); - bool ok = getEdgesForVertex(startVertex, expressions, direction, trx, - resultBuilder, scannedIndex, filtered); + // NOTE: collecitonName is the shard-name in DBServer case + bool ok = + getEdgesForVertex(startVertex, collectionName, expressions, direction, + trx, resultBuilder, scannedIndex, filtered); resultBuilder.close(); res = trx.finish(res); @@ -310,6 +306,11 @@ bool RestEdgesHandler::readEdges( } if (res != TRI_ERROR_NO_ERROR) { + if (ServerState::instance()->isDBServer()) { + // If we are a DBserver, we want to use the cluster-wide collection + // name for error reporting: + collectionName = trx.resolver()->getCollectionName(trx.cid()); + } generateTransactionError(collectionName, res, ""); return false; } @@ -349,6 +350,9 @@ bool RestEdgesHandler::readEdgesForMultipleVertices() { parseVelocyPackBody(&VPackOptions::Defaults, parseSuccess); if (!parseSuccess) { + generateError(HttpResponse::BAD, TRI_ERROR_HTTP_BAD_PARAMETER, + "expected POST " + EDGES_PATH + + "/?direction="); // A body is required return false; } @@ -394,11 +398,34 @@ bool RestEdgesHandler::readEdgesForMultipleVertices() { return false; } + std::vector const expressions; if (ServerState::instance()->isCoordinator()) { - // This API is only for internal use on DB servers and is not (yet) allowed - // to - // be executed on the coordinator - return false; + arangodb::rest::HttpResponse::HttpResponseCode responseCode; + std::string contentType; + arangodb::basics::Json resultDocument(arangodb::basics::Json::Object, 3); + + for (auto const& it : VPackArrayIterator(body)) { + if (it.isString()) { + std::string vertexString(it.copyString()); + + int res = getFilteredEdgesOnCoordinator( + _vocbase->_name, collectionName, vertexString, direction, expressions, + responseCode, contentType, resultDocument); + if (res != TRI_ERROR_NO_ERROR) { + generateError(responseCode, res); + return false; + } + } + } + + resultDocument.set("error", arangodb::basics::Json(false)); + resultDocument.set("code", arangodb::basics::Json(200)); + + VPackBuilder tmp; + arangodb::basics::JsonHelper::toVelocyPack(resultDocument.json(), tmp); + generateResult(HttpResponse::HttpResponseCode::OK, tmp.slice()); + + return true; } // find and load collection given by name or identifier @@ -423,7 +450,6 @@ bool RestEdgesHandler::readEdgesForMultipleVertices() { size_t filtered = 0; size_t scannedIndex = 0; - std::vector const expressions; VPackBuilder resultBuilder; resultBuilder.openObject(); diff --git a/arangod/RestHandler/RestEdgesHandler.h b/arangod/RestHandler/RestEdgesHandler.h index 09c93e5118..1d4c39d91e 100644 --- a/arangod/RestHandler/RestEdgesHandler.h +++ b/arangod/RestHandler/RestEdgesHandler.h @@ -70,7 +70,7 @@ class RestEdgesHandler : public RestVocbaseBaseHandler { ////////////////////////////////////////////////////////////////////////////// bool getEdgesForVertex( - std::string const& id, + std::string const& id, std::string const& collectionName, std::vector const& expressions, TRI_edge_direction_e direction, SingleCollectionTransaction& trx, arangodb::velocypack::Builder&, size_t& scannedIndex, size_t& filtered);