aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-03-08 19:25:15 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2017-03-08 19:25:15 +0100
commite9402901f8e765742a86d949d053dd9c73fbbb2d (patch)
tree7b8383759d556a3bbe1f8dd93fc8b311c94693e5 /searchlib
parentfdb5f741850e95f82b33784edaaf6659c76626f4 (diff)
Use templates and iterator range.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp3
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp43
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/iterator_pack.h43
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/orsearch.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp29
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/searchiterator.h9
6 files changed, 71 insertions, 58 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp
index 78b16ff7194..6bfe7cb81fd 100644
--- a/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp
@@ -149,8 +149,7 @@ AndNotSearch::get_hits(uint32_t begin_id) {
const Children &children = getChildren();
BitVector::UP result = children.front()->get_hits(begin_id);
result->notSelf();
- Children negative(children.begin()+1, children.end());
- result = orChildren(std::move(result), negative, begin_id);
+ result = orChildren(std::move(result), children.begin()+1, children.end(), begin_id);
result->notSelf();
return result;
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp
index 05b4860b72a..0ed8499a48a 100644
--- a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp
@@ -2,14 +2,53 @@
#include "iterator_pack.h"
#include <vespa/searchlib/common/bitvector.h>
+#include <vespa/searchlib/fef/matchdata.h>
namespace search {
namespace queryeval {
+SearchIteratorPack::~SearchIteratorPack() { }
+
+SearchIteratorPack::SearchIteratorPack() : _children(), _childMatch(), _md() {}
+
+SearchIteratorPack::SearchIteratorPack(SearchIteratorPack &&rhs)
+ : _children(std::move(rhs._children)),
+ _childMatch(std::move(rhs._childMatch)),
+ _md(std::move(rhs._md))
+{ }
+
+SearchIteratorPack &
+SearchIteratorPack::operator=(SearchIteratorPack &&rhs) {
+ _children = std::move(rhs._children);
+ _childMatch = std::move(rhs._childMatch);
+ _md = std::move(rhs._md);
+ return *this;
+}
+
+SearchIteratorPack::SearchIteratorPack(const std::vector<SearchIterator*> &children,
+ const std::vector<fef::TermFieldMatchData*> &childMatch,
+ MatchDataUP md)
+ : _children(),
+ _childMatch(childMatch),
+ _md(std::move(md))
+{
+ _children.reserve(children.size());
+ for (auto child: children) {
+ _children.emplace_back(child);
+ }
+ assert((_children.size() == _childMatch.size()) ||
+ (_childMatch.empty() && (_md.get() == nullptr)));
+}
+
+SearchIteratorPack::SearchIteratorPack(const std::vector<SearchIterator*> &children)
+ : SearchIteratorPack(children, std::vector<fef::TermFieldMatchData*>(), MatchDataUP())
+{ }
+
+
std::unique_ptr<BitVector>
-SearchIteratorPack::get_hits(uint32_t begin_id, uint32_t end_id) {
+SearchIteratorPack::get_hits(uint32_t begin_id, uint32_t end_id) const {
- BitVector::UP result = SearchIterator::orChildren(_children, begin_id);
+ BitVector::UP result = SearchIterator::orChildren(_children.begin(), _children.end(), begin_id);
if (! result ) {
result = BitVector::create(begin_id, end_id);
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h
index d45f58514d1..a8d0c981c5a 100644
--- a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h
+++ b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h
@@ -4,51 +4,32 @@
#include "searchiterator.h"
#include <vespa/searchlib/fef/termfieldmatchdata.h>
-#include <vespa/searchlib/fef/matchdata.h>
namespace search {
+
+namespace fef { class MatchData; }
+
namespace queryeval {
class SearchIteratorPack
{
private:
+ using MatchDataUP = std::unique_ptr<fef::MatchData>;
std::vector<SearchIterator::UP> _children;
std::vector<fef::TermFieldMatchData*> _childMatch;
- fef::MatchData::UP _md;
+ MatchDataUP _md;
public:
- SearchIteratorPack() : _children(), _childMatch(), _md() {}
- SearchIteratorPack(SearchIteratorPack &&rhs)
- : _children(std::move(rhs._children)),
- _childMatch(std::move(rhs._childMatch)),
- _md(std::move(rhs._md)) {}
-
- SearchIteratorPack &operator=(SearchIteratorPack &&rhs) {
- _children = std::move(rhs._children);
- _childMatch = std::move(rhs._childMatch);
- _md = std::move(rhs._md);
- return *this;
- }
+ SearchIteratorPack();
+ ~SearchIteratorPack();
+ SearchIteratorPack(SearchIteratorPack &&rhs);
+ SearchIteratorPack &operator=(SearchIteratorPack &&rhs);
SearchIteratorPack(const std::vector<SearchIterator*> &children,
const std::vector<fef::TermFieldMatchData*> &childMatch,
- fef::MatchData::UP md)
- : _children(),
- _childMatch(childMatch),
- _md(std::move(md))
- {
- _children.reserve(children.size());
- for (auto child: children) {
- _children.emplace_back(child);
- }
- assert((_children.size() == _childMatch.size()) ||
- (_childMatch.empty() && (_md.get() == nullptr)));
- }
+ MatchDataUP md);
- explicit SearchIteratorPack(const std::vector<SearchIterator*> &children)
- : SearchIteratorPack(children,
- std::vector<fef::TermFieldMatchData*>(),
- fef::MatchData::UP()) {}
+ explicit SearchIteratorPack(const std::vector<SearchIterator*> &children);
uint32_t get_docid(uint32_t ref) const {
return _children[ref]->getDocId();
@@ -76,7 +57,7 @@ public:
child->initRange(begin, end);
}
}
- std::unique_ptr<BitVector> get_hits(uint32_t begin_id, uint32_t end_id);
+ std::unique_ptr<BitVector> get_hits(uint32_t begin_id, uint32_t end_id) const;
void or_hits_into(BitVector &result, uint32_t begin_id) const;
};
diff --git a/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp
index f6417e41541..f9b99d695fc 100644
--- a/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp
@@ -78,7 +78,7 @@ private:
BitVector::UP
OrSearch::get_hits(uint32_t begin_id) {
- return orChildren(getChildren(), begin_id);
+ return orChildren(getChildren().begin(), getChildren().end(), begin_id);
}
void
diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp b/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp
index e1717fc8009..b5b7d24da46 100644
--- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp
@@ -171,34 +171,29 @@ SearchIterator::andChildren(const Children &children, uint32_t begin_id) {
return andChildren(BitVector::UP(), children, begin_id);
}
+template<typename IT>
BitVector::UP
-SearchIterator::orChildren(BitVector::UP result, const Children &children, uint32_t begin_id) {
- return orIterators(orIterators(std::move(result), children.begin(), children.end(), begin_id, true),
- children.begin(), children.end(), begin_id, false);
+SearchIterator::orChildren(BitVector::UP result, IT from, IT to, uint32_t begin_id) {
+ return orIterators(orIterators(std::move(result), from, to, begin_id, true),
+ from, to, begin_id, false);
}
-template <typename IT>
+template<typename IT>
void SearchIterator::orChildren(BitVector & result, IT from, IT to, uint32_t begin_id) {
orIterators(result, from, to, begin_id, true);
orIterators(result, from, to, begin_id, false);
}
+template<typename IT>
BitVector::UP
-SearchIterator::orChildren(const Children &children, uint32_t begin_id) {
- return orChildren(BitVector::UP(), children, begin_id);
-}
-
-BitVector::UP
-SearchIterator::orChildren(BitVector::UP result, const OwnedChildren &children, uint32_t begin_id) {
- return orIterators(orIterators(std::move(result), children.begin(), children.end(), begin_id, true),
- children.begin(), children.end(), begin_id, false);
-}
-
-BitVector::UP
-SearchIterator::orChildren(const OwnedChildren &children, uint32_t begin_id) {
- return orChildren(BitVector::UP(), children, begin_id);
+SearchIterator::orChildren(IT from, IT to, uint32_t begin_id) {
+ return orChildren(BitVector::UP(), from, to, begin_id);
}
+template BitVector::UP SearchIterator::orChildren(Children::const_iterator from, Children::const_iterator to, uint32_t begin_id);
+template BitVector::UP SearchIterator::orChildren(OwnedChildren::const_iterator from, OwnedChildren::const_iterator to, uint32_t begin_id);
+template BitVector::UP SearchIterator::orChildren(BitVector::UP result, Children::const_iterator from, Children::const_iterator to, uint32_t begin_id);
+template BitVector::UP SearchIterator::orChildren(BitVector::UP result, OwnedChildren::const_iterator from, OwnedChildren::const_iterator to, uint32_t begin_id);
template void SearchIterator::orChildren(BitVector & result, Children::const_iterator from, Children::const_iterator to, uint32_t begin_id);
template void SearchIterator::orChildren(BitVector & result, OwnedChildren::const_iterator from, OwnedChildren::const_iterator to, uint32_t begin_id);
diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h
index 236b25a9b67..a23fbf07fb2 100644
--- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h
+++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h
@@ -345,11 +345,10 @@ public:
static void andChildren(BitVector & result, const Children & children, uint32_t begin_id);
static BitVectorUP andChildren(const Children & children, uint32_t begin_id);
- static BitVectorUP orChildren(const Children & children, uint32_t begin_id);
- static BitVectorUP orChildren(const OwnedChildren & children, uint32_t begin_id);
-
- static BitVectorUP orChildren(BitVectorUP result, const Children & children, uint32_t begin_id);
- static BitVectorUP orChildren(BitVectorUP result, const OwnedChildren & children, uint32_t begin_id);
+ template <typename IT>
+ static BitVectorUP orChildren(IT from, IT to, uint32_t begin_id);
+ template <typename IT>
+ static BitVectorUP orChildren(BitVectorUP result, IT from, IT to, uint32_t begin_id);
template <typename IT>
static void orChildren(BitVector & result, IT from, IT to, uint32_t begin_id);