aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-02-10 00:38:57 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2017-02-13 11:19:14 +0000
commit27736196bfd617462814800106c6c1f598f8af4e (patch)
tree3aafecd137db9f8fae980a8148d8e7e7f7909634 /searchlib
parentc2f992a13649259c984088294620f1342e5115a6 (diff)
Specialize basic attribute iterators for termwise evaluation.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributeiterators.h4
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp28
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) {