mirror of https://gitee.com/bigwinds/arangodb
Skiplist index now can handle upper and lower bounds and combined with equal and any. hunt leaks now
This commit is contained in:
parent
af4ff37334
commit
9639a9e669
|
@ -1186,17 +1186,17 @@ IndexIterator* SkiplistIndex::iteratorForCondition (IndexIteratorContext* contex
|
|||
// This is not an equalityCheck, set lower or upper
|
||||
switch (comp->type) {
|
||||
case triagens::aql::NODE_TYPE_OPERATOR_BINARY_LT:
|
||||
setBorder(false, false);
|
||||
break;
|
||||
case triagens::aql::NODE_TYPE_OPERATOR_BINARY_LE:
|
||||
setBorder(false, true);
|
||||
break;
|
||||
case triagens::aql::NODE_TYPE_OPERATOR_BINARY_GT:
|
||||
setBorder(true, false);
|
||||
break;
|
||||
case triagens::aql::NODE_TYPE_OPERATOR_BINARY_GE:
|
||||
case triagens::aql::NODE_TYPE_OPERATOR_BINARY_LE:
|
||||
setBorder(true, true);
|
||||
break;
|
||||
case triagens::aql::NODE_TYPE_OPERATOR_BINARY_GT:
|
||||
setBorder(false, false);
|
||||
break;
|
||||
case triagens::aql::NODE_TYPE_OPERATOR_BINARY_GE:
|
||||
setBorder(false, true);
|
||||
break;
|
||||
default:
|
||||
// unsupported right now. Should have been rejected by supportsFilterCondition
|
||||
TRI_ASSERT(false);
|
||||
|
@ -1210,6 +1210,7 @@ IndexIterator* SkiplistIndex::iteratorForCondition (IndexIteratorContext* contex
|
|||
searchValues.reserve(maxPermutations);
|
||||
|
||||
|
||||
auto buildRangeOperator = [&] () -> TRI_index_operator_t* {
|
||||
std::unique_ptr<TRI_index_operator_t> rangeOperator(nullptr);
|
||||
|
||||
if (lower != nullptr) {
|
||||
|
@ -1270,11 +1271,12 @@ IndexIterator* SkiplistIndex::iteratorForCondition (IndexIteratorContext* contex
|
|||
tmpOp.release();
|
||||
}
|
||||
}
|
||||
return rangeOperator.release();
|
||||
};
|
||||
|
||||
if (usedFields == 0) {
|
||||
// We have a range query based on the first _field
|
||||
searchValues.emplace_back(rangeOperator.get());
|
||||
rangeOperator.release();
|
||||
searchValues.emplace_back(buildRangeOperator());
|
||||
}
|
||||
else {
|
||||
bool done = false;
|
||||
|
@ -1302,14 +1304,16 @@ IndexIterator* SkiplistIndex::iteratorForCondition (IndexIteratorContext* contex
|
|||
_shaper,
|
||||
usedFields));
|
||||
parameter.release();
|
||||
// Note we create a new RangeOperator always.
|
||||
std::unique_ptr<TRI_index_operator_t> rangeOperator(buildRangeOperator());
|
||||
if (rangeOperator != nullptr) {
|
||||
// NOTE: We might have to clone the rangeOperator here!
|
||||
std::unique_ptr<TRI_index_operator_t> combinedOp(TRI_CreateIndexOperator(TRI_AND_INDEX_OPERATOR,
|
||||
rangeOperator.get(),
|
||||
tmpOp.get(),
|
||||
nullptr,
|
||||
_shaper,
|
||||
2));
|
||||
rangeOperator.release();
|
||||
tmpOp.release();
|
||||
searchValues.emplace_back(combinedOp.get());
|
||||
combinedOp.release();
|
||||
|
|
Loading…
Reference in New Issue