summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2017-10-13 11:26:25 +0000
committerHåvard Pettersen <havardpe@oath.com>2017-10-13 11:26:25 +0000
commitf72e209393e15415a54277e08eeaaa976c4b2799 (patch)
tree307153b84e33a4ef20676a210eb595bfead341e8 /searchlib
parent025b759b5cf0146cd0cf3f44f686eeace1b28d09 (diff)
do not discard search iterators
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/queryeval/queryeval.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multisearch.h8
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/orsearch.cpp16
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: