aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--client/js/app/yarn.lock28
-rw-r--r--dependency-versions/pom.xml2
-rw-r--r--searchlib/src/tests/queryeval/sparse_vector_benchmark/sparse_vector_benchmark_test.cpp62
-rw-r--r--searchlib/src/tests/queryeval/weak_and/rise_wand.h31
-rw-r--r--searchlib/src/tests/queryeval/weak_and/rise_wand.hpp35
-rw-r--r--searchlib/src/tests/queryeval/weak_and_scorers/weak_and_scorers_test.cpp10
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/wand/wand_parts.h36
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.cpp5
8 files changed, 96 insertions, 113 deletions
diff --git a/client/js/app/yarn.lock b/client/js/app/yarn.lock
index 7074aa923ec..c2a56b54b1d 100644
--- a/client/js/app/yarn.lock
+++ b/client/js/app/yarn.lock
@@ -2605,9 +2605,9 @@ eslint-plugin-prettier@^5:
synckit "^0.8.6"
eslint-plugin-react-hooks@^4:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3"
- integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==
+ version "4.6.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.1.tgz#85a7e271da14ae4eb4ed717abb4db6e99700550f"
+ integrity sha512-Ck77j8hF7l9N4S/rzSLOWEKpn994YH6iwUK8fr9mXIaQvGpQYmOnQLbiue1u5kI5T1y+gdgqosnEAO9NCz0DBg==
eslint-plugin-react-perf@^3:
version "3.3.2"
@@ -4700,12 +4700,12 @@ queue-microtask@^1.2.2:
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
react-dom@^18:
- version "18.2.0"
- resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
- integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
+ version "18.3.0"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.0.tgz#98a3a1cc4e471d517c2a084f38ab1d58d02cada7"
+ integrity sha512-zaKdLBftQJnvb7FtDIpZtsAIb2MZU087RM8bRDZU8LVCCFYjPTsDZJNFUWPcVz3HFSN1n/caxi0ca4B/aaVQGQ==
dependencies:
loose-envify "^1.1.0"
- scheduler "^0.23.0"
+ scheduler "^0.23.1"
react-is@^16.13.1, react-is@^16.7.0:
version "16.13.1"
@@ -4757,9 +4757,9 @@ react-transition-group@4.4.2:
prop-types "^15.6.2"
react@^18:
- version "18.2.0"
- resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
- integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
+ version "18.3.0"
+ resolved "https://registry.yarnpkg.com/react/-/react-18.3.0.tgz#84386d0a36fdf5ef50fa5755b7812bdfb76194a5"
+ integrity sha512-RPutkJftSAldDibyrjuku7q11d3oy6wKOyPe5K1HA/HwwrXcEqBdHsLypkC2FFYjP7bPUa6gbzSBhw4sY2JcDg==
dependencies:
loose-envify "^1.1.0"
@@ -4961,10 +4961,10 @@ sane@^4.0.3:
minimist "^1.1.1"
walker "~1.0.5"
-scheduler@^0.23.0:
- version "0.23.0"
- resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
- integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
+scheduler@^0.23.1:
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.1.tgz#ef964a7936d7cbe8f7bc0d38fc479a823aed2923"
+ integrity sha512-5GKS5JGfiah1O38Vfa9srZE4s3wdHbwjlCrvIookrg2FO9aIwKLOJXuJQFlEfNcVSOXuaL2hzDeY20uVXcUtrw==
dependencies:
loose-envify "^1.1.0"
diff --git a/dependency-versions/pom.xml b/dependency-versions/pom.xml
index 10aa71c1d90..41d37419c7e 100644
--- a/dependency-versions/pom.xml
+++ b/dependency-versions/pom.xml
@@ -68,7 +68,7 @@
<assertj.vespa.version>3.25.3</assertj.vespa.version>
<!-- Athenz dependencies. Make sure these dependencies match those in Vespa's internal repositories -->
- <aws-sdk.vespa.version>1.12.708</aws-sdk.vespa.version>
+ <aws-sdk.vespa.version>1.12.709</aws-sdk.vespa.version>
<athenz.vespa.version>1.11.57</athenz.vespa.version>
<!-- Athenz END -->
diff --git a/searchlib/src/tests/queryeval/sparse_vector_benchmark/sparse_vector_benchmark_test.cpp b/searchlib/src/tests/queryeval/sparse_vector_benchmark/sparse_vector_benchmark_test.cpp
index ae2c0cac76f..94ecd8fa539 100644
--- a/searchlib/src/tests/queryeval/sparse_vector_benchmark/sparse_vector_benchmark_test.cpp
+++ b/searchlib/src/tests/queryeval/sparse_vector_benchmark/sparse_vector_benchmark_test.cpp
@@ -9,7 +9,6 @@
#include <vespa/searchlib/queryeval/andnotsearch.h>
#include <vespa/searchlib/queryeval/andsearch.h>
#include <vespa/searchlib/queryeval/dot_product_search.h>
-#include <vespa/vespalib/util/rand48.h>
#include <vespa/searchlib/queryeval/orsearch.h>
#include <vespa/searchlib/queryeval/simpleresult.h>
#include <vespa/searchlib/queryeval/wand/weak_and_search.h>
@@ -27,9 +26,9 @@ namespace {
struct Writer {
FILE *file;
- Writer(const std::string &file_name) {
+ explicit Writer(const std::string &file_name) {
file = fopen(file_name.c_str(), "w");
- assert(file != 0);
+ assert(file != nullptr);
}
void write(const char *data, size_t size) const {
fwrite(data, 1, size, file);
@@ -53,7 +52,7 @@ private:
Writer _html;
public:
- Report(const std::string &file) : _html(file) {
+ explicit Report(const std::string &file) : _html(file) {
_html.fmt("<html>\n");
_html.fmt("<head><title>Sparse Vector Search Benchmark Report</title></head>\n");
_html.fmt("<body>\n");
@@ -82,7 +81,7 @@ private:
public:
using UP = std::unique_ptr<Graph>;
- Graph(const std::string &file) : _writer(file) {}
+ explicit Graph(const std::string &file) : _writer(file) {}
void addValue(double x, double y) { _writer.fmt("%g %g\n", x, y); }
};
@@ -98,8 +97,10 @@ private:
public:
using UP = std::unique_ptr<Plot>;
- Plot(const std::string &title) : _name(vespalib::make_string("plot.%d", _plots++)), _graphs(0),
- _writer(vespalib::make_string("%s.gnuplot", _name.c_str())) {
+ explicit Plot(const std::string &title)
+ : _name(vespalib::make_string("plot.%d", _plots++)), _graphs(0),
+ _writer(vespalib::make_string("%s.gnuplot", _name.c_str()))
+ {
std::string png_file = vespalib::make_string("%s.png", _name.c_str());
_writer.fmt("set term png size 1200,800\n");
_writer.fmt("set output '%s'\n", png_file.c_str());
@@ -118,10 +119,10 @@ public:
_writer.fmt("%s '%s' using 1:2 title '%s' w lines",
(_graphs == 0) ? "plot " : ",", file.c_str(), legend.c_str());
++_graphs;
- return Graph::UP(new Graph(file));
+ return std::make_unique<Graph>(file);
}
- static UP createPlot(const std::string &title) { return UP(new Plot(title)); }
+ static UP createPlot(const std::string &title) { return std::make_unique<Plot>(title); }
};
int Plot::_plots = 0;
@@ -137,19 +138,19 @@ struct ChildFactory {
ChildFactory() {}
virtual std::string name() const = 0;
virtual SearchIterator::UP createChild(uint32_t idx, uint32_t limit) const = 0;
- virtual ~ChildFactory() {}
+ virtual ~ChildFactory() = default;
};
struct SparseVectorFactory {
virtual std::string name() const = 0;
virtual SearchIterator::UP createSparseVector(ChildFactory &childFactory, uint32_t childCnt, uint32_t limit) const = 0;
- virtual ~SparseVectorFactory() {}
+ virtual ~SparseVectorFactory() = default;
};
struct FilterStrategy {
virtual std::string name() const = 0;
virtual SearchIterator::UP createRoot(SparseVectorFactory &vectorFactory, ChildFactory &childFactory, uint32_t childCnt, uint32_t limit) const = 0;
- virtual ~FilterStrategy() {}
+ virtual ~FilterStrategy() = default;
};
//-----------------------------------------------------------------------------
@@ -158,7 +159,7 @@ struct ModSearch : SearchIterator {
uint32_t step;
uint32_t limit;
ModSearch(uint32_t step_in, uint32_t limit_in) : step(step_in), limit(limit_in) { setDocId(step); }
- virtual void doSeek(uint32_t docid) override {
+ void doSeek(uint32_t docid) override {
assert(docid > getDocId());
uint32_t hit = (docid / step) * step;
if (hit < docid) {
@@ -171,14 +172,14 @@ struct ModSearch : SearchIterator {
setAtEnd();
}
}
- virtual void doUnpack(uint32_t) override {}
+ void doUnpack(uint32_t) override {}
};
struct ModSearchFactory : ChildFactory {
uint32_t bias;
ModSearchFactory() : bias(1) {}
explicit ModSearchFactory(int b) : bias(b) {}
- virtual std::string name() const override {
+ std::string name() const override {
return vespalib::make_string("ModSearch(%u)", bias);
}
SearchIterator::UP createChild(uint32_t idx, uint32_t limit) const override {
@@ -190,14 +191,14 @@ struct ModSearchFactory : ChildFactory {
struct VespaWandFactory : SparseVectorFactory {
uint32_t n;
- VespaWandFactory(uint32_t n_in) : n(n_in) {}
- virtual std::string name() const override {
+ explicit VespaWandFactory(uint32_t n_in) noexcept : n(n_in) {}
+ std::string name() const override {
return vespalib::make_string("VespaWand(%u)", n);
}
SearchIterator::UP createSparseVector(ChildFactory &childFactory, uint32_t childCnt, uint32_t limit) const override {
wand::Terms terms;
for (size_t i = 0; i < childCnt; ++i) {
- terms.push_back(wand::Term(childFactory.createChild(i, limit), default_weight, limit / (i + 1)));
+ terms.emplace_back(childFactory.createChild(i, limit), default_weight, limit / (i + 1));
}
return WeakAndSearch::create(terms, n, true);
}
@@ -205,16 +206,16 @@ struct VespaWandFactory : SparseVectorFactory {
struct RiseWandFactory : SparseVectorFactory {
uint32_t n;
- RiseWandFactory(uint32_t n_in) : n(n_in) {}
- virtual std::string name() const override {
+ explicit RiseWandFactory(uint32_t n_in) : n(n_in) {}
+ std::string name() const override {
return vespalib::make_string("RiseWand(%u)", n);
}
SearchIterator::UP createSparseVector(ChildFactory &childFactory, uint32_t childCnt, uint32_t limit) const override {
wand::Terms terms;
for (size_t i = 0; i < childCnt; ++i) {
- terms.push_back(wand::Term(childFactory.createChild(i, limit), default_weight, limit / (i + 1)));
+ terms.emplace_back(childFactory.createChild(i, limit), default_weight, limit / (i + 1));
}
- return SearchIterator::UP(new rise::TermFrequencyRiseWand(terms, n));
+ return std::make_unique<rise::TermFrequencyRiseWand>(terms, n);
}
};
@@ -230,7 +231,7 @@ struct WeightedSetFactory : SparseVectorFactory {
tfmd.tagAsNotNeeded();
}
}
- virtual std::string name() const override {
+ std::string name() const override {
return vespalib::make_string("WeightedSet%s%s", (field_is_filter ? "-filter" : ""), (tfmd.isNotNeeded() ? "-unranked" : ""));
}
SearchIterator::UP createSparseVector(ChildFactory &childFactory, uint32_t childCnt, uint32_t limit) const override {
@@ -257,7 +258,7 @@ struct DotProductFactory : SparseVectorFactory {
tfmd.tagAsNotNeeded();
}
}
- virtual std::string name() const override {
+ std::string name() const override {
return vespalib::make_string("DotProduct%s%s", (field_is_filter ? "-filter" : ""), (tfmd.isNotNeeded() ? "-unranked" : ""));
}
SearchIterator::UP createSparseVector(ChildFactory &childFactory, uint32_t childCnt, uint32_t limit) const override {
@@ -280,7 +281,7 @@ struct DotProductFactory : SparseVectorFactory {
};
struct OrFactory : SparseVectorFactory {
- virtual std::string name() const override {
+ std::string name() const override {
return vespalib::make_string("Or");
}
SearchIterator::UP createSparseVector(ChildFactory &childFactory, uint32_t childCnt, uint32_t limit) const override {
@@ -295,7 +296,7 @@ struct OrFactory : SparseVectorFactory {
//-----------------------------------------------------------------------------
struct NoFilterStrategy : FilterStrategy {
- virtual std::string name() const override {
+ std::string name() const override {
return vespalib::make_string("NoFilter");
}
SearchIterator::UP createRoot(SparseVectorFactory &vectorFactory, ChildFactory &childFactory, uint32_t childCnt, uint32_t limit) const override {
@@ -332,8 +333,8 @@ struct NegativeFilterAfterStrategy : FilterStrategy {
struct Result {
vespalib::duration time;
uint32_t num_hits;
- Result() : time(max_time), num_hits(0) {}
- Result(vespalib::duration t, uint32_t n) : time(t), num_hits(n) {}
+ Result() noexcept : time(max_time), num_hits(0) {}
+ Result(vespalib::duration t, uint32_t n) noexcept : time(t), num_hits(n) {}
void combine(const Result &r) {
if (time == max_time) {
*this = r;
@@ -357,7 +358,7 @@ Result run_single_benchmark(FilterStrategy &filterStrategy, SparseVectorFactory
++num_hits;
sb.unpack(sb.getDocId());
}
- return Result(timer.elapsed(), num_hits);
+ return {timer.elapsed(), num_hits};
}
//-----------------------------------------------------------------------------
@@ -384,8 +385,7 @@ public:
void benchmark(SparseVectorFactory &svf, const std::vector<uint32_t> &child_counts) {
Graph::UP graph = _plot->createGraph(svf.name());
fprintf(stderr, " search operator: %s\n", svf.name().c_str());
- for (size_t i = 0; i < child_counts.size(); ++i) {
- uint32_t childCnt = child_counts[i];
+ for (unsigned int childCnt : child_counts) {
Result result;
for (int j = 0; j < 5; ++j) {
result.combine(run_single_benchmark(_filterStrategy, svf, _childFactory, childCnt, _limit));
diff --git a/searchlib/src/tests/queryeval/weak_and/rise_wand.h b/searchlib/src/tests/queryeval/weak_and/rise_wand.h
index d4e66ec1907..4c7be54a6f0 100644
--- a/searchlib/src/tests/queryeval/weak_and/rise_wand.h
+++ b/searchlib/src/tests/queryeval/weak_and/rise_wand.h
@@ -15,8 +15,12 @@ namespace rise {
struct TermFreqScorer
{
- static int64_t calculateMaxScore(const wand::Term &term) {
- return TermFrequencyScorer::calculateMaxScore(term);
+ [[no_unique_address]] TermFrequencyScorer _termFrequencyScorer;
+ TermFreqScorer() noexcept
+ : _termFrequencyScorer()
+ { }
+ int64_t calculateMaxScore(const wand::Term &term) const noexcept {
+ return _termFrequencyScorer.calculateMaxScore(term);
}
static int64_t calculateScore(const wand::Term &term, uint32_t docId) {
term.search->unpack(docId);
@@ -43,9 +47,13 @@ private:
//const addr_t *const *_streamPayloads;
public:
- StreamComparator(const docid_t *streamDocIds);
+ explicit StreamComparator(const docid_t *streamDocIds) noexcept
+ : _streamDocIds(streamDocIds)
+ { }
//const addr_t *const *streamPayloads);
- inline bool operator()(const uint16_t a, const uint16_t b);
+ bool operator()(const uint16_t a, const uint16_t b) const noexcept {
+ return (_streamDocIds[a] < _streamDocIds[b]);
+ }
};
// number of streams present in the query
@@ -66,6 +74,7 @@ private:
// comparator that compares two streams
StreamComparator _streamComparator;
+ [[no_unique_address]] Scorer _scorer;
//-------------------------------------------------------------------------
// variables used for scoring and pruning
@@ -86,7 +95,7 @@ private:
*
* @return whether a valid pivot index is found
*/
- bool _findPivotFeatureIdx(const score_t threshold, uint32_t &pivotIdx);
+ bool _findPivotFeatureIdx(score_t threshold, uint32_t &pivotIdx);
/**
* let the first numStreamsToMove streams in the stream
@@ -94,7 +103,7 @@ private:
*
* @param numStreamsToMove the number of streams that should move
*/
- void _moveStreamsAndSort(const uint32_t numStreamsToMove);
+ void _moveStreamsAndSort(uint32_t numStreamsToMove);
/**
* let the first numStreamsToMove streams in the stream
@@ -106,7 +115,7 @@ private:
* @param desiredDocId desired doc id
*
*/
- void _moveStreamsToDocAndSort(const uint32_t numStreamsToMove, const docid_t desiredDocId);
+ void _moveStreamsToDocAndSort(uint32_t numStreamsToMove, docid_t desiredDocId);
/**
* do sort and merge for WAND
@@ -115,18 +124,18 @@ private:
* be sorted and then merge sort with the rest
*
*/
- void _sortMerge(const uint32_t numStreamsToSort);
+ void _sortMerge(uint32_t numStreamsToSort);
public:
RiseWand(const Terms &terms, uint32_t n);
- ~RiseWand();
+ ~RiseWand() override;
void next();
void doSeek(uint32_t docid) override;
void doUnpack(uint32_t docid) override;
};
-using TermFrequencyRiseWand = RiseWand<TermFreqScorer, std::greater_equal<uint64_t> >;
-using DotProductRiseWand = RiseWand<DotProductScorer, std::greater<uint64_t> >;
+using TermFrequencyRiseWand = RiseWand<TermFreqScorer, std::greater_equal<> >;
+using DotProductRiseWand = RiseWand<DotProductScorer, std::greater<> >;
} // namespacve rise
diff --git a/searchlib/src/tests/queryeval/weak_and/rise_wand.hpp b/searchlib/src/tests/queryeval/weak_and/rise_wand.hpp
index 32e17014f98..c477be5cc62 100644
--- a/searchlib/src/tests/queryeval/weak_and/rise_wand.hpp
+++ b/searchlib/src/tests/queryeval/weak_and/rise_wand.hpp
@@ -19,6 +19,7 @@ RiseWand<Scorer, Cmp>::RiseWand(const Terms &terms, uint32_t n)
_streamIndices(new uint16_t[terms.size()]),
_streamIndicesAux(new uint16_t[terms.size()]),
_streamComparator(_streamDocIds),
+ _scorer(),
_n(n),
_limit(1),
_streamScores(new score_t[terms.size()]),
@@ -26,7 +27,7 @@ RiseWand<Scorer, Cmp>::RiseWand(const Terms &terms, uint32_t n)
_terms(terms)
{
for (size_t i = 0; i < terms.size(); ++i) {
- _terms[i].maxScore = Scorer::calculateMaxScore(terms[i]);
+ _terms[i].maxScore = _scorer.calculateMaxScore(terms[i]);
_streamScores[i] = _terms[i].maxScore;
_streams.push_back(terms[i].search);
}
@@ -46,8 +47,8 @@ RiseWand<Scorer, Cmp>::RiseWand(const Terms &terms, uint32_t n)
template <typename Scorer, typename Cmp>
RiseWand<Scorer, Cmp>::~RiseWand()
{
- for (size_t i = 0; i < _streams.size(); ++i) {
- delete _streams[i];
+ for (auto * stream : _streams) {
+ delete stream;
}
delete [] _streamScores;
delete [] _streamIndicesAux;
@@ -137,8 +138,7 @@ RiseWand<Scorer, Cmp>::_moveStreamsAndSort(const uint32_t numStreamsToMove)
template <typename Scorer, typename Cmp>
void
-RiseWand<Scorer, Cmp>::_moveStreamsToDocAndSort(const uint32_t numStreamsToMove,
- const docid_t desiredDocId)
+RiseWand<Scorer, Cmp>::_moveStreamsToDocAndSort(const uint32_t numStreamsToMove, const docid_t desiredDocId)
{
for (uint32_t i=0; i<numStreamsToMove; ++i) {
_streams[_streamIndices[i]]->seek(desiredDocId);
@@ -195,7 +195,7 @@ RiseWand<Scorer, Cmp>::doUnpack(uint32_t docid)
{
score_t score = 0;
for (size_t i = 0; i <= _lastPivotIdx; ++i) {
- score += Scorer::calculateScore(_terms[_streamIndices[i]], docid);
+ score += _scorer.calculateScore(_terms[_streamIndices[i]], docid);
}
if (_scores.size() < _n || _scores.front() < score) {
_scores.push(score);
@@ -208,28 +208,5 @@ RiseWand<Scorer, Cmp>::doUnpack(uint32_t docid)
}
}
-/**
- ************ BEGIN STREAM COMPARTOR *********************
- */
-template <typename Scorer, typename Cmp>
-RiseWand<Scorer, Cmp>::StreamComparator::StreamComparator(
- const docid_t *streamDocIds)
- : _streamDocIds(streamDocIds)
-{
-}
-
-template <typename Scorer, typename Cmp>
-inline bool
-RiseWand<Scorer, Cmp>::StreamComparator::operator()(const uint16_t a,
- const uint16_t b)
-{
- if (_streamDocIds[a] < _streamDocIds[b]) return true;
- return false;
-}
-
-/**
- ************ END STREAM COMPARTOR *********************
- */
-
} // namespace rise
diff --git a/searchlib/src/tests/queryeval/weak_and_scorers/weak_and_scorers_test.cpp b/searchlib/src/tests/queryeval/weak_and_scorers/weak_and_scorers_test.cpp
index 528e117f976..e1f3f0805d9 100644
--- a/searchlib/src/tests/queryeval/weak_and_scorers/weak_and_scorers_test.cpp
+++ b/searchlib/src/tests/queryeval/weak_and_scorers/weak_and_scorers_test.cpp
@@ -25,18 +25,18 @@ struct TestIterator : public SearchIterator
_useInfo(useInfo),
_unpackDocId(0)
{}
- virtual void doSeek(uint32_t docId) override {
+ void doSeek(uint32_t docId) override {
(void) docId;
}
- virtual void doUnpack(uint32_t docId) override {
+ void doUnpack(uint32_t docId) override {
_unpackDocId = docId;
_tfmd.appendPosition(TermFieldMatchDataPosition(0, 0, _termWeight, 1));
}
- virtual const PostingInfo *getPostingInfo() const override {
- return (_useInfo ? &_info : NULL);
+ const PostingInfo *getPostingInfo() const override {
+ return (_useInfo ? &_info : nullptr);
}
static UP create(int32_t maxWeight, int32_t termWeight, bool useInfo) {
- return UP(new TestIterator(maxWeight, termWeight, useInfo));
+ return std::make_unique<TestIterator>(maxWeight, termWeight, useInfo);
}
};
diff --git a/searchlib/src/vespa/searchlib/queryeval/wand/wand_parts.h b/searchlib/src/vespa/searchlib/queryeval/wand/wand_parts.h
index ed8d4b4e4ac..4e781f8497b 100644
--- a/searchlib/src/vespa/searchlib/queryeval/wand/wand_parts.h
+++ b/searchlib/src/vespa/searchlib/queryeval/wand/wand_parts.h
@@ -163,7 +163,7 @@ public:
~VectorizedState();
template <typename Scorer, typename Input>
- std::vector<ref_t> init_state(const Input &input, uint32_t docIdLimit);
+ std::vector<ref_t> init_state(const Input &input, const Scorer & scorer, uint32_t docIdLimit);
docid_t *docId() { return &(_docId[0]); }
const int32_t *weight() const { return &(_weight[0]); }
@@ -202,14 +202,14 @@ VectorizedState<IteratorPack>::operator=(VectorizedState &&) noexcept = default;
template <typename IteratorPack>
template <typename Scorer, typename Input>
std::vector<ref_t>
-VectorizedState<IteratorPack>::init_state(const Input &input, uint32_t docIdLimit) {
+VectorizedState<IteratorPack>::init_state(const Input &input, const Scorer & scorer, uint32_t docIdLimit) {
std::vector<ref_t> order;
std::vector<score_t> max_scores;
order.reserve(input.size());
max_scores.reserve(input.size());
for (size_t i = 0; i < input.size(); ++i) {
order.push_back(i);
- max_scores.push_back(Scorer::calculate_max_score(input, i));
+ max_scores.push_back(scorer.calculate_max_score(input, i));
}
std::sort(order.begin(), order.end(), MaxSkipOrder<Input>(docIdLimit, input, max_scores));
_docId = assemble([&input](ref_t ref){ return input.get_initial_docid(ref); }, order);
@@ -238,7 +238,7 @@ private:
public:
template <typename Scorer>
- VectorizedIteratorTerms(const Terms &t, const Scorer &, uint32_t docIdLimit,
+ VectorizedIteratorTerms(const Terms &t, const Scorer & scorer, uint32_t docIdLimit,
fef::MatchData::UP childrenMatchData);
VectorizedIteratorTerms(VectorizedIteratorTerms &&) noexcept;
VectorizedIteratorTerms & operator=(VectorizedIteratorTerms &&) noexcept;
@@ -250,11 +250,11 @@ public:
};
template <typename Scorer>
-VectorizedIteratorTerms::VectorizedIteratorTerms(const Terms &t, const Scorer &, uint32_t docIdLimit,
+VectorizedIteratorTerms::VectorizedIteratorTerms(const Terms &t, const Scorer & scorer, uint32_t docIdLimit,
fef::MatchData::UP childrenMatchData)
: _terms()
{
- std::vector<ref_t> order = init_state<Scorer>(TermInput(t), docIdLimit);
+ std::vector<ref_t> order = init_state<Scorer>(TermInput(t), scorer, docIdLimit);
_terms = assemble([&t](ref_t ref){ return t[ref]; }, order);
iteratorPack() = SearchIteratorPack(assemble([&t](ref_t ref){ return t[ref].search; }, order),
assemble([&t](ref_t ref){ return t[ref].matchData; }, order),
@@ -268,10 +268,10 @@ struct VectorizedAttributeTerms : VectorizedState<DocidWithWeightIteratorPack> {
VectorizedAttributeTerms(const std::vector<int32_t> &weights,
const std::vector<IDirectPostingStore::LookupResult> &dict_entries,
const IDocidWithWeightPostingStore &attr,
- const Scorer &,
+ const Scorer & scorer,
docid_t docIdLimit)
{
- std::vector<ref_t> order = init_state<Scorer>(AttrInput(weights, dict_entries), docIdLimit);
+ std::vector<ref_t> order = init_state<Scorer>(AttrInput(weights, dict_entries), scorer, docIdLimit);
std::vector<DocidWithWeightIterator> iterators;
iterators.reserve(order.size());
for (size_t i = 0; i < order.size(); ++i) {
@@ -398,16 +398,16 @@ DualHeap<FutureHeap, PastHeap>::stringify() const {
struct TermFrequencyScorer
{
// weight * idf, scaled to fixedpoint
- static score_t calculateMaxScore(double estHits, double weight) noexcept {
+ score_t calculateMaxScore(double estHits, double weight) const noexcept {
return (score_t) (TermFrequencyScorer_TERM_SCORE_FACTOR * weight / (1.0 + log(1.0 + (estHits / 1000.0))));
}
- static score_t calculateMaxScore(const Term &term) noexcept {
+ score_t calculateMaxScore(const Term &term) const noexcept {
return calculateMaxScore(term.estHits, term.weight) + 1;
}
template <typename Input>
- static score_t calculate_max_score(const Input &input, ref_t ref) {
+ score_t calculate_max_score(const Input &input, ref_t ref) const noexcept {
return calculateMaxScore(input.get_est_hits(ref), input.get_weight(ref)) + 1;
}
};
@@ -521,10 +521,10 @@ private:
}
template <typename VectorizedTerms, typename Heaps, typename Scorer, typename AboveThreshold>
- bool check_present_score(VectorizedTerms &terms, Heaps &heaps, score_t &max_score, const Scorer &, AboveThreshold &&aboveThreshold) {
+ bool check_present_score(VectorizedTerms &terms, Heaps &heaps, score_t &max_score, const Scorer & scorer, AboveThreshold &&aboveThreshold) {
ref_t *end = heaps.present_end();
for (ref_t *ref = heaps.present_begin(); ref != end; ++ref) {
- score_t term_score = Scorer::calculateScore(terms, *ref, _candidate);
+ score_t term_score = scorer.calculateScore(terms, *ref, _candidate);
_partial_score += term_score;
max_score -= (terms.maxScore(*ref) - term_score);
if (!aboveThreshold(max_score)) {
@@ -535,11 +535,11 @@ private:
}
template <typename VectorizedTerms, typename Heaps, typename Scorer, typename AboveThreshold>
- bool check_past_score(VectorizedTerms &terms, Heaps &heaps, score_t &max_score, const Scorer &, AboveThreshold &&aboveThreshold) {
+ bool check_past_score(VectorizedTerms &terms, Heaps &heaps, score_t &max_score, const Scorer & scorer, AboveThreshold &&aboveThreshold) {
while (heaps.has_past() && !aboveThreshold(_partial_score)) {
heaps.pop_past();
if (step_term(terms, heaps.last_present())) {
- score_t term_score = Scorer::calculateScore(terms, heaps.last_present(), _candidate);
+ score_t term_score = scorer.calculateScore(terms, heaps.last_present(), _candidate);
_partial_score += term_score;
max_score -= (terms.maxScore(heaps.last_present()) - term_score);
} else {
@@ -618,7 +618,7 @@ public:
}
template <typename VectorizedTerms, typename Heaps, typename Scorer, typename AboveThreshold>
- bool check_score(VectorizedTerms &terms, Heaps &heaps, Scorer &&scorer, AboveThreshold &&aboveThreshold) {
+ bool check_score(VectorizedTerms &terms, Heaps &heaps, const Scorer &scorer, AboveThreshold &&aboveThreshold) {
_partial_score = 0;
score_t max_score = _maxUpperBound;
if (check_present_score(terms, heaps, max_score, scorer, aboveThreshold)) {
@@ -630,12 +630,12 @@ public:
}
template <typename VectorizedTerms, typename Heaps, typename Scorer>
- score_t get_full_score(VectorizedTerms &terms, Heaps &heaps, Scorer &&) {
+ score_t get_full_score(VectorizedTerms &terms, Heaps &heaps, const Scorer & scorer) {
score_t score = _partial_score;
while (heaps.has_past()) {
heaps.pop_any_past();
if (step_term(terms, heaps.last_present())) {
- score += Scorer::calculateScore(terms, heaps.last_present(), _candidate);
+ score += scorer.calculateScore(terms, heaps.last_present(), _candidate);
} else {
evict_last_present(terms, heaps);
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.cpp b/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.cpp
index 375a6598b49..04b1cb75da4 100644
--- a/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.cpp
@@ -43,10 +43,7 @@ private:
public:
WeakAndSearchLR(const Terms &terms, uint32_t n)
- : _terms(terms,
- TermFrequencyScorer(),
- 0,
- fef::MatchData::UP()),
+ : _terms(terms, TermFrequencyScorer(), 0, {}),
_heaps(DocIdOrder(_terms.docId()), _terms.size()),
_algo(),
_threshold(1),