diff options
author | Håvard Pettersen <havardpe@oath.com> | 2017-10-13 11:26:25 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2017-10-13 11:26:25 +0000 |
commit | f72e209393e15415a54277e08eeaaa976c4b2799 (patch) | |
tree | 307153b84e33a4ef20676a210eb595bfead341e8 /searchlib | |
parent | 025b759b5cf0146cd0cf3f44f686eeace1b28d09 (diff) |
do not discard search iterators
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/tests/queryeval/queryeval.cpp | 6 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/multisearch.h | 8 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/orsearch.cpp | 16 |
3 files changed, 13 insertions, 17 deletions
diff --git a/searchlib/src/tests/queryeval/queryeval.cpp b/searchlib/src/tests/queryeval/queryeval.cpp index 9dc4f2eef89..c6dd6a430cc 100644 --- a/searchlib/src/tests/queryeval/queryeval.cpp +++ b/searchlib/src/tests/queryeval/queryeval.cpp @@ -287,6 +287,10 @@ private: virtual void doSeek(uint32_t docid) override { (void) docid; } }; +struct MultiSearchRemoveTest { + static SearchIterator::UP remove(MultiSearch &ms, size_t idx) { return ms.remove(idx); } +}; + TEST("testMultiSearch") { MultiSearch::Children children; children.push_back(new EmptySearch()); @@ -300,7 +304,7 @@ TEST("testMultiSearch") { EXPECT_EQUAL(0u, ms._accumInsert); EXPECT_EQUAL(0u, ms._accumRemove); - EXPECT_EQUAL(children[1], ms.remove(1).get()); + EXPECT_EQUAL(children[1], MultiSearchRemoveTest::remove(ms, 1).get()); EXPECT_EQUAL(2u, ms.getChildren().size()); EXPECT_EQUAL(children[0], ms.getChildren()[0]); EXPECT_EQUAL(children[2], ms.getChildren()[1]); diff --git a/searchlib/src/vespa/searchlib/queryeval/multisearch.h b/searchlib/src/vespa/searchlib/queryeval/multisearch.h index fc1a9ec11cd..16bbd5d4ecc 100644 --- a/searchlib/src/vespa/searchlib/queryeval/multisearch.h +++ b/searchlib/src/vespa/searchlib/queryeval/multisearch.h @@ -5,14 +5,20 @@ #include "searchiterator.h" #include <vector> +class MultiSearchRemoveTest; + namespace search::queryeval { +class MultiBitVectorIteratorBase; + /** * A virtual intermediate class that serves as the basis for combining searches * like and, or any or others that take a list of children. **/ class MultiSearch : public SearchIterator { + friend class ::MultiSearchRemoveTest; + friend class ::search::queryeval::MultiBitVectorIteratorBase; public: /** * Defines how to represent the children iterators. vespalib::Array usage @@ -32,13 +38,13 @@ public: virtual bool isAndNot() const { return false; } virtual bool isOr() const { return false; } void insert(size_t index, SearchIterator::UP search); - SearchIterator::UP remove(size_t index); virtual bool needUnpack(size_t index) const { (void) index; return true; } void initRange(uint32_t beginId, uint32_t endId) override; protected: void doUnpack(uint32_t docid) override; void visitMembers(vespalib::ObjectVisitor &visitor) const override; private: + SearchIterator::UP remove(size_t index); // friends only /** * Call back when children are removed / inserted after the Iterator has been constructed. * This is to support code that make assumptions that iterators do not move around or disappear. diff --git a/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp index 6d59482d799..977080f8266 100644 --- a/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp @@ -16,34 +16,20 @@ public: void unpack(uint32_t docid, MultiSearch & search) { const MultiSearch::Children & children(search.getChildren()); size_t sz(children.size()); - for (size_t i(0); i < sz; ) { + for (size_t i(0); i < sz; ++i) { if (__builtin_expect(children[i]->getDocId() < docid, false)) { children[i]->doSeek(docid); - if (children[i]->getDocId() == search::endDocId) { - sz = deactivate(search, i); - continue; - } } if (__builtin_expect(children[i]->getDocId() == docid, false)) { children[i]->doUnpack(docid); } - i++; } } void onRemove(size_t index) { (void) index; } void onInsert(size_t index) { (void) index; } bool needUnpack(size_t index) const { (void) index; return true; } -private: - static size_t deactivate(MultiSearch &children, size_t idx); }; -size_t -FullUnpack::deactivate(MultiSearch & search, size_t idx) -{ - search.remove(idx); - return search.getChildren().size(); -} - class SelectiveUnpack { public: |