diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-02-10 00:38:57 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-02-13 11:19:14 +0000 |
commit | 27736196bfd617462814800106c6c1f598f8af4e (patch) | |
tree | 3aafecd137db9f8fae980a8148d8e7e7f7909634 /searchlib | |
parent | c2f992a13649259c984088294620f1342e5115a6 (diff) |
Specialize basic attribute iterators for termwise evaluation.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/attributeiterators.h | 4 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp | 28 |
2 files changed, 31 insertions, 1 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/attributeiterators.h b/searchlib/src/vespa/searchlib/attribute/attributeiterators.h index 89d4429451b..ebc40d6b116 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributeiterators.h +++ b/searchlib/src/vespa/searchlib/attribute/attributeiterators.h @@ -25,6 +25,8 @@ protected: void and_hits_into(const SC & sc, BitVector & result, uint32_t begin_id) const; template <typename SC> void or_hits_into(const SC & sc, BitVector & result, uint32_t begin_id) const; + template <typename SC> + std::unique_ptr<BitVector> get_hits(const SC & sc, uint32_t begin_id) const; void visitMembers(vespalib::ObjectVisitor &visitor) const override; fef::TermFieldMatchData * _matchData; fef::TermFieldMatchDataPosition * _matchPosition; @@ -77,6 +79,7 @@ private: void visitMembers(vespalib::ObjectVisitor &visitor) const override; void and_hits_into(BitVector & result, uint32_t begin_id) override; void or_hits_into(BitVector & result, uint32_t begin_id) override; + std::unique_ptr<BitVector> get_hits(uint32_t begin_id) override; protected: const SC & _searchContext; @@ -95,6 +98,7 @@ private: void visitMembers(vespalib::ObjectVisitor &visitor) const override; void and_hits_into(BitVector & result, uint32_t begin_id) override; void or_hits_into(BitVector & result, uint32_t begin_id) override; + std::unique_ptr<BitVector> get_hits(uint32_t begin_id) override; protected: const SC & _searchContext; diff --git a/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp b/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp index c12f633160d..c9e23f85674 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp +++ b/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp @@ -25,6 +25,19 @@ AttributeIteratorBase::or_hits_into(const SC & sc, BitVector & result, uint32_t result.foreach_falsebit([&](uint32_t key) { if ( sc.cmp(key)) { result.setBit(key); }}, begin_id); } +template <typename SC> +std::unique_ptr<BitVector> +AttributeIteratorBase::get_hits(const SC & sc, uint32_t begin_id) const { + BitVector::UP result = BitVector::create(begin_id, getEndId()); + for (uint32_t docId(begin_id); docId < getEndId(); docId++) { + if (sc.cmp(docId)) { + result->setBit(docId); + } + } + result.foreach_falsebit([&](uint32_t key) { if ( sc.cmp(key)) { result.setBit(key); }}, begin_id); + return result; +} + template <typename PL> AttributePostingListIteratorT<PL>:: AttributePostingListIteratorT(PL &iterator, bool hasWeight, fef::TermFieldMatchData *matchData) @@ -277,7 +290,20 @@ void FilterAttributeIteratorT<SC>::or_hits_into(BitVector & result, uint32_t begin_id) { AttributeIteratorBase::or_hits_into(_searchContext, result, begin_id); } - + +template <typename SC> +void +AttributeIteratorT<SC>::get_hits(uint32_t begin_id) { + return AttributeIteratorBase::get_hits(_searchContext, begin_id); +} + + +template <typename SC> +void +FilterAttributeIteratorT<SC>::get_hits(uint32_t begin_id) { + return AttributeIteratorBase::get_hits(_searchContext, begin_id); +} + template <typename SC> void AttributeIteratorT<SC>::and_hits_into(BitVector & result, uint32_t begin_id) { |