aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-09-29 10:20:45 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-09-29 14:20:10 +0000
commitca72e022e4670dd06f78c6f8b93b7df59d93a4f5 (patch)
tree6e5b0ac5b383667e2ad0a22fd9c498642c296981 /searchlib
parent7dc2fce01e05b62790d47031d55e31e21e5c6503 (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')
-rw-r--r--searchlib/src/vespa/searchlib/common/bitvectoriterator.h2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/filter_wrapper.h3
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp12
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/searchiterator.h8
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
*/