コード例 #1
0
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;
}