aboutsummaryrefslogtreecommitdiffstats
path: root/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp')
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp66
1 files changed, 25 insertions, 41 deletions
diff --git a/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp b/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp
index e1ee72b0152..96bd3c733ec 100644
--- a/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp
+++ b/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp
@@ -33,9 +33,8 @@ HitCollector::Hit::Hit(const vsm::StorageDocument * doc, uint32_t docId, const
HitCollector::Hit::~Hit() = default;
-HitCollector::HitCollector(size_t wantedHits, bool use_sort_blob) :
+HitCollector::HitCollector(size_t wantedHits) :
_hits(),
- _use_sort_blob(use_sort_blob),
_sortedByDocId(true)
{
_hits.reserve(wantedHits);
@@ -78,44 +77,17 @@ bool
HitCollector::addHitToHeap(const Hit & hit) const
{
// return true if the given hit is better than the current worst one.
- return (_use_sort_blob)
- ? (hit.cmpSort(_hits[0]) < 0)
- : (hit.cmpRank(_hits[0]) < 0);
-}
-
-void
-HitCollector::make_heap() {
- if (_use_sort_blob) {
- std::make_heap(_hits.begin(), _hits.end(), Hit::SortComparator());
- } else {
- std::make_heap(_hits.begin(), _hits.end(), Hit::RankComparator());
- }
-}
-
-void
-HitCollector::pop_heap() {
- if (_use_sort_blob) {
- std::pop_heap(_hits.begin(), _hits.end(), Hit::SortComparator());
- } else {
- std::pop_heap(_hits.begin(), _hits.end(), Hit::RankComparator());
- }
-}
-
-void
-HitCollector::push_heap() {
- if (_use_sort_blob) {
- std::push_heap(_hits.begin(), _hits.end(), Hit::SortComparator());
- } else {
- std::push_heap(_hits.begin(), _hits.end(), Hit::RankComparator());
- }
+ return (hit.getSortBlob().empty())
+ ? (hit.cmpRank(_hits[0]) < 0)
+ : (hit.cmpSort(_hits[0]) < 0);
}
bool
HitCollector::addHit(Hit && hit)
{
bool amongTheBest(false);
- size_t avail = (_hits.capacity() - _hits.size());
- assert(_use_sort_blob != hit.getSortBlob().empty() );
+ ssize_t avail = (_hits.capacity() - _hits.size());
+ bool useSortBlob( ! hit.getSortBlob().empty() );
if (avail > 1) {
// No heap yet.
_hits.emplace_back(std::move(hit));
@@ -124,14 +96,28 @@ HitCollector::addHit(Hit && hit)
// this happens when wantedHitCount = 0
// in this case we shall not put anything on the heap (which is empty)
} else if ( avail == 0 && addHitToHeap(hit)) { // already a heap
- pop_heap();
+ if (useSortBlob) {
+ std::pop_heap(_hits.begin(), _hits.end(), Hit::SortComparator());
+ } else {
+ std::pop_heap(_hits.begin(), _hits.end(), Hit::RankComparator());
+ }
+
_hits.back() = std::move(hit);
amongTheBest = true;
- push_heap();
+
+ if (useSortBlob) {
+ std::push_heap(_hits.begin(), _hits.end(), Hit::SortComparator());
+ } else {
+ std::push_heap(_hits.begin(), _hits.end(), Hit::RankComparator());
+ }
} else if (avail == 1) { // make a heap of the hit vector
_hits.emplace_back(std::move(hit));
amongTheBest = true;
- make_heap();
+ if (useSortBlob) {
+ std::make_heap(_hits.begin(), _hits.end(), Hit::SortComparator());
+ } else {
+ std::make_heap(_hits.begin(), _hits.end(), Hit::RankComparator());
+ }
_sortedByDocId = false; // the hit vector is no longer sorted by docId
}
return amongTheBest;
@@ -141,9 +127,7 @@ void
HitCollector::fillSearchResult(vdslib::SearchResult & searchResult, FeatureValues&& match_features)
{
sortByDocId();
- size_t count = std::min(_hits.size(), searchResult.getWantedHitCount());
- for (size_t i(0); i < count; i++) {
- const Hit & hit = _hits[i];
+ for (const Hit & hit : _hits) {
vespalib::string documentId(hit.getDocument().docDoc().getId().toString());
search::DocumentIdT docId = hit.getDocId();
SearchResult::RankType rank = hit.getRankScore();
@@ -177,8 +161,8 @@ HitCollector::getFeatureSet(IRankProgram &rankProgram,
auto names = FefUtils::extract_feature_names(resolver, feature_rename_map);
FeatureSet::SP retval = std::make_shared<FeatureSet>(names, _hits.size());
for (const Hit & hit : _hits) {
+ rankProgram.run(hit.getDocId(), hit.getMatchData());
uint32_t docId = hit.getDocId();
- rankProgram.run(docId, hit.getMatchData());
auto * f = retval->getFeaturesByIndex(retval->addDocId(docId));
FefUtils::extract_feature_values(resolver, docId, f);
}