aboutsummaryrefslogtreecommitdiffstats
path: root/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-01-25 14:52:33 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2017-01-25 14:52:33 +0100
commitb4be0edba445fff7ffc446e090904b546424a144 (patch)
tree10fb49a7b7d9010013741b2a1c4a1aec751b4656 /streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp
parente28f5cbd79a0b596e020c35ec9e905cf8daac63b (diff)
Move the heavy hits.
Diffstat (limited to 'streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp')
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp30
1 files changed, 22 insertions, 8 deletions
diff --git a/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp b/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp
index f65d4a1d100..c4faa87124d 100644
--- a/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp
+++ b/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp
@@ -12,6 +12,22 @@ using vdslib::SearchResult;
namespace storage {
+HitCollector::Hit::Hit(const vsm::StorageDocument::LP & doc, uint32_t docId, const search::fef::MatchData & matchData,
+ double score, const void * sortData, size_t sortDataLen) :
+ _docid(docId),
+ _score(score),
+ _document(doc),
+ _matchData(),
+ _sortBlob(sortData, sortDataLen)
+{
+ _matchData.reserve(matchData.getNumTermFields());
+ for (search::fef::TermFieldHandle handle = 0; handle < matchData.getNumTermFields(); ++handle) {
+ _matchData.emplace_back(*matchData.resolveTermField(handle));
+ }
+}
+
+HitCollector::Hit::~Hit() { }
+
HitCollector::HitCollector(size_t wantedHits) :
_hits(),
_sortedByDocId(true)
@@ -33,16 +49,14 @@ HitCollector::getDocSum(const search::DocumentIdT & docId) const
bool
HitCollector::addHit(const vsm::StorageDocument::LP & doc, uint32_t docId, const search::fef::MatchData & data, double score)
{
- Hit h(doc, docId, data, score);
- return addHit(h);
+ return addHit(Hit(doc, docId, data, score));
}
bool
HitCollector::addHit(const vsm::StorageDocument::LP & doc, uint32_t docId, const search::fef::MatchData & data,
double score, const void * sortData, size_t sortDataLen)
{
- Hit h(doc, docId, data, score, sortData, sortDataLen);
- return addHit(h);
+ return addHit(Hit(doc, docId, data, score, sortData, sortDataLen));
}
void
@@ -64,14 +78,14 @@ HitCollector::addHitToHeap(const Hit & hit) const
}
bool
-HitCollector::addHit(const Hit & hit)
+HitCollector::addHit(Hit && hit)
{
bool amongTheBest(false);
ssize_t avail = (_hits.capacity() - _hits.size());
bool useSortBlob( ! hit.getSortBlob().empty() );
if (avail > 1) {
// No heap yet.
- _hits.push_back(hit);
+ _hits.emplace_back(std::move(hit));
amongTheBest = true;
} else if (_hits.capacity() == 0) {
// this happens when wantedHitCount = 0
@@ -83,7 +97,7 @@ HitCollector::addHit(const Hit & hit)
std::pop_heap(_hits.begin(), _hits.end(), Hit::RankComparator());
}
- _hits.back() = hit;
+ _hits.back() = std::move(hit);
amongTheBest = true;
if (useSortBlob) {
@@ -92,7 +106,7 @@ HitCollector::addHit(const Hit & hit)
std::push_heap(_hits.begin(), _hits.end(), Hit::RankComparator());
}
} else if (avail == 1) { // make a heap of the hit vector
- _hits.push_back(hit);
+ _hits.emplace_back(std::move(hit));
amongTheBest = true;
if (useSortBlob) {
std::make_heap(_hits.begin(), _hits.end(), Hit::SortComparator());