diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-09-29 10:20:45 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-09-29 14:20:10 +0000 |
commit | ca72e022e4670dd06f78c6f8b93b7df59d93a4f5 (patch) | |
tree | 6e5b0ac5b383667e2ad0a22fd9c498642c296981 /searchlib | |
parent | 7dc2fce01e05b62790d47031d55e31e21e5c6503 (diff) |
- Use asBitVectorIterator instead of isBitVector + casting to present a BitVectorIterator interface.
- Allow Filter wrapper to expose underlying BitVector.
- This ensures that the bitvectors are handled first during termwise evaluation,
as they have a constant cost and will reduce the cost for the ones coming later on.
Diffstat (limited to 'searchlib')
4 files changed, 15 insertions, 10 deletions
diff --git a/searchlib/src/vespa/searchlib/common/bitvectoriterator.h b/searchlib/src/vespa/searchlib/common/bitvectoriterator.h index 08d2e76f9ee..4c68168c34e 100644 --- a/searchlib/src/vespa/searchlib/common/bitvectoriterator.h +++ b/searchlib/src/vespa/searchlib/common/bitvectoriterator.h @@ -23,7 +23,7 @@ private: void doUnpack(uint32_t docId) override final { _tfmd.resetOnlyDocId(docId); } - bool isBitVector() const override { return true; } + BitVectorIterator * asBitVector() noexcept override { return this; } fef::TermFieldMatchData &_tfmd; public: virtual bool isInverted() const = 0; diff --git a/searchlib/src/vespa/searchlib/queryeval/filter_wrapper.h b/searchlib/src/vespa/searchlib/queryeval/filter_wrapper.h index f3992c995f2..b3024694fb9 100644 --- a/searchlib/src/vespa/searchlib/queryeval/filter_wrapper.h +++ b/searchlib/src/vespa/searchlib/queryeval/filter_wrapper.h @@ -55,6 +55,9 @@ public: BitVector::UP get_hits(uint32_t begin_id) override { return _wrapped_search->get_hits(begin_id); } + BitVectorIterator * asBitVector() 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..84a13a8623f 100644 --- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp @@ -119,7 +119,7 @@ public: _mbv(getChildren().size() + 1) { for (const auto & child : getChildren()) { - const auto * bv = static_cast<const BitVectorIterator *>(child.get()); + const auto * bv = child->asBitVector(); _mbv.addBitVector(Meta(bv->getBitValues(), bv->isInverted()), bv->getDocIdLimit()); } } @@ -168,9 +168,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()); + const BitVectorIterator * bv = filter->asBitVector(); + if (bv && acceptExtraFilter()) { + _mbv.addBitVector(Meta(bv->getBitValues(), bv->isInverted()), bv->getDocIdLimit()); insert(getChildren().size(), std::move(filter)); _mbv.reset(); } @@ -225,9 +225,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..7c01ad44789 100644 --- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h +++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h @@ -15,7 +15,10 @@ namespace vespalib::slime { struct Inserter; } -namespace search { class BitVector; } +namespace search { + class BitVector; + class BitVectorIterator; +} namespace search::attribute { class ISearchContext; } namespace search::queryeval { @@ -331,7 +334,8 @@ public: /** * @return true if it is a bitvector */ - virtual bool isBitVector() const { return false; } + bool isBitVector() noexcept { return asBitVector() != nullptr; } + virtual BitVectorIterator * asBitVector() noexcept { return nullptr; } /** * @return true if it is a source blender */ |