diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-10-02 16:46:01 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-02 16:46:01 +0200 |
commit | 147306c88ffaf2d1c24b2f6f38a431c371914b15 (patch) | |
tree | fd1d615726978e91bc5c7f45b09613fe89084e3a /searchlib | |
parent | 36acec63c4f88c3a9118e74f6370ddae993503a2 (diff) | |
parent | fc5bf7d1ae48fa8762545fd62905eda1249cbded (diff) |
Merge pull request #28736 from vespa-engine/balder/use-as-bitvector-api-instead-of-casting
- Use asBitVectorIterator instead of isBitVector + casting to present…
Diffstat (limited to 'searchlib')
4 files changed, 34 insertions, 16 deletions
diff --git a/searchlib/src/vespa/searchlib/common/bitvectoriterator.h b/searchlib/src/vespa/searchlib/common/bitvectoriterator.h index 08d2e76f9ee..e60dc5cebc9 100644 --- a/searchlib/src/vespa/searchlib/common/bitvectoriterator.h +++ b/searchlib/src/vespa/searchlib/common/bitvectoriterator.h @@ -20,17 +20,16 @@ protected: const BitVector & _bv; private: void visitMembers(vespalib::ObjectVisitor &visitor) const override; - void doUnpack(uint32_t docId) override final { + void doUnpack(uint32_t docId) final { _tfmd.resetOnlyDocId(docId); } - bool isBitVector() const override { return true; } + BitVectorMeta asBitVector() const noexcept override { return {&_bv, _docIdLimit, isInverted()}; } fef::TermFieldMatchData &_tfmd; public: virtual bool isInverted() const = 0; - const void *getBitValues() const { return _bv.getStart(); } Trinary is_strict() const override { return Trinary::False; } - uint32_t getDocIdLimit() const { return _docIdLimit; } + uint32_t getDocIdLimit() const noexcept { return _docIdLimit; } static UP create(const BitVector *const other, fef::TermFieldMatchData &matchData, bool strict, bool inverted = false); static UP create(const BitVector *const other, uint32_t docIdLimit, fef::TermFieldMatchData &matchData, bool strict, bool inverted = false); diff --git a/searchlib/src/vespa/searchlib/queryeval/filter_wrapper.h b/searchlib/src/vespa/searchlib/queryeval/filter_wrapper.h index f3992c995f2..ab231d39abc 100644 --- a/searchlib/src/vespa/searchlib/queryeval/filter_wrapper.h +++ b/searchlib/src/vespa/searchlib/queryeval/filter_wrapper.h @@ -17,10 +17,10 @@ namespace search::queryeval { class FilterWrapper : public SearchIterator { private: std::vector<fef::TermFieldMatchData> _unused_md; - fef::TermFieldMatchDataArray _tfmda; - std::unique_ptr<SearchIterator> _wrapped_search; + fef::TermFieldMatchDataArray _tfmda; + std::unique_ptr<SearchIterator> _wrapped_search; public: - FilterWrapper(size_t num_fields) + explicit FilterWrapper(size_t num_fields) : _unused_md(num_fields), _tfmda(), _wrapped_search() @@ -55,6 +55,9 @@ public: BitVector::UP get_hits(uint32_t begin_id) override { return _wrapped_search->get_hits(begin_id); } + BitVectorMeta asBitVector() const noexcept override { + return _wrapped_search->asBitVector(); + } Trinary is_strict() const override { return _wrapped_search->is_strict(); } diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp index 4eb57eda911..6408004ea32 100644 --- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp @@ -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 { @@ -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()); } } diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h index 4ab066727af..8085555ae3d 100644 --- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h +++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h @@ -331,7 +331,23 @@ public: /** * @return true if it is a bitvector */ - virtual bool isBitVector() const { return false; } + class BitVectorMeta { + public: + BitVectorMeta() noexcept : BitVectorMeta(nullptr, 0, false) {} + BitVectorMeta(const BitVector * bv, uint32_t docidLimit, bool inverted_in) noexcept + : _bv(bv), _docidLimit(docidLimit), _inverted(inverted_in) + {} + const BitVector * vector() const noexcept { return _bv; } + bool inverted () const noexcept { return _inverted; } + uint32_t getDocidLimit() const noexcept { return _docidLimit; } + bool valid() const noexcept { return _bv != nullptr; } + private: + const BitVector * _bv; + uint32_t _docidLimit; + bool _inverted; + }; + bool isBitVector() const noexcept { return asBitVector().valid(); } + virtual BitVectorMeta asBitVector() const noexcept { return {}; } /** * @return true if it is a source blender */ |