mirror of https://gitee.com/bigwinds/arangodb
Added Files for Cluster Traverser.
This commit is contained in:
parent
b7a8a364fc
commit
9a95e1d36b
|
@ -0,0 +1,155 @@
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief Cluster Traverser
|
||||
///
|
||||
/// @file
|
||||
///
|
||||
/// DISCLAIMER
|
||||
///
|
||||
/// Copyright 2014-2015 ArangoDB GmbH, Cologne, Germany
|
||||
/// Copyright 2004-2014 triAGENS GmbH, Cologne, Germany
|
||||
///
|
||||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
/// you may not use this file except in compliance with the License.
|
||||
/// You may obtain a copy of the License at
|
||||
///
|
||||
/// http://www.apache.org/licenses/LICENSE-2.0
|
||||
///
|
||||
/// Unless required by applicable law or agreed to in writing, software
|
||||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
/// See the License for the specific language governing permissions and
|
||||
/// limitations under the License.
|
||||
///
|
||||
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
///
|
||||
/// @author Michael Hackstein
|
||||
/// @author Copyright 2014-2015, ArangoDB GmbH, Cologne, Germany
|
||||
/// @author Copyright 2012-2013, triAGENS GmbH, Cologne, Germany
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "Cluster/ClusterTraverser.h"
|
||||
|
||||
using ClusterTraversalPath = triagens::arango::traverser::ClusterTraversalPath;
|
||||
using ClusterTraverser = triagens::arango::traverser::ClusterTraverser;
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// --SECTION-- class ClusterTraversalPath
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
triagens::basics::Json* ClusterTraversalPath::pathToJson (Transaction*,
|
||||
CollectionNameResolver*) const {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
triagens::basics::Json* ClusterTraversalPath::lastEdgeToJson (Transaction*,
|
||||
CollectionNameResolver*) const {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
triagens::basics::Json* ClusterTraversalPath::lastVertexToJson (Transaction*,
|
||||
CollectionNameResolver*) const {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// --SECTION-- class ClusterTraverser
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
std::string ClusterTraverser::VertexGetter::operator() (std::string const& edgeId,
|
||||
std::string const& vertexId) {
|
||||
auto it = _edges->find(edgeId);
|
||||
std::string def = "";
|
||||
if (it != _edges->end()) {
|
||||
std::string from = triagens::basics::JsonHelper::getStringValue(it->second, "_from", def);
|
||||
if (from != vertexId) {
|
||||
return from;
|
||||
}
|
||||
std::string to = triagens::basics::JsonHelper::getStringValue(it->second, "_to", def);
|
||||
return to;
|
||||
}
|
||||
return def;
|
||||
}
|
||||
|
||||
void ClusterTraverser::EdgeGetter::operator() (std::string const& startVertex,
|
||||
std::vector<std::string>& result,
|
||||
size_t*& last,
|
||||
size_t& eColIdx,
|
||||
bool&) {
|
||||
// TRI_ASSERT(eColIdx < _edgeCols->size());
|
||||
if (last == nullptr) {
|
||||
TRI_ASSERT(_traverser->_iteratorCache.size() == result.size());
|
||||
// We have to request the next level
|
||||
}
|
||||
else {
|
||||
std::stack<std::string> tmp = _traverser->_iteratorCache.top();
|
||||
if (tmp.empty()) {
|
||||
_traverser->_iteratorCache.pop();
|
||||
last = nullptr;
|
||||
}
|
||||
else {
|
||||
std::string next = tmp.top();
|
||||
tmp.pop();
|
||||
result.push_back(next);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
void ClusterTraverser::defineInternalFunctions () {
|
||||
|
||||
auto direction = _opts.direction;
|
||||
auto edgeCols = _edgeCols;
|
||||
_getEdge = [&edgeCols, &_iteratorCache] (std::string& startVertex, std::vector<std::string>& result, size_t*& last, size_t& eColIdx, bool&) {
|
||||
if (last == nullptr) {
|
||||
TRI_ASSERT(_iteratorCache.size() == result.size());
|
||||
// We have to request the next level
|
||||
// TODO
|
||||
}
|
||||
else {
|
||||
std::stack<std::string> tmp = _iteratorCache.top();
|
||||
if (tmp.empty()) {
|
||||
_iteratorCache.pop();
|
||||
last = nullptr;
|
||||
}
|
||||
else {
|
||||
result.push_back(tmp.pop());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
void ClusterTraverser::setStartVertex (VertexId& v) {
|
||||
// TODO
|
||||
std::string id = "";
|
||||
_enumerator.reset(new triagens::basics::PathEnumerator<std::string, std::string, size_t> (_edgeGetter, _vertexGetter, id));
|
||||
_done = false;
|
||||
}
|
||||
|
||||
const triagens::arango::traverser::TraversalPath* ClusterTraverser::next () {
|
||||
TRI_ASSERT(!_done);
|
||||
if (_pruneNext) {
|
||||
_pruneNext = false;
|
||||
_enumerator->prune();
|
||||
}
|
||||
TRI_ASSERT(!_pruneNext);
|
||||
const triagens::basics::EnumeratedPath<std::string, std::string>& path = _enumerator->next();
|
||||
size_t countEdges = path.edges.size();
|
||||
if (countEdges == 0) {
|
||||
_done = true;
|
||||
// Done traversing
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::unique_ptr<ClusterTraversalPath> p(new ClusterTraversalPath(this, path));
|
||||
if (_opts.shouldPrunePath(p.get())) {
|
||||
_enumerator->prune();
|
||||
return next();
|
||||
}
|
||||
if (countEdges >= _opts.maxDepth) {
|
||||
_pruneNext = true;
|
||||
}
|
||||
if (countEdges < _opts.minDepth) {
|
||||
return next();
|
||||
}
|
||||
return p.release();
|
||||
}
|
|
@ -0,0 +1,157 @@
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief Cluster Traverser
|
||||
///
|
||||
/// @file
|
||||
///
|
||||
/// DISCLAIMER
|
||||
///
|
||||
/// Copyright 2014-2015 ArangoDB GmbH, Cologne, Germany
|
||||
/// Copyright 2004-2014 triAGENS GmbH, Cologne, Germany
|
||||
///
|
||||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
/// you may not use this file except in compliance with the License.
|
||||
/// You may obtain a copy of the License at
|
||||
///
|
||||
/// http://www.apache.org/licenses/LICENSE-2.0
|
||||
///
|
||||
/// Unless required by applicable law or agreed to in writing, software
|
||||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
/// See the License for the specific language governing permissions and
|
||||
/// limitations under the License.
|
||||
///
|
||||
/// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
///
|
||||
/// @author Michael Hackstein
|
||||
/// @author Copyright 2014-2015, ArangoDB GmbH, Cologne, Germany
|
||||
/// @author Copyright 2012-2013, triAGENS GmbH, Cologne, Germany
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef ARANGODB_CLUSTER_CLUSTERTRAVERSER_H
|
||||
#define ARANGODB_CLUSTER_CLUSTERTRAVERSER_H 1
|
||||
|
||||
#include "VocBase/Traverser.h"
|
||||
|
||||
namespace triagens {
|
||||
namespace arango {
|
||||
namespace traverser {
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// --SECTION-- class ClusterTraverser
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
class ClusterTraverser : public Traverser {
|
||||
|
||||
public:
|
||||
|
||||
ClusterTraverser ()
|
||||
: Traverser(),
|
||||
_vertexGetter(&_edges),
|
||||
_edgeGetter(this) {
|
||||
}
|
||||
|
||||
~ClusterTraverser () {
|
||||
}
|
||||
|
||||
void setStartVertex (VertexId& v) override;
|
||||
|
||||
const TraversalPath* next () override;
|
||||
|
||||
private:
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// --SECTION-- private classes
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
class VertexGetter {
|
||||
|
||||
public:
|
||||
|
||||
VertexGetter (std::unordered_map<std::string, TRI_json_t*> const* edges)
|
||||
: _edges(edges) {
|
||||
}
|
||||
|
||||
std::string operator() (std::string const&, std::string const&);
|
||||
|
||||
private:
|
||||
|
||||
std::unordered_map<std::string, TRI_json_t*> const* _edges;
|
||||
|
||||
};
|
||||
|
||||
class EdgeGetter {
|
||||
|
||||
public:
|
||||
|
||||
EdgeGetter (ClusterTraverser* traverser)
|
||||
: _traverser(traverser) {
|
||||
}
|
||||
|
||||
void operator() (std::string const&,
|
||||
std::vector<std::string>&,
|
||||
size_t*&,
|
||||
size_t&,
|
||||
bool&);
|
||||
|
||||
private:
|
||||
|
||||
ClusterTraverser* _traverser;
|
||||
|
||||
|
||||
};
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// --SECTION-- private functions
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
void defineInternalFunctions ();
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// --SECTION-- private variables
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
std::unordered_map<std::string, TRI_json_t*> _edges;
|
||||
|
||||
std::unordered_map<std::string, TRI_json_t*> _vertices;
|
||||
|
||||
std::stack<std::stack<std::string>> _iteratorCache;
|
||||
|
||||
VertexGetter _vertexGetter;
|
||||
|
||||
EdgeGetter _edgeGetter;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief internal cursor to enumerate the paths of a graph
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
std::unique_ptr<triagens::basics::PathEnumerator<std::string,
|
||||
std::string,
|
||||
size_t>> _enumerator;
|
||||
|
||||
};
|
||||
|
||||
class ClusterTraversalPath : public TraversalPath {
|
||||
|
||||
public:
|
||||
|
||||
ClusterTraversalPath (ClusterTraverser* traverser, const triagens::basics::EnumeratedPath<std::string, std::string>& path) {
|
||||
}
|
||||
|
||||
triagens::basics::Json* pathToJson (Transaction*,
|
||||
CollectionNameResolver*) const;
|
||||
|
||||
triagens::basics::Json* lastEdgeToJson (Transaction*,
|
||||
CollectionNameResolver*) const;
|
||||
|
||||
triagens::basics::Json* lastVertexToJson (Transaction*,
|
||||
CollectionNameResolver*) const;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
} // traverser
|
||||
} // arango
|
||||
} // triagens
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue