summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-06-22 14:30:49 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2017-06-22 14:30:49 +0200
commit541ef10095dd40c3f9fee45abb53df5e3cbcef32 (patch)
tree06b65ddf44653c6812c07349ffc2d969001cc0f2 /searchlib
parent8e82ac891cc8648a60bd9cc0790ff6c4986d93f8 (diff)
Use isAtEnd instead of doing double bookeeping of dcoIdLimit
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributeiterators.cpp14
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributeiterators.h23
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp40
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