diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-03-10 16:17:35 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-03-10 16:17:35 +0100 |
commit | 091b55e5a64eb27bb8fc980e56e2edb1e4824daa (patch) | |
tree | 95f83034371328bc7eb96e17552ce1d423c392a4 /searchlib | |
parent | 8d4c358fbdffe099ca3c164f156286563c2aa59b (diff) |
Move to helper class.
Diffstat (limited to 'searchlib')
7 files changed, 147 insertions, 121 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp index 6bfe7cb81fd..32984438fa0 100644 --- a/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp @@ -1,6 +1,7 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "andnotsearch.h" +#include "termwise_helper.h" #include <vespa/searchlib/common/bitvector.h> namespace search { @@ -149,7 +150,7 @@ AndNotSearch::get_hits(uint32_t begin_id) { const Children &children = getChildren(); BitVector::UP result = children.front()->get_hits(begin_id); result->notSelf(); - result = orChildren(std::move(result), children.begin()+1, children.end(), begin_id); + result = TermwiseHelper::orChildren(std::move(result), children.begin()+1, children.end(), begin_id); result->notSelf(); return result; } diff --git a/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp index 4a2af1a518d..09f5c548838 100644 --- a/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp @@ -2,6 +2,7 @@ #include "andsearch.h" #include "andsearchstrict.h" +#include "termwise_helper.h" #include <vespa/searchlib/common/bitvector.h> namespace search { @@ -9,7 +10,7 @@ namespace queryeval { BitVector::UP AndSearch::get_hits(uint32_t begin_id) { - return andChildren(getChildren(), begin_id); + return TermwiseHelper::andChildren(getChildren().begin(), getChildren().end(), begin_id); } void @@ -20,7 +21,7 @@ AndSearch::or_hits_into(BitVector &result, uint32_t begin_id) { void AndSearch::and_hits_into(BitVector &result, uint32_t begin_id) { - andChildren(result, getChildren(), begin_id); + TermwiseHelper::andChildren(result, getChildren().begin(), getChildren().end(), begin_id); } SearchIterator::UP AndSearch::andWith(UP filter, uint32_t estimate_) diff --git a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp index 45778bc0cf5..ab64acd23b8 100644 --- a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp @@ -1,6 +1,7 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "iterator_pack.h" +#include "termwise_helper.h" #include <vespa/searchlib/common/bitvector.h> #include <vespa/searchlib/fef/matchdata.h> @@ -47,7 +48,7 @@ SearchIteratorPack::SearchIteratorPack(const std::vector<SearchIterator*> &child std::unique_ptr<BitVector> SearchIteratorPack::get_hits(uint32_t begin_id, uint32_t end_id) const { - BitVector::UP result = SearchIterator::orChildren(_children.begin(), _children.end(), begin_id); + BitVector::UP result = TermwiseHelper::orChildren(_children.begin(), _children.end(), begin_id); if (! result ) { result = BitVector::create(begin_id, end_id); } @@ -56,7 +57,7 @@ SearchIteratorPack::get_hits(uint32_t begin_id, uint32_t end_id) const { void SearchIteratorPack::or_hits_into(BitVector &result, uint32_t begin_id) const { - SearchIterator::orChildren(result, _children.begin(), _children.end(), begin_id); + TermwiseHelper::orChildren(result, _children.begin(), _children.end(), begin_id); } diff --git a/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp index f9b99d695fc..0238ba835e2 100644 --- a/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp @@ -2,6 +2,7 @@ #include "orsearch.h" #include "orlikesearch.h" +#include "termwise_helper.h" #include <vespa/searchlib/common/bitvector.h> namespace search { @@ -78,7 +79,7 @@ private: BitVector::UP OrSearch::get_hits(uint32_t begin_id) { - return orChildren(getChildren().begin(), getChildren().end(), begin_id); + return TermwiseHelper::orChildren(getChildren().begin(), getChildren().end(), begin_id); } void @@ -89,7 +90,7 @@ OrSearch::and_hits_into(BitVector &result, uint32_t begin_id) { void OrSearch::or_hits_into(BitVector &result, uint32_t begin_id) { - orChildren(result, getChildren().begin(), getChildren().end(), begin_id); + TermwiseHelper::orChildren(result, getChildren().begin(), getChildren().end(), begin_id); } SearchIterator * diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp b/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp index 9860105ddc5..a2f64b06e4c 100644 --- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp @@ -97,105 +97,7 @@ SearchIterator::visitMembers(vespalib::ObjectVisitor &visitor) const visit(visitor, "docid", _docid); visit(visitor, "endid", _endid); } - -namespace { - -using Children = SearchIterator::Children; - -BitVector::UP -andIterators(BitVector::UP result, const Children &children, uint32_t begin_id, bool select_bitvector) { - for (SearchIterator *child : children) { - if (child->isBitVector() == select_bitvector) { - if (!result) { - result = child->get_hits(begin_id); - } else { - child->and_hits_into(*result, begin_id); - } - } - } - return result; -} - -void -andIterators(BitVector & result, const Children &children, uint32_t begin_id, bool select_bitvector) { - for (SearchIterator *child : children) { - if (child->isBitVector() == select_bitvector) { - child->and_hits_into(result, begin_id); - } - } -} - -template<typename IT> -BitVector::UP -orIterators(BitVector::UP result, IT begin, IT end, uint32_t begin_id, bool select_bitvector) { - for (IT it(begin); it != end; ++it) { - auto & child = *it; - if (child->isBitVector() == select_bitvector) { - if (!result) { - result = child->get_hits(begin_id); - } else { - child->or_hits_into(*result, begin_id); - } - } - } - return result; -} - -template<typename IT> -void -orIterators(BitVector & result, IT begin, IT end, uint32_t begin_id, bool select_bitvector) { - for (IT it(begin); it != end; ++it) { - auto & child = *it; - if (child->isBitVector() == select_bitvector) { - child->or_hits_into(result, begin_id); - } - } -} - -} - -BitVector::UP -SearchIterator::andChildren(BitVector::UP result, const Children &children, uint32_t begin_id) { - return andIterators(andIterators(std::move(result), children, begin_id, true), children, begin_id, false); -} - -void -SearchIterator::andChildren(BitVector & result, const Children &children, uint32_t begin_id) { - andIterators(result, children, begin_id, true); - andIterators(result, children, begin_id, false); -} - -BitVector::UP -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, 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> -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(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); - + } // namespace queryeval } // namespace search diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h index a23fbf07fb2..17fa8fd9902 100644 --- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h +++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h @@ -338,21 +338,6 @@ public: virtual Trinary is_strict() const { return Trinary::Undefined; } - using Children = std::vector<SearchIterator *>; - using OwnedChildren = std::vector<std::unique_ptr<SearchIterator>>; - - static BitVectorUP andChildren(BitVectorUP result, const Children & children, uint32_t begin_id); - static void andChildren(BitVector & result, const Children & children, uint32_t begin_id); - static BitVectorUP andChildren(const Children & 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); - - }; } // namespace queryeval diff --git a/searchlib/src/vespa/searchlib/queryeval/termwise_helper.h b/searchlib/src/vespa/searchlib/queryeval/termwise_helper.h new file mode 100644 index 00000000000..12983a076b0 --- /dev/null +++ b/searchlib/src/vespa/searchlib/queryeval/termwise_helper.h @@ -0,0 +1,135 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include "searchiterator.h" +#include <vespa/searchlib/common/bitvector.h> + +namespace search { + +namespace queryeval { + +/** +* Helper methods for doing termwise evaluation. +**/ +class TermwiseHelper { +public: + template<typename IT> + static BitVector::UP andChildren(BitVector::UP result, IT from, IT to, uint32_t begin_id); + template<typename IT> + static void andChildren(BitVector & result, IT from, IT to, uint32_t begin_id); + template<typename IT> + static BitVector::UP andChildren(IT from, IT to, uint32_t begin_id); + + template<typename IT> + static BitVector::UP orChildren(BitVector::UP 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); + template<typename IT> + static BitVector::UP orChildren(IT from, IT to, uint32_t begin_id); +private: + template<typename IT> + static BitVector::UP andIterators(BitVector::UP result, IT begin, IT end, uint32_t begin_id, bool select_bitvector); + template<typename IT> + static void andIterators(BitVector & result, IT begin, IT end, uint32_t begin_id, bool select_bitvector); + template<typename IT> + static BitVector::UP orIterators(BitVector::UP result, IT begin, IT end, uint32_t begin_id, bool select_bitvector); + template<typename IT> + static void orIterators(BitVector & result, IT begin, IT end, uint32_t begin_id, bool select_bitvector); +}; + +template<typename IT> +BitVector::UP +TermwiseHelper::andChildren(BitVector::UP result, IT from, IT to, uint32_t begin_id) { + return andIterators(andIterators(std::move(result), from, to, begin_id, true), from, to, begin_id, false); +} + +template<typename IT> +void +TermwiseHelper::andChildren(BitVector & result, IT from, IT to, uint32_t begin_id) { + andIterators(result, from, to, begin_id, true); + andIterators(result, from, to, begin_id, false); +} + +template<typename IT> +BitVector::UP +TermwiseHelper::andChildren(IT from, IT to, uint32_t begin_id) { + return andChildren(BitVector::UP(), from, to, begin_id); +} + +template<typename IT> +BitVector::UP +TermwiseHelper::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> +void +TermwiseHelper::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 +TermwiseHelper::orChildren(IT from, IT to, uint32_t begin_id) { + return orChildren(BitVector::UP(), from, to, begin_id); +} + +template<typename IT> +BitVector::UP +TermwiseHelper::andIterators(BitVector::UP result, IT begin, IT end, uint32_t begin_id, bool select_bitvector) { + for (IT it(begin); it != end; ++it) { + auto & child = *it; + if (child->isBitVector() == select_bitvector) { + if (!result) { + result = child->get_hits(begin_id); + } else { + child->and_hits_into(*result, begin_id); + } + } + } + return result; +} + +template<typename IT> +void +TermwiseHelper::andIterators(BitVector & result, IT begin, IT end, uint32_t begin_id, bool select_bitvector) { + for (IT it(begin); it != end; ++it) { + auto & child = *it; + if (child->isBitVector() == select_bitvector) { + child->and_hits_into(result, begin_id); + } + } +} + +template<typename IT> +BitVector::UP +TermwiseHelper::orIterators(BitVector::UP result, IT begin, IT end, uint32_t begin_id, bool select_bitvector) { + for (IT it(begin); it != end; ++it) { + auto & child = *it; + if (child->isBitVector() == select_bitvector) { + if (!result) { + result = child->get_hits(begin_id); + } else { + child->or_hits_into(*result, begin_id); + } + } + } + return result; +} + +template<typename IT> +void +TermwiseHelper::orIterators(BitVector & result, IT begin, IT end, uint32_t begin_id, bool select_bitvector) { + for (IT it(begin); it != end; ++it) { + auto & child = *it; + if (child->isBitVector() == select_bitvector) { + child->or_hits_into(result, begin_id); + } + } +} + +} +} |