summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-10-02 16:46:01 +0200
committerGitHub <noreply@github.com>2023-10-02 16:46:01 +0200
commit147306c88ffaf2d1c24b2f6f38a431c371914b15 (patch)
treefd1d615726978e91bc5c7f45b09613fe89084e3a /searchlib
parent36acec63c4f88c3a9118e74f6370ddae993503a2 (diff)
parentfc5bf7d1ae48fa8762545fd62905eda1249cbded (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')
-rw-r--r--searchlib/src/vespa/searchlib/common/bitvectoriterator.h7
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/filter_wrapper.h9
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp16
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/searchiterator.h18
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
*/