summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2017-09-19 12:30:17 +0000
committerHåvard Pettersen <havardpe@oath.com>2017-09-19 12:31:44 +0000
commita0c59312d5beeb9db06b70c5a847c65188935d48 (patch)
tree08b5a450f1e214ce6ff040ca9a16bba04f7066ce /searchlib
parent3f3c65cc510d26a7146e8814e30cd31a2ee886b6 (diff)
re-use bitvector if re-inited with same docid range
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/termwise_search.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/termwise_search.cpp b/searchlib/src/vespa/searchlib/queryeval/termwise_search.cpp
index 13b1c8f1da6..e7df5aa6bae 100644
--- a/searchlib/src/vespa/searchlib/queryeval/termwise_search.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/termwise_search.cpp
@@ -11,17 +11,27 @@ template <bool IS_STRICT>
struct TermwiseSearch : public SearchIterator {
SearchIterator::UP search;
- BitVector::UP result;
+ BitVector::UP result;
+ uint32_t my_beginid;
+ uint32_t my_first_hit;
+
+ bool same_range(uint32_t beginid, uint32_t endid) const {
+ return ((beginid == my_beginid) && endid == getEndId());
+ }
TermwiseSearch(SearchIterator::UP search_in)
- : search(std::move(search_in)), result() {}
+ : search(std::move(search_in)), result(), my_beginid(0), my_first_hit(0) {}
Trinary is_strict() const override { return IS_STRICT ? Trinary::True : Trinary::False; }
void initRange(uint32_t beginid, uint32_t endid) override {
- SearchIterator::initRange(beginid, endid);
- search->initRange(beginid, endid);
- setDocId(std::max(getDocId(), search->getDocId()));
- result = search->get_hits(beginid);
+ if (!same_range(beginid, endid)) {
+ my_beginid = beginid;
+ SearchIterator::initRange(beginid, endid);
+ search->initRange(beginid, endid);
+ my_first_hit = std::max(getDocId(), search->getDocId());
+ result = search->get_hits(beginid);
+ }
+ setDocId(my_first_hit);
}
void doSeek(uint32_t docid) override {
if (__builtin_expect(isAtEnd(docid), false)) {