diff options
Diffstat (limited to 'searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp')
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp index 4eb57eda911..fdf4ec950dd 100644 --- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp @@ -1,4 +1,4 @@ -// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "multibitvectoriterator.h" #include "andsearch.h" @@ -66,7 +66,7 @@ bool MultiBitVector<Update>::updateLastValue(uint32_t docId) noexcept { if (docId >= _lastMaxDocIdLimit) { - if (__builtin_expect(docId >= _numDocs, false)) { + if (__builtin_expect(isAtEnd(docId), false)) { return true; } const uint32_t index(BitWord::wordNum(docId)); @@ -119,8 +119,10 @@ public: _mbv(getChildren().size() + 1) { for (const auto & child : getChildren()) { - const auto * bv = static_cast<const BitVectorIterator *>(child.get()); - _mbv.addBitVector(Meta(bv->getBitValues(), bv->isInverted()), bv->getDocIdLimit()); + BitVectorMeta bv = child->asBitVector(); + if (bv.valid()) { + _mbv.addBitVector(Meta(bv.vector()->getStart(), bv.inverted()), bv.getDocidLimit()); + } } } void initRange(uint32_t beginId, uint32_t endId) override { @@ -145,7 +147,7 @@ public: private: void doSeek(uint32_t docId) override { docId = this->_mbv.strictSeek(docId); - if (__builtin_expect(docId >= this->getEndId(), false)) { + if (__builtin_expect(this->_mbv.isAtEnd(docId), false)) { this->setAtEnd(); } else { this->setDocId(docId); @@ -168,9 +170,9 @@ SearchIterator::UP MultiBitVectorIterator<Update>::andWith(UP filter, uint32_t estimate) { (void) estimate; - if (filter->isBitVector() && acceptExtraFilter()) { - const auto & bv = static_cast<const BitVectorIterator &>(*filter); - _mbv.addBitVector(Meta(bv.getBitValues(), bv.isInverted()), bv.getDocIdLimit()); + BitVectorMeta bv = filter->asBitVector(); + if (bv.valid() && acceptExtraFilter()) { + _mbv.addBitVector(Meta(bv.vector()->getStart(), bv.inverted()), bv.getDocidLimit()); insert(getChildren().size(), std::move(filter)); _mbv.reset(); } @@ -225,9 +227,7 @@ MultiBitVectorIteratorBase::doUnpack(uint32_t docid) MultiSearch::doUnpack(docid); } else { auto &children = getChildren(); - _unpackInfo.each([&children,docid](size_t i) { - static_cast<BitVectorIterator *>(children[i].get())->unpack(docid); - }, children.size()); + _unpackInfo.each([&children,docid](size_t i) { children[i]->unpack(docid); }, children.size()); } } |