diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-09-01 18:09:40 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-09-01 18:09:40 +0200 |
commit | 5a557cb8cccc438fbbb76b2779b6ebb89e2f3e86 (patch) | |
tree | 266f778fa2f20d1cebd359fe2679f4c4ac2b717d /searchlib | |
parent | 99ac491bb1b12de2ab8b23779d648d92ce424128 (diff) |
Populate bitvector on the fly.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp | 65 |
1 files changed, 25 insertions, 40 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp b/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp index d9e904aafdb..8d96d6a80e6 100644 --- a/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp +++ b/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp @@ -91,19 +91,28 @@ struct TargetWeightedResult { SearchContext &target_search_context, uint32_t committedDocIdLimit) __attribute__((noinline)); }; -struct TargetResult { - std::vector<EntryRef> refs; - size_t sizeSum; +class ReverseMappingBitVector +{ + const ReverseMapping &_reverseMapping; + EntryRef _revMapIdx; +public: + ReverseMappingBitVector(const ReverseMapping &reverseMapping, EntryRef revMapIdx) + : _reverseMapping(reverseMapping), + _revMapIdx(revMapIdx) + {} + ~ReverseMappingBitVector() { } - TargetResult() - : refs(), - sizeSum(0) - { + template <typename Func> + void foreach_key(Func func) const { + _reverseMapping.foreach_frozen_key(_revMapIdx, [func](uint32_t lid) { func(lid); }); } +}; - static TargetResult +struct TargetResult { + static void getResult(ReverseMappingRefs reverseMappingRefs, const ReverseMapping &reverseMapping, - SearchContext &target_search_context, uint32_t committedDocIdLimit) __attribute__((noinline)); + SearchContext &target_search_context, uint32_t committedDocIdLimit, + PostingListMerger<int32_t> & merger) __attribute__((noinline)); }; TargetWeightedResult @@ -141,11 +150,11 @@ TargetWeightedResult::getResult(ReverseMappingRefs reverseMappingRefs, const Rev return targetResult; } -TargetResult +void TargetResult::getResult(ReverseMappingRefs reverseMappingRefs, const ReverseMapping &reverseMapping, - SearchContext &target_search_context, uint32_t committedDocIdLimit) + SearchContext &target_search_context, uint32_t committedDocIdLimit, + PostingListMerger<int32_t> & merger) { - TargetResult targetResult; fef::TermFieldMatchData matchData; auto targetItr = target_search_context.createIterator(&matchData, true); uint32_t docIdLimit = reverseMappingRefs.size(); @@ -158,9 +167,7 @@ TargetResult::getResult(ReverseMappingRefs reverseMappingRefs, const ReverseMapp if (targetItr->seek(lid)) { EntryRef revMapIdx = reverseMappingRefs[lid]; if (revMapIdx.valid()) { - uint32_t size = reverseMapping.frozenSize(revMapIdx); - targetResult.sizeSum += size; - targetResult.refs.emplace_back(revMapIdx); + merger.addToBitVector(ReverseMappingBitVector(reverseMapping, revMapIdx)); } ++lid; } else { @@ -171,7 +178,6 @@ TargetResult::getResult(ReverseMappingRefs reverseMappingRefs, const ReverseMapp } } } - return targetResult; } class ReverseMappingPostingList @@ -194,23 +200,6 @@ public: }; -class ReverseMappingBitVector -{ - const ReverseMapping &_reverseMapping; - EntryRef _revMapIdx; -public: - ReverseMappingBitVector(const ReverseMapping &reverseMapping, EntryRef revMapIdx) - : _reverseMapping(reverseMapping), - _revMapIdx(revMapIdx) - {} - ~ReverseMappingBitVector() { } - - template <typename Func> - void foreach_key(Func func) const { - _reverseMapping.foreach_frozen_key(_revMapIdx, [func](uint32_t lid) { func(lid); }); - } -}; - } void ImportedSearchContext::makeMergedPostings(bool isFilter) @@ -219,14 +208,10 @@ void ImportedSearchContext::makeMergedPostings(bool isFilter) std::atomic_thread_fence(std::memory_order_acquire); const auto &reverseMapping = _reference_attribute.getReverseMapping(); if (isFilter) { - TargetResult targetResult(TargetResult::getResult(_reference_attribute.getReverseMappingRefs(), - _reference_attribute.getReverseMapping(), - *_target_search_context, - committedTargetDocIdLimit)); _merger.allocBitVector(); - for (EntryRef ref : targetResult.refs) { - _merger.addToBitVector(ReverseMappingBitVector(reverseMapping, ref)); - } + TargetResult::getResult(_reference_attribute.getReverseMappingRefs(), + _reference_attribute.getReverseMapping(), + *_target_search_context, committedTargetDocIdLimit, _merger); } else { TargetWeightedResult targetResult(TargetWeightedResult::getResult(_reference_attribute.getReverseMappingRefs(), _reference_attribute.getReverseMapping(), |