aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2020-06-15 13:37:57 +0200
committerTor Egge <Tor.Egge@broadpark.no>2020-06-15 13:38:25 +0200
commitd2bd498b4d89afd7b170602549cd165abb843e09 (patch)
treeb5e5fccce6ae1c65f106f64addf21d4a272cc1de /searchlib
parent136dd71a56d4f60962da508ac3387bfafcdaeca9 (diff)
Use foreach_key_range for attribute iterator termwise evaluation
when inner iterator is a btree iterator.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp92
1 files changed, 82 insertions, 10 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp b/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp
index 17df4628606..d0ef5027aaf 100644
--- a/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp
@@ -110,12 +110,46 @@ AttributePostingListIteratorT<PL>::doSeek(uint32_t docId)
}
}
+namespace {
+
+template <typename> struct is_tree_iterator;
+
+template <typename P>
+struct is_tree_iterator<DocIdIterator<P>> {
+ static constexpr bool value = false;
+};
+
+template <typename P>
+struct is_tree_iterator<DocIdMinMaxIterator<P>> {
+ static constexpr bool value = false;
+};
+
+template <typename KeyT, typename DataT, typename AggrT, typename CompareT, typename TraitsT>
+struct is_tree_iterator<vespalib::btree::BTreeConstIterator<KeyT, DataT, AggrT, CompareT, TraitsT>> {
+ static constexpr bool value = true;
+};
+
+template <typename PL>
+inline constexpr bool is_tree_iterator_v = is_tree_iterator<PL>::value;
+
+}
+
template <typename PL>
std::unique_ptr<BitVector>
AttributePostingListIteratorT<PL>::get_hits(uint32_t begin_id) {
BitVector::UP result(BitVector::create(begin_id, getEndId()));
- for (; _iterator.valid() && _iterator.getKey() < getEndId(); ++_iterator) {
- result->setBit(_iterator.getKey());
+ 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;
+ } else {
+ for (; _iterator.valid() && _iterator.getKey() < getEndId(); ++_iterator) {
+ result->setBit(_iterator.getKey());
+ }
}
result->invalidateCachedCount();
return result;
@@ -125,9 +159,23 @@ template <typename PL>
void
AttributePostingListIteratorT<PL>::or_hits_into(BitVector & result, uint32_t begin_id) {
(void) begin_id;
- for (; _iterator.valid() && _iterator.getKey() < getEndId(); ++_iterator) {
- if ( ! result.testBit(_iterator.getKey()) ) {
- result.setBit(_iterator.getKey());
+ 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;
+ } else {
+ for (; _iterator.valid() && _iterator.getKey() < getEndId(); ++_iterator) {
+ if ( ! result.testBit(_iterator.getKey()) ) {
+ result.setBit(_iterator.getKey());
+ }
}
}
result.invalidateCachedCount();
@@ -143,8 +191,18 @@ template <typename PL>
std::unique_ptr<BitVector>
FilterAttributePostingListIteratorT<PL>::get_hits(uint32_t begin_id) {
BitVector::UP result(BitVector::create(begin_id, getEndId()));
- for (; _iterator.valid() && _iterator.getKey() < getEndId(); ++_iterator) {
- result->setBit(_iterator.getKey());
+ 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;
+ } else {
+ for (; _iterator.valid() && _iterator.getKey() < getEndId(); ++_iterator) {
+ result->setBit(_iterator.getKey());
+ }
}
result->invalidateCachedCount();
return result;
@@ -154,9 +212,23 @@ template <typename PL>
void
FilterAttributePostingListIteratorT<PL>::or_hits_into(BitVector & result, uint32_t begin_id) {
(void) begin_id;
- for (; _iterator.valid() && _iterator.getKey() < getEndId(); ++_iterator) {
- if ( ! result.testBit(_iterator.getKey()) ) {
- result.setBit(_iterator.getKey());
+ 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;
+ } else {
+ for (; _iterator.valid() && _iterator.getKey() < getEndId(); ++_iterator) {
+ if ( ! result.testBit(_iterator.getKey()) ) {
+ result.setBit(_iterator.getKey());
+ }
}
}
result.invalidateCachedCount();