1
0
Fork 0

Fixed a bug with reset of new skiplist index iterator

This commit is contained in:
Michael Hackstein 2016-07-12 18:07:11 +02:00
parent 6713ec39dc
commit 63bad694c5
2 changed files with 15 additions and 9 deletions

View File

@ -258,9 +258,9 @@ bool SkiplistLookupBuilder::next() {
SkiplistInLookupBuilder::SkiplistInLookupBuilder( SkiplistInLookupBuilder::SkiplistInLookupBuilder(
Transaction* trx, Transaction* trx,
std::vector<std::vector<arangodb::aql::AstNode const*>>& ops, std::vector<std::vector<arangodb::aql::AstNode const*>>& ops,
arangodb::aql::Variable const* var, bool reverse) : BaseSkiplistLookupBuilder(trx), _dataBuilder(trx) { arangodb::aql::Variable const* var, bool reverse) : BaseSkiplistLookupBuilder(trx), _dataBuilder(trx), _done(false) {
TRI_ASSERT(!ops.empty()); // We certainly do not need IN here TRI_ASSERT(!ops.empty()); // We certainly do not need IN here
VPackBuilder tmp; TransactionBuilderLeaser tmp(trx);
std::set<VPackSlice, arangodb::basics::VelocyPackHelper::VPackSorted<true>> std::set<VPackSlice, arangodb::basics::VelocyPackHelper::VPackSorted<true>>
unique_set( unique_set(
(arangodb::basics::VelocyPackHelper::VPackSorted<true>(reverse))); (arangodb::basics::VelocyPackHelper::VPackSorted<true>(reverse)));
@ -293,10 +293,10 @@ SkiplistInLookupBuilder::SkiplistInLookupBuilder(
} else { } else {
// Case: x.a IN value // Case: x.a IN value
TRI_ASSERT(value->numMembers() > 0); TRI_ASSERT(value->numMembers() > 0);
tmp.clear(); tmp->clear();
unique_set.clear(); unique_set.clear();
value->toVelocyPackValue(tmp); value->toVelocyPackValue(*(tmp.get()));
for (auto const& it : VPackArrayIterator(tmp.slice())) { for (auto const& it : VPackArrayIterator(tmp->slice())) {
unique_set.emplace(it); unique_set.emplace(it);
} }
_inPositions.emplace_back(i, 0, unique_set.size()); _inPositions.emplace_back(i, 0, unique_set.size());
@ -366,10 +366,10 @@ SkiplistInLookupBuilder::SkiplistInLookupBuilder(
TRI_ASSERT(upper == nullptr); TRI_ASSERT(upper == nullptr);
TRI_ASSERT(lower == nullptr); TRI_ASSERT(lower == nullptr);
TRI_ASSERT(value->numMembers() > 0); TRI_ASSERT(value->numMembers() > 0);
tmp.clear(); tmp->clear();
unique_set.clear(); unique_set.clear();
value->toVelocyPackValue(tmp); value->toVelocyPackValue(*(tmp.get()));
for (auto const& it : VPackArrayIterator(tmp.slice())) { for (auto const& it : VPackArrayIterator(tmp->slice())) {
unique_set.emplace(it); unique_set.emplace(it);
} }
_inPositions.emplace_back(ops.size() - 1, 0, unique_set.size()); _inPositions.emplace_back(ops.size() - 1, 0, unique_set.size());
@ -380,6 +380,7 @@ SkiplistInLookupBuilder::SkiplistInLookupBuilder(
_dataBuilder->close(); _dataBuilder->close();
_isEquality = true; _isEquality = true;
_dataBuilder->close(); _dataBuilder->close();
buildSearchValues(); buildSearchValues();
return; return;
case arangodb::aql::NODE_TYPE_OPERATOR_BINARY_EQ: case arangodb::aql::NODE_TYPE_OPERATOR_BINARY_EQ:
@ -388,6 +389,7 @@ SkiplistInLookupBuilder::SkiplistInLookupBuilder(
value->toVelocyPackValue(*(_dataBuilder.get())); value->toVelocyPackValue(*(_dataBuilder.get()));
_isEquality = true; _isEquality = true;
_dataBuilder->close(); _dataBuilder->close();
buildSearchValues(); buildSearchValues();
return; return;
default: default:
@ -408,11 +410,12 @@ SkiplistInLookupBuilder::SkiplistInLookupBuilder(
} }
_dataBuilder->close(); _dataBuilder->close();
_dataBuilder->close(); _dataBuilder->close();
buildSearchValues(); buildSearchValues();
} }
bool SkiplistInLookupBuilder::next() { bool SkiplistInLookupBuilder::next() {
if (!forwardInPosition()) { if (_done || !forwardInPosition()) {
return false; return false;
} }
buildSearchValues(); buildSearchValues();
@ -431,6 +434,7 @@ bool SkiplistInLookupBuilder::forwardInPosition() {
it->current = 0; it->current = 0;
it++; it++;
} }
_done = true;
// If we get here all positions are reset to 0. // If we get here all positions are reset to 0.
// We are done, no further combination // We are done, no further combination
return false; return false;

View File

@ -137,6 +137,8 @@ class SkiplistInLookupBuilder : public BaseSkiplistLookupBuilder {
/// values. (field, inPosition, maxPosition) /// values. (field, inPosition, maxPosition)
std::list<PosStruct> _inPositions; std::list<PosStruct> _inPositions;
bool _done;
public: public:
SkiplistInLookupBuilder( SkiplistInLookupBuilder(
Transaction* trx, Transaction* trx,