mirror of https://gitee.com/bigwinds/arangodb
only applying hash indexes if ranges indicate equality.
This commit is contained in:
parent
9cc85003ff
commit
deaa8f1271
|
@ -564,7 +564,7 @@ namespace triagens {
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief get indexes with fields <attrs> or nullptr if none exist
|
/// @brief get vector of indexes with fields <attrs>
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
vector<TRI_index_t*> getIndexes (vector<std::string> attrs) const {
|
vector<TRI_index_t*> getIndexes (vector<std::string> attrs) const {
|
||||||
|
@ -832,24 +832,25 @@ namespace triagens {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// 3-way comparison: a return of -1 indicates that left is
|
// 3-way comparison: a return of -1 indicates that left is
|
||||||
// tighter than right, 0 that they are equal, 1 that right is tighter than
|
// tighter than right, 0 that they are equal, 1 that right is tighter than
|
||||||
// left. For example, (x<1) is tighter than (x<=1) and (x>1) is tighter
|
// left. For example, (x<1) is tighter than (x<=1) and (x>1) is tighter
|
||||||
// than (x>=1) . . .
|
// than (x>=1) . . .
|
||||||
static int CompareRangeInfoBound (RangeInfoBound const* left, RangeInfoBound const* right) {
|
static int CompareRangeInfoBound (RangeInfoBound const* left,
|
||||||
if (left == nullptr) {
|
RangeInfoBound const* right) {
|
||||||
return (right == nullptr ? 0 : 1);
|
if (left == nullptr) {
|
||||||
}
|
return (right == nullptr ? 0 : 1);
|
||||||
if (right == nullptr) {
|
}
|
||||||
return -1;
|
if (right == nullptr) {
|
||||||
}
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
int cmp = TRI_CompareValuesJson(left->_bound.json(), right->_bound.json());
|
int cmp = TRI_CompareValuesJson(left->_bound.json(), right->_bound.json());
|
||||||
if (cmp == 0 && (left->_include != right->_include)) {
|
if (cmp == 0 && (left->_include != right->_include)) {
|
||||||
cmp = (left->_include?-1:1);
|
cmp = (left->_include?-1:1);
|
||||||
}
|
}
|
||||||
return cmp;
|
return cmp;
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief class to keep a vector of RangeInfos . . .
|
/// @brief class to keep a vector of RangeInfos . . .
|
||||||
|
|
|
@ -274,8 +274,6 @@ class CalculationNodeFinder : public WalkerWorker<ExecutionNode> {
|
||||||
|
|
||||||
if (map != nullptr) {
|
if (map != nullptr) {
|
||||||
// check the first components of <map> against indexes of <node> . . .
|
// check the first components of <map> against indexes of <node> . . .
|
||||||
// FIXME does this need to be done like this? Couldn't we keep track
|
|
||||||
// earlier?
|
|
||||||
std::vector<std::string> attrs;
|
std::vector<std::string> attrs;
|
||||||
std::vector<RangeInfo*> rangeInfo;
|
std::vector<RangeInfo*> rangeInfo;
|
||||||
for (auto x : *map){
|
for (auto x : *map){
|
||||||
|
@ -284,28 +282,46 @@ class CalculationNodeFinder : public WalkerWorker<ExecutionNode> {
|
||||||
}
|
}
|
||||||
std::vector<TRI_index_t*> idxs = node->getIndexes(attrs);
|
std::vector<TRI_index_t*> idxs = node->getIndexes(attrs);
|
||||||
|
|
||||||
//use make one new plan for every index in <idxs> that replaces the
|
// make one new plan for every index in <idxs> that replaces the
|
||||||
//enumerate collection node with a RangeIndexNode . . .
|
// enumerate collection node with a RangeIndexNode . . .
|
||||||
for (auto idx: idxs) {
|
for (auto idx: idxs) {
|
||||||
std::cout << "FOUND INDEX!\n";
|
bool stop = false;
|
||||||
auto newPlan = _plan->clone();
|
if (idx->_type == TRI_IDX_TYPE_HASH_INDEX){
|
||||||
ExecutionNode* newNode = nullptr;
|
//only use a hash index if the corresponding rangeInfos are all
|
||||||
try{
|
//equalities . . .
|
||||||
newNode = new IndexRangeNode( newPlan->nextId(), node->vocbase(),
|
for(auto x : rangeInfo){
|
||||||
node->collection(), node->outVariable(), idx, &rangeInfo);
|
if (x->_low == nullptr || x->_high == nullptr ||
|
||||||
newPlan->registerNode(newNode);
|
!TRI_CheckSameValueJson(x->_low->_bound.json(),
|
||||||
}
|
x->_high->_bound.json()) || x->_low->_include != false ||
|
||||||
catch (...) {
|
x->_high->_include == false ) {
|
||||||
if (newNode != nullptr) {
|
stop = true;
|
||||||
delete newNode;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
delete newPlan;
|
|
||||||
throw;
|
|
||||||
}
|
}
|
||||||
newPlan->replaceNode(newPlan->getNodeById(node->id()), newNode,
|
|
||||||
newPlan->getNodeById(_prev->id()));
|
if (!stop) {
|
||||||
std::cout << newPlan->root()->toJson().toString() << "\n";
|
std::cout << "FOUND INDEX!\n";
|
||||||
_out.push_back(newPlan);
|
auto newPlan = _plan->clone();
|
||||||
|
ExecutionNode* newNode = nullptr;
|
||||||
|
try{
|
||||||
|
newNode = new IndexRangeNode( newPlan->nextId(), node->vocbase(),
|
||||||
|
node->collection(), node->outVariable(), idx, &rangeInfo);
|
||||||
|
newPlan->registerNode(newNode);
|
||||||
|
}
|
||||||
|
catch (...) {
|
||||||
|
if (newNode != nullptr) {
|
||||||
|
delete newNode;
|
||||||
|
}
|
||||||
|
delete newPlan;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
newPlan->replaceNode(newPlan->getNodeById(node->id()), newNode,
|
||||||
|
newPlan->getNodeById(_prev->id()));
|
||||||
|
std::cout << newPlan->root()->toJson(TRI_UNKNOWN_MEM_ZONE, false).toString()
|
||||||
|
<< "\n";
|
||||||
|
_out.push_back(newPlan);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue