diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-03-08 19:25:15 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-03-08 19:25:15 +0100 |
commit | e9402901f8e765742a86d949d053dd9c73fbbb2d (patch) | |
tree | 7b8383759d556a3bbe1f8dd93fc8b311c94693e5 /searchlib | |
parent | fdb5f741850e95f82b33784edaaf6659c76626f4 (diff) |
Use templates and iterator range.
Diffstat (limited to 'searchlib')
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); |