diff options
author | Tor Egge <Tor.Egge@broadpark.no> | 2020-06-15 15:46:52 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@broadpark.no> | 2020-06-15 15:46:52 +0200 |
commit | e04034b9dc7dd3b03ed609395e341c6de560302b (patch) | |
tree | 30af942e88b7346a9f505c36c7cb792817e7f449 | |
parent | d2bd498b4d89afd7b170602549cd165abb843e09 (diff) |
Factor out common code.
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp | 67 |
1 files changed, 31 insertions, 36 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp b/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp index d0ef5027aaf..d1226a07703 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp +++ b/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp @@ -132,6 +132,33 @@ struct is_tree_iterator<vespalib::btree::BTreeConstIterator<KeyT, DataT, AggrT, template <typename PL> inline constexpr bool is_tree_iterator_v = is_tree_iterator<PL>::value; +template <typename PL> +void get_hits_helper(BitVector& result, PL& iterator, uint32_t end_id) +{ + auto end_itr = iterator; + if (end_itr.valid() && end_itr.getKey() < end_id) { + end_itr.seek(end_id); + } + iterator.foreach_key_range(end_itr, [&](uint32_t key) { result.setBit(key); }); + iterator = end_itr; +} + +template <typename PL> +void or_hits_helper(BitVector& result, PL& iterator, uint32_t end_id) +{ + auto end_itr = iterator; + if (end_itr.valid() && end_itr.getKey() < end_id) { + end_itr.seek(end_id); + } + iterator.foreach_key_range(end_itr, [&](uint32_t key) + { + if (!result.testBit(key)) { + result.setBit(key); + } + }); + iterator = end_itr; +} + } template <typename PL> @@ -139,13 +166,7 @@ std::unique_ptr<BitVector> AttributePostingListIteratorT<PL>::get_hits(uint32_t begin_id) { BitVector::UP result(BitVector::create(begin_id, getEndId())); if constexpr (is_tree_iterator_v<PL>) { - auto end_itr = _iterator; - if (end_itr.valid() && end_itr.getKey() < getEndId()) { - end_itr.seek(getEndId()); - } - BitVector *resultp = result.get(); - _iterator.foreach_key_range(end_itr, [=](uint32_t key) { resultp->setBit(key); }); - _iterator = end_itr; + get_hits_helper(*result, _iterator, getEndId()); } else { for (; _iterator.valid() && _iterator.getKey() < getEndId(); ++_iterator) { result->setBit(_iterator.getKey()); @@ -160,17 +181,7 @@ void AttributePostingListIteratorT<PL>::or_hits_into(BitVector & result, uint32_t begin_id) { (void) begin_id; if constexpr (is_tree_iterator_v<PL>) { - auto end_itr = _iterator; - if (end_itr.valid() && end_itr.getKey() < getEndId()) { - end_itr.seek(getEndId()); - } - _iterator.foreach_key_range(end_itr, [&](uint32_t key) - { - if (!result.testBit(key)) { - result.setBit(key); - } - }); - _iterator = end_itr; + or_hits_helper(result, _iterator, getEndId()); } else { for (; _iterator.valid() && _iterator.getKey() < getEndId(); ++_iterator) { if ( ! result.testBit(_iterator.getKey()) ) { @@ -192,13 +203,7 @@ std::unique_ptr<BitVector> FilterAttributePostingListIteratorT<PL>::get_hits(uint32_t begin_id) { BitVector::UP result(BitVector::create(begin_id, getEndId())); if constexpr (is_tree_iterator_v<PL>) { - auto end_itr = _iterator; - if (end_itr.valid() && end_itr.getKey() < getEndId()) { - end_itr.seek(getEndId()); - } - BitVector *resultp = result.get(); - _iterator.foreach_key_range(end_itr, [=](uint32_t key) { resultp->setBit(key); }); - _iterator = end_itr; + get_hits_helper(*result, _iterator, getEndId()); } else { for (; _iterator.valid() && _iterator.getKey() < getEndId(); ++_iterator) { result->setBit(_iterator.getKey()); @@ -213,17 +218,7 @@ void FilterAttributePostingListIteratorT<PL>::or_hits_into(BitVector & result, uint32_t begin_id) { (void) begin_id; if constexpr (is_tree_iterator_v<PL>) { - auto end_itr = _iterator; - if (end_itr.valid() && end_itr.getKey() < getEndId()) { - end_itr.seek(getEndId()); - } - _iterator.foreach_key_range(end_itr, [&](uint32_t key) - { - if (!result.testBit(key)) { - result.setBit(key); - } - }); - _iterator = end_itr; + or_hits_helper(result, _iterator, getEndId()); } else { for (; _iterator.valid() && _iterator.getKey() < getEndId(); ++_iterator) { if ( ! result.testBit(_iterator.getKey()) ) { |