diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-06-22 14:30:49 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-06-22 14:30:49 +0200 |
commit | 541ef10095dd40c3f9fee45abb53df5e3cbcef32 (patch) | |
tree | 06b65ddf44653c6812c07349ffc2d969001cc0f2 /searchlib | |
parent | 8e82ac891cc8648a60bd9cc0790ff6c4986d93f8 (diff) |
Use isAtEnd instead of doing double bookeeping of dcoIdLimit
Diffstat (limited to 'searchlib')
3 files changed, 27 insertions, 50 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/attributeiterators.cpp b/searchlib/src/vespa/searchlib/attribute/attributeiterators.cpp index 79f45a2a700..92c0fe5d37c 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributeiterators.cpp +++ b/searchlib/src/vespa/searchlib/attribute/attributeiterators.cpp @@ -21,25 +21,16 @@ AttributeIteratorBase::visitMembers(vespalib::ObjectVisitor &visitor) const visit(visitor, "tfmd.docId", _matchData->getDocId()); } -FilterAttributeIterator::FilterAttributeIterator(fef::TermFieldMatchData * matchData, uint32_t docIdLimit) - : AttributeIteratorBase(matchData), - _docIdLimit(docIdLimit) +FilterAttributeIterator::FilterAttributeIterator(fef::TermFieldMatchData * matchData) + : AttributeIteratorBase(matchData) { _matchPosition->setElementWeight(1); } void -FilterAttributeIterator::visitMembers(vespalib::ObjectVisitor &visitor) const -{ - AttributeIteratorBase::visitMembers(visitor); - visit(visitor, "docIdLimit", _docIdLimit); -} - -void AttributeIterator::visitMembers(vespalib::ObjectVisitor &visitor) const { AttributeIteratorBase::visitMembers(visitor); - visit(visitor, "docIdLimit", _docIdLimit); visit(visitor, "weight", _weight); } @@ -53,7 +44,6 @@ FlagAttributeIterator::doUnpack(uint32_t docId) AttributePostingListIterator:: AttributePostingListIterator(bool hasWeight, TermFieldMatchData *matchData) : AttributeIteratorBase(matchData), _hasWeight(hasWeight) - // _hasWeight(_searchContext.attribute().hasWeightedSetType()) { } diff --git a/searchlib/src/vespa/searchlib/attribute/attributeiterators.h b/searchlib/src/vespa/searchlib/attribute/attributeiterators.h index a7ec31c1f37..09db5c334db 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributeiterators.h +++ b/searchlib/src/vespa/searchlib/attribute/attributeiterators.h @@ -49,26 +49,22 @@ public: class AttributeIterator : public AttributeIteratorBase { public: - AttributeIterator(fef::TermFieldMatchData * matchData, uint32_t docIdLimit) + AttributeIterator(fef::TermFieldMatchData * matchData) : AttributeIteratorBase(matchData), - _docIdLimit(docIdLimit), _weight(1) { } protected: void visitMembers(vespalib::ObjectVisitor &visitor) const override; void doUnpack(uint32_t docId) override; - uint32_t _docIdLimit; int32_t _weight; }; class FilterAttributeIterator : public AttributeIteratorBase { public: - FilterAttributeIterator(fef::TermFieldMatchData * matchData, uint32_t docIdLimit); + FilterAttributeIterator(fef::TermFieldMatchData * matchData); protected: - void visitMembers(vespalib::ObjectVisitor &visitor) const override; void doUnpack(uint32_t docId) override; - uint32_t _docIdLimit; }; template <typename SC> @@ -89,7 +85,6 @@ public: bool seekFast(uint32_t docId) const { return _searchContext.cmp(docId); } }; - template <typename SC> class FilterAttributeIteratorT : public FilterAttributeIterator { @@ -121,10 +116,10 @@ template <typename SC> class AttributeIteratorStrict : public AttributeIteratorT<SC> { private: - using AttributeIteratorT<SC>::_docIdLimit; using AttributeIteratorT<SC>::_searchContext; using AttributeIteratorT<SC>::setDocId; using AttributeIteratorT<SC>::setAtEnd; + using AttributeIteratorT<SC>::isAtEnd; using AttributeIteratorT<SC>::_weight; using Trinary=vespalib::Trinary; void doSeek(uint32_t docId) override; @@ -140,10 +135,10 @@ template <typename SC> class FilterAttributeIteratorStrict : public FilterAttributeIteratorT<SC> { private: - using FilterAttributeIteratorT<SC>::_docIdLimit; using FilterAttributeIteratorT<SC>::_searchContext; using FilterAttributeIteratorT<SC>::setDocId; using FilterAttributeIteratorT<SC>::setAtEnd; + using FilterAttributeIteratorT<SC>::isAtEnd; using Trinary=vespalib::Trinary; void doSeek(uint32_t docId) override; Trinary is_strict() const override { return Trinary::True; } @@ -330,11 +325,11 @@ template <typename SC> class FlagAttributeIteratorT : public FlagAttributeIterator { private: + using Attribute = typename SC::Attribute; void doSeek(uint32_t docId) override; protected: const SC & _sc; - uint32_t _docIdLimit; void or_hits_into(BitVector &result, uint32_t begin_id) override; void and_hits_into(BitVector &result, uint32_t begin_id) override; @@ -343,9 +338,7 @@ protected: public: FlagAttributeIteratorT(const SC &sc, fef::TermFieldMatchData * matchData) : FlagAttributeIterator(matchData), - _sc(sc), - _docIdLimit(static_cast<const typename SC::Attribute &> - (sc.attribute()).getCommittedDocIdLimit()) + _sc(sc) { } void initRange(uint32_t begin, uint32_t end) override { @@ -361,10 +354,11 @@ template <typename SC> class FlagAttributeIteratorStrict : public FlagAttributeIteratorT<SC> { private: - using FlagAttributeIteratorT<SC>::_docIdLimit; using FlagAttributeIteratorT<SC>::_sc; using FlagAttributeIteratorT<SC>::setDocId; using FlagAttributeIteratorT<SC>::setAtEnd; + using FlagAttributeIteratorT<SC>::isAtEnd; + using Attribute = typename SC::Attribute; using Trinary=vespalib::Trinary; void doSeek(uint32_t docId) override; Trinary is_strict() const override { return Trinary::True; } @@ -376,4 +370,3 @@ public: }; } // namespace search - diff --git a/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp b/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp index 3c94283e867..87c2cc3e800 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp +++ b/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp @@ -62,7 +62,6 @@ void AttributePostingListIteratorT<PL>::initRange(uint32_t begin, uint32_t end) } } - template <typename PL> template<typename... Args> FilterAttributePostingListIteratorT<PL>:: @@ -208,15 +207,15 @@ FilterAttributeIteratorT<SC>::visitMembers(vespalib::ObjectVisitor &visitor) con template <typename SC> AttributeIteratorT<SC>::AttributeIteratorT(const SC &searchContext, fef::TermFieldMatchData *matchData) - : AttributeIterator(matchData, searchContext.attribute().getCommittedDocIdLimit()), - _searchContext(searchContext) + : AttributeIterator(matchData), + _searchContext(searchContext) { } template <typename SC> FilterAttributeIteratorT<SC>::FilterAttributeIteratorT(const SC &searchContext, fef::TermFieldMatchData *matchData) - : FilterAttributeIterator(matchData, searchContext._attr.getCommittedDocIdLimit()), - _searchContext(searchContext) + : FilterAttributeIterator(matchData), + _searchContext(searchContext) { } @@ -225,11 +224,10 @@ void FlagAttributeIteratorStrict<SC>::doSeek(uint32_t docId) { const SC & sc(_sc); - const typename SC::Attribute &attr = - static_cast<const typename SC::Attribute &>(sc.attribute()); + const Attribute &attr = static_cast<const Attribute &>(sc.attribute()); for (int i = sc._low; (i <= sc._high); ++i) { const BitVector * bv = attr.getBitVector(i); - if ((bv != NULL) && docId < _docIdLimit && bv->testBit(docId)) { + if ((bv != NULL) && !isAtEnd(docId) && bv->testBit(docId)) { setDocId(docId); return; } @@ -238,12 +236,12 @@ FlagAttributeIteratorStrict<SC>::doSeek(uint32_t docId) uint32_t minNextBit(search::endDocId); for (int i = sc._low; (i <= sc._high); ++i) { const BitVector * bv = attr.getBitVector(i); - if (bv != NULL && docId < _docIdLimit) { + if (bv != NULL && !isAtEnd(docId)) { uint32_t nextBit = bv->getNextTrueBit(docId); minNextBit = std::min(nextBit, minNextBit); } } - if (minNextBit < _docIdLimit) { + if (!isAtEnd(minNextBit)) { setDocId(minNextBit); } else { setAtEnd(); @@ -255,11 +253,10 @@ void FlagAttributeIteratorT<SC>::doSeek(uint32_t docId) { const SC & sc(_sc); - const typename SC::Attribute &attr = - static_cast<const typename SC::Attribute &>(sc.attribute()); + const Attribute &attr = static_cast<const Attribute &>(sc.attribute()); for (int i = sc._low; (i <= sc._high); ++i) { const BitVector * bv = attr.getBitVector(i); - if ((bv != NULL) && docId < _docIdLimit && bv->testBit(docId)) { + if ((bv != NULL) && !isAtEnd(docId) && bv->testBit(docId)) { setDocId(docId); return; } @@ -271,7 +268,7 @@ void FlagAttributeIteratorT<SC>::or_hits_into(BitVector &result, uint32_t begin_id) { (void) begin_id; const SC & sc(_sc); - const typename SC::Attribute &attr = static_cast<const typename SC::Attribute &>(sc.attribute()); + const Attribute &attr = static_cast<const Attribute &>(sc.attribute()); for (int i = sc._low; (i <= sc._high); ++i) { const BitVector * bv = attr.getBitVector(i); if (bv != NULL) { @@ -284,7 +281,7 @@ template <typename SC> void FlagAttributeIteratorT<SC>::and_hits_into(BitVector &result, uint32_t begin_id) { const SC & sc(_sc); - const typename SC::Attribute &attr = static_cast<const typename SC::Attribute &>(sc.attribute()); + const Attribute &attr = static_cast<const Attribute &>(sc.attribute()); if (sc._low == sc._high) { const BitVector * bv = attr.getBitVector(sc._low); if (bv != NULL) { @@ -303,7 +300,7 @@ template <typename SC> std::unique_ptr<BitVector> FlagAttributeIteratorT<SC>::get_hits(uint32_t begin_id) { const SC & sc(_sc); - const typename SC::Attribute &attr = static_cast<const typename SC::Attribute &>(sc.attribute()); + const Attribute &attr = static_cast<const Attribute &>(sc.attribute()); int i = sc._low; BitVector::UP result; for (;!result && i < sc._high; ++i) { @@ -332,7 +329,7 @@ template <typename SC> void AttributeIteratorT<SC>::doSeek(uint32_t docId) { - if (__builtin_expect(docId >= _docIdLimit, false)) { + if (isAtEnd(docId)) { setAtEnd(); } else if (_searchContext.cmp(docId, _weight)) { setDocId(docId); @@ -343,7 +340,7 @@ template <typename SC> void FilterAttributeIteratorT<SC>::doSeek(uint32_t docId) { - if (__builtin_expect(docId >= _docIdLimit, false)) { + if (isAtEnd(docId)) { setAtEnd(); } else if (_searchContext.cmp(docId)) { setDocId(docId); @@ -354,7 +351,7 @@ template <typename SC> void AttributeIteratorStrict<SC>::doSeek(uint32_t docId) { - for (uint32_t nextId = docId; nextId < _docIdLimit; ++nextId) { + for (uint32_t nextId = docId; !isAtEnd(nextId); ++nextId) { if (_searchContext.cmp(nextId, _weight)) { setDocId(nextId); return; @@ -367,7 +364,7 @@ template <typename SC> void FilterAttributeIteratorStrict<SC>::doSeek(uint32_t docId) { - for (uint32_t nextId = docId; nextId < _docIdLimit; ++nextId) { + for (uint32_t nextId = docId; !isAtEnd(nextId); ++nextId) { if (_searchContext.cmp(nextId)) { setDocId(nextId); return; @@ -382,7 +379,6 @@ AttributeIteratorT<SC>::or_hits_into(BitVector & result, uint32_t begin_id) { AttributeIteratorBase::or_hits_into(_searchContext, result, begin_id); } - template <typename SC> void FilterAttributeIteratorT<SC>::or_hits_into(BitVector & result, uint32_t begin_id) { @@ -395,7 +391,6 @@ AttributeIteratorT<SC>::get_hits(uint32_t begin_id) { return AttributeIteratorBase::get_hits(_searchContext, begin_id); } - template <typename SC> BitVector::UP FilterAttributeIteratorT<SC>::get_hits(uint32_t begin_id) { @@ -414,5 +409,4 @@ FilterAttributeIteratorT<SC>::and_hits_into(BitVector & result, uint32_t begin_i AttributeIteratorBase::and_hits_into(_searchContext, result, begin_id); } - } // namespace search |