diff options
author | Håvard Pettersen <havardpe@oath.com> | 2017-09-19 12:30:17 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2017-09-19 12:31:44 +0000 |
commit | a0c59312d5beeb9db06b70c5a847c65188935d48 (patch) | |
tree | 08b5a450f1e214ce6ff040ca9a16bba04f7066ce /searchlib | |
parent | 3f3c65cc510d26a7146e8814e30cd31a2ee886b6 (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.cpp | 22 |
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)) { |