bool RestEdgesHandler::getEdgesForVertex (std::string const& id, std::vector<traverser::TraverserExpression*> const& expressions, TRI_edge_direction_e direction, SingleCollectionReadOnlyTransaction& trx, triagens::basics::Json& result, size_t& scannedIndex, size_t& filtered) { triagens::arango::traverser::VertexId start; try { start = triagens::arango::traverser::IdStringToVertexId ( trx.resolver(), id ); } catch (triagens::basics::Exception& e) { handleError(e); return false; } TRI_document_collection_t* docCol = trx.trxCollection()->_collection->_collection; std::vector<TRI_doc_mptr_copy_t>&& edges = TRI_LookupEdgesDocumentCollection( docCol, direction, start.cid, const_cast<char*>(start.key) ); // generate result result.reserve(edges.size()); scannedIndex += edges.size(); if (expressions.empty()) { for (auto& e : edges) { DocumentAccessor da(trx.resolver(), docCol, &e); result.add(da.toJson()); } } else { for (auto& e : edges) { bool add = true; // Expressions symbolize an and, so all have to be matched for (auto& exp : expressions) { if (exp->isEdgeAccess && ! exp->matchesCheck(e, docCol, trx.resolver())) { ++filtered; add = false; break; } } if (add) { DocumentAccessor da(trx.resolver(), docCol, &e); result.add(da.toJson()); } } } return true; }