diff --git a/arangod/Aql/OptimizerRules.cpp b/arangod/Aql/OptimizerRules.cpp index 286e21ffb8..884584d152 100644 --- a/arangod/Aql/OptimizerRules.cpp +++ b/arangod/Aql/OptimizerRules.cpp @@ -463,23 +463,20 @@ class FilterToEnumCollFinder : public WalkerWorker { auto idx = idxs.at(i); if (idx->_type == TRI_IDX_TYPE_HASH_INDEX && equality) { for (size_t j = 0; j < idx->_fields._length; j++) { - auto range = map->find(std::string(idx->_fields._buffer[j]))->second; - rangeInfo.at(0).push_back(range); - //TODO should copy rangeInfo here + auto range = map->find(std::string(idx->_fields._buffer[j])); + rangeInfo.at(0).push_back(range->second); } } if (idx->_type == TRI_IDX_TYPE_SKIPLIST_INDEX) { size_t j = 0; - auto range = map->find(std::string(idx->_fields._buffer[0]))->second; - //TODO should copy rangeInfo here - rangeInfo.at(0).push_back(range); - equality = range->is1ValueRangeInfo(); + auto range = map->find(std::string(idx->_fields._buffer[0])); + rangeInfo.at(0).push_back(range->second); + equality = range->second->is1ValueRangeInfo(); while (++j < prefixes.at(i) && equality){ - range = map->find(std::string(idx->_fields._buffer[j]))->second; - //TODO should copy rangeInfo here - rangeInfo.at(0).push_back(range); - equality = equality && range->is1ValueRangeInfo(); + range = map->find(std::string(idx->_fields._buffer[j])); + rangeInfo.at(0).push_back(range->second); + equality = equality && range->second->is1ValueRangeInfo(); } } @@ -533,6 +530,7 @@ class FilterToEnumCollFinder : public WalkerWorker { attr.append(attributeName); attr.push_back('.'); } + return; } if (node->type == NODE_TYPE_OPERATOR_BINARY_EQ) { @@ -559,6 +557,9 @@ class FilterToEnumCollFinder : public WalkerWorker { new RangeInfoBound(val, true), new RangeInfoBound(val, true)); } } + attr = ""; + enumCollVar = ""; + return; } if(node->type == NODE_TYPE_OPERATOR_BINARY_LT || @@ -613,11 +614,12 @@ class FilterToEnumCollFinder : public WalkerWorker { } if (node->type == NODE_TYPE_OPERATOR_BINARY_AND) { - attr = ""; buildRangeInfo(node->getMember(0), enumCollVar, attr); - attr = ""; buildRangeInfo(node->getMember(1), enumCollVar, attr); } + attr = ""; + enumCollVar = ""; + return; } }; diff --git a/arangod/Aql/RangeInfo.h b/arangod/Aql/RangeInfo.h index 7c8e818df9..ab1e9146ab 100644 --- a/arangod/Aql/RangeInfo.h +++ b/arangod/Aql/RangeInfo.h @@ -55,8 +55,8 @@ namespace triagens { _bound = Json(TRI_UNKNOWN_MEM_ZONE, bound->toJson(TRI_UNKNOWN_MEM_ZONE, true)); } - RangeInfoBound (basics::Json const& json) : - _bound(Json(TRI_UNKNOWN_MEM_ZONE, + RangeInfoBound (basics::Json const& json) + : _bound(Json(TRI_UNKNOWN_MEM_ZONE, basics::JsonHelper::checkAndGetArrayValue(json.json(), "bound"), basics::Json::NOFREE).copy()), _include(basics::JsonHelper::checkAndGetBooleanValue(json.json(), "include")) { @@ -64,7 +64,10 @@ namespace triagens { ~RangeInfoBound(){} - RangeInfoBound ( RangeInfoBound const& copy ) = delete; + RangeInfoBound ( RangeInfoBound const& copy ) + : _bound(copy._bound.copy()), _include(copy._include){ + } + RangeInfoBound& operator= ( RangeInfoBound const& copy ) = delete; Json toJson () const { @@ -119,7 +122,7 @@ namespace triagens { RangeInfoBound const* high ) : _var(var), _attr(attr), _low(low), _high(high), _valid(true) { } - + RangeInfo (basics::Json const& json) : _var(basics::JsonHelper::checkAndGetStringValue(json.json(), "var")), _attr(basics::JsonHelper::checkAndGetStringValue(json.json(), "attr")), @@ -138,10 +141,12 @@ namespace triagens { else { _high = nullptr; } - } - RangeInfo( const RangeInfo& copy ) = delete; + RangeInfo( RangeInfo const& copy ) + : _var(copy._var), _attr(copy._attr), _low(copy._low), + _high(copy._high), _valid(copy._valid){} + RangeInfo& operator= ( RangeInfo const& copy ) = delete; ~RangeInfo(){ @@ -177,36 +182,6 @@ namespace triagens { && _low->_include && _high->_include; } - /*TRI_index_operator_t* toIndexOperator (TRI_shaper_t* shaper) { - - // lower bound - TRI_index_operator_t* left = nullptr; - if(_low != nullptr){ - left = _low->toIndexOperator(false, shaper); - } - - // upper bound - TRI_index_operator_t* right = nullptr; - if(_high != nullptr){ - right = _high->toIndexOperator(true, shaper); - } - - TRI_index_operator_t* out = nullptr; - if (left != nullptr) { - if (right != nullptr) { - out = TRI_CreateIndexOperator(TRI_AND_INDEX_OPERATOR, left, right, - NULL, shaper, NULL, 2, NULL); - } - else { - out = left; - } - } - else if (right != nullptr) { - out = right; - } - return out; - }*/ - std::string _var; std::string _attr; RangeInfoBound const* _low; @@ -228,7 +203,13 @@ namespace triagens { RangesInfo () : _ranges(){} - ~RangesInfo(){} + ~RangesInfo(){ + for (auto x: _ranges) { + for (auto y: x.second) { + delete y.second; + } + } + } // find the range info for variable and attributes RangeInfo* find (std::string var, std::string name) const { @@ -287,7 +268,6 @@ namespace triagens { }; - typedef std::vector> RangeInfoVec; } }