mirror of https://gitee.com/bigwinds/arangodb
Merge branch 'devel' of github.com:triAGENS/ArangoDB into devel
This commit is contained in:
commit
7dac9d8cc7
|
@ -3862,6 +3862,25 @@ size_t ScatterBlock::getClientId (std::string const& shardId) {
|
||||||
return ((*it).second);
|
return ((*it).second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// --SECTION-- class DistributeBlock
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief constructor
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
DistributeBlock::DistributeBlock (ExecutionEngine* engine,
|
||||||
|
DistributeNode const* ep,
|
||||||
|
std::vector<std::string> const& shardIds)
|
||||||
|
: ExecutionBlock(engine, ep),
|
||||||
|
_nrClients(shardIds.size()){
|
||||||
|
_shardIdMap.reserve(_nrClients);
|
||||||
|
for (size_t i = 0; i < _nrClients; i++) {
|
||||||
|
_shardIdMap.emplace(std::make_pair(shardIds[i], i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- class RemoteBlock
|
// --SECTION-- class RemoteBlock
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
|
@ -1664,6 +1664,59 @@ namespace triagens {
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
// --SECTION-- DistributeBlock
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class DistributeBlock : public ExecutionBlock {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief constructor
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
DistributeBlock (ExecutionEngine* engine,
|
||||||
|
DistributeNode const* ep,
|
||||||
|
std::vector<std::string> const& shardIds);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief destructor
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
~DistributeBlock () {
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief initialize
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
int initialize () {
|
||||||
|
return ExecutionBlock::initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief getClientId: get the number <clientId> (used internally)
|
||||||
|
/// corresponding to <shardId>
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
size_t getClientId (std::string const& shardId);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief _shardIdMap: map from shardIds to clientNrs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
std::unordered_map<std::string, size_t> _shardIdMap;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief _nrClients: total number of clients
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
size_t _nrClients;
|
||||||
|
|
||||||
|
};
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- RemoteBlock
|
// --SECTION-- RemoteBlock
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,12 @@ static ExecutionBlock* createBlock (ExecutionEngine* engine,
|
||||||
static_cast<ScatterNode const*>(en),
|
static_cast<ScatterNode const*>(en),
|
||||||
shardIds);
|
shardIds);
|
||||||
}
|
}
|
||||||
|
case ExecutionNode::DISTRIBUTE: {
|
||||||
|
auto&& shardIds = static_cast<DistributeNode const*>(en)->collection()->shardIds();
|
||||||
|
return new DistributeBlock(engine,
|
||||||
|
static_cast<DistributeNode const*>(en),
|
||||||
|
shardIds);
|
||||||
|
}
|
||||||
case ExecutionNode::GATHER: {
|
case ExecutionNode::GATHER: {
|
||||||
return new GatherBlock(engine,
|
return new GatherBlock(engine,
|
||||||
static_cast<GatherNode const*>(en));
|
static_cast<GatherNode const*>(en));
|
||||||
|
|
|
@ -199,6 +199,8 @@ ExecutionNode* ExecutionNode::fromJsonFactory (ExecutionPlan* plan,
|
||||||
}
|
}
|
||||||
case SCATTER:
|
case SCATTER:
|
||||||
return new ScatterNode(plan, oneNode);
|
return new ScatterNode(plan, oneNode);
|
||||||
|
case DISTRIBUTE:
|
||||||
|
return new DistributeNode(plan, oneNode);
|
||||||
case ILLEGAL: {
|
case ILLEGAL: {
|
||||||
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, "invalid node type");
|
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, "invalid node type");
|
||||||
}
|
}
|
||||||
|
@ -898,6 +900,7 @@ void ExecutionNode::VarOverview::after (ExecutionNode *en) {
|
||||||
case ExecutionNode::FILTER:
|
case ExecutionNode::FILTER:
|
||||||
case ExecutionNode::LIMIT:
|
case ExecutionNode::LIMIT:
|
||||||
case ExecutionNode::SCATTER:
|
case ExecutionNode::SCATTER:
|
||||||
|
case ExecutionNode::DISTRIBUTE:
|
||||||
case ExecutionNode::GATHER:
|
case ExecutionNode::GATHER:
|
||||||
case ExecutionNode::REMOTE:
|
case ExecutionNode::REMOTE:
|
||||||
case ExecutionNode::NORESULTS: {
|
case ExecutionNode::NORESULTS: {
|
||||||
|
@ -2356,6 +2359,26 @@ void ScatterNode::toJsonHelper (triagens::basics::Json& nodes,
|
||||||
nodes(json);
|
nodes(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// --SECTION-- methods of DistributeNode
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief construct a distribute node from JSON
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
DistributeNode::DistributeNode (ExecutionPlan* plan,
|
||||||
|
triagens::basics::Json const& base)
|
||||||
|
: ExecutionNode(plan, base),
|
||||||
|
_vocbase(plan->getAst()->query()->vocbase()),
|
||||||
|
_collection(plan->getAst()->query()->collections()->get(JsonHelper::checkAndGetStringValue(base.json(), "collection"))) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void DistributeNode::toJsonHelper (triagens::basics::Json& nodes,
|
||||||
|
TRI_memory_zone_t* zone,
|
||||||
|
bool verbose) const {
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- methods of GatherNode
|
// --SECTION-- methods of GatherNode
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
|
@ -100,7 +100,8 @@ namespace triagens {
|
||||||
REPLACE = 16,
|
REPLACE = 16,
|
||||||
UPDATE = 17,
|
UPDATE = 17,
|
||||||
RETURN = 18,
|
RETURN = 18,
|
||||||
NORESULTS = 19
|
NORESULTS = 19,
|
||||||
|
DISTRIBUTE = 20
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
@ -2999,6 +3000,107 @@ namespace triagens {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// --SECTION-- class DistributeNode
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief class DistributeNode
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class DistributeNode : public ExecutionNode {
|
||||||
|
|
||||||
|
friend class ExecutionBlock;
|
||||||
|
friend class DistributeBlock;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief constructor with an id
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
DistributeNode (ExecutionPlan* plan,
|
||||||
|
size_t id,
|
||||||
|
TRI_vocbase_t* vocbase,
|
||||||
|
Collection const* collection)
|
||||||
|
: ExecutionNode(plan, id),
|
||||||
|
_vocbase(vocbase),
|
||||||
|
_collection(collection) {
|
||||||
|
}
|
||||||
|
|
||||||
|
DistributeNode (ExecutionPlan*,
|
||||||
|
triagens::basics::Json const& base);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief return the type of the node
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
NodeType getType () const override {
|
||||||
|
return DISTRIBUTE;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief export to JSON
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
virtual void toJsonHelper (triagens::basics::Json&,
|
||||||
|
TRI_memory_zone_t*,
|
||||||
|
bool) const override;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief clone ExecutionNode recursively
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
virtual ExecutionNode* clone (ExecutionPlan* plan,
|
||||||
|
bool withDependencies,
|
||||||
|
bool withProperties) const {
|
||||||
|
auto c = new DistributeNode(plan, _id, _vocbase, _collection);
|
||||||
|
|
||||||
|
CloneHelper (c, plan, withDependencies, withProperties);
|
||||||
|
|
||||||
|
return static_cast<ExecutionNode*>(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief the cost of a Distribute node is 1
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
double estimateCost () {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief return the database
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
TRI_vocbase_t* vocbase () const {
|
||||||
|
return _vocbase;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief return the collection
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Collection const* collection () const {
|
||||||
|
return _collection;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief the underlying database
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
TRI_vocbase_t* _vocbase;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief the underlying collection
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Collection const* _collection;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- class GatherNode
|
// --SECTION-- class GatherNode
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
|
@ -731,6 +731,7 @@ class FilterToEnumCollFinder : public WalkerWorker<ExecutionNode> {
|
||||||
}
|
}
|
||||||
case EN::AGGREGATE:
|
case EN::AGGREGATE:
|
||||||
case EN::SCATTER:
|
case EN::SCATTER:
|
||||||
|
case EN::DISTRIBUTE:
|
||||||
case EN::GATHER:
|
case EN::GATHER:
|
||||||
case EN::REMOTE:
|
case EN::REMOTE:
|
||||||
// in these cases we simply ignore the intermediate nodes, note
|
// in these cases we simply ignore the intermediate nodes, note
|
||||||
|
@ -1408,6 +1409,7 @@ class SortToIndexNode : public WalkerWorker<ExecutionNode> {
|
||||||
case EN::RETURN:
|
case EN::RETURN:
|
||||||
case EN::NORESULTS:
|
case EN::NORESULTS:
|
||||||
case EN::SCATTER:
|
case EN::SCATTER:
|
||||||
|
case EN::DISTRIBUTE:
|
||||||
case EN::GATHER:
|
case EN::GATHER:
|
||||||
case EN::REMOTE:
|
case EN::REMOTE:
|
||||||
case EN::ILLEGAL:
|
case EN::ILLEGAL:
|
||||||
|
@ -1750,6 +1752,7 @@ int triagens::aql::distributeFilternCalcToCluster (Optimizer* opt,
|
||||||
case EN::RETURN:
|
case EN::RETURN:
|
||||||
case EN::NORESULTS:
|
case EN::NORESULTS:
|
||||||
case EN::SCATTER:
|
case EN::SCATTER:
|
||||||
|
case EN::DISTRIBUTE:
|
||||||
case EN::GATHER:
|
case EN::GATHER:
|
||||||
case EN::ILLEGAL:
|
case EN::ILLEGAL:
|
||||||
//do break
|
//do break
|
||||||
|
@ -1836,6 +1839,7 @@ int triagens::aql::distributeSortToCluster (Optimizer* opt,
|
||||||
case EN::RETURN:
|
case EN::RETURN:
|
||||||
case EN::NORESULTS:
|
case EN::NORESULTS:
|
||||||
case EN::SCATTER:
|
case EN::SCATTER:
|
||||||
|
case EN::DISTRIBUTE:
|
||||||
case EN::GATHER:
|
case EN::GATHER:
|
||||||
case EN::ILLEGAL:
|
case EN::ILLEGAL:
|
||||||
//do break
|
//do break
|
||||||
|
@ -1921,6 +1925,7 @@ class RemoteToSingletonViaCalcOnlyFinder: public WalkerWorker<ExecutionNode> {
|
||||||
case EN::SUBQUERY:
|
case EN::SUBQUERY:
|
||||||
case EN::FILTER:
|
case EN::FILTER:
|
||||||
case EN::AGGREGATE:
|
case EN::AGGREGATE:
|
||||||
|
case EN::DISTRIBUTE:
|
||||||
case EN::GATHER:
|
case EN::GATHER:
|
||||||
case EN::INSERT:
|
case EN::INSERT:
|
||||||
case EN::REMOVE:
|
case EN::REMOVE:
|
||||||
|
@ -2131,6 +2136,7 @@ class RemoveToEnumCollFinder: public WalkerWorker<ExecutionNode> {
|
||||||
case EN::SINGLETON:
|
case EN::SINGLETON:
|
||||||
case EN::ENUMERATE_LIST:
|
case EN::ENUMERATE_LIST:
|
||||||
case EN::SUBQUERY:
|
case EN::SUBQUERY:
|
||||||
|
case EN::DISTRIBUTE:
|
||||||
case EN::AGGREGATE:
|
case EN::AGGREGATE:
|
||||||
case EN::INSERT:
|
case EN::INSERT:
|
||||||
case EN::REPLACE:
|
case EN::REPLACE:
|
||||||
|
|
Loading…
Reference in New Issue