diff options
5 files changed, 38 insertions, 39 deletions
diff --git a/dependency-versions/pom.xml b/dependency-versions/pom.xml index 43573ce0e93..fe3982c4e34 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.700</aws-sdk.vespa.version> + <aws-sdk.vespa.version>1.12.701</aws-sdk.vespa.version> <athenz.vespa.version>1.11.55</athenz.vespa.version> <!-- Athenz END --> @@ -137,7 +137,7 @@ <plexus-archiver.vespa.version>4.9.2</plexus-archiver.vespa.version> <plexus-interpolation.vespa.version>1.27</plexus-interpolation.vespa.version> <plexus-io.vespa.version>3.4.2</plexus-io.vespa.version> - <plexus-utils.vespa.version>4.0.0</plexus-utils.vespa.version> + <plexus-utils.vespa.version>4.0.1</plexus-utils.vespa.version> <plexus-xml.vespa.version>4.0.3</plexus-xml.vespa.version> <protobuf.vespa.version>3.25.3</protobuf.vespa.version> <questdb.vespa.version>7.4.0</questdb.vespa.version> @@ -176,7 +176,7 @@ <maven-failsafe-plugin.vespa.version>3.2.5</maven-failsafe-plugin.vespa.version> <maven-gpg-plugin.vespa.version>3.2.3</maven-gpg-plugin.vespa.version> <maven-install-plugin.vespa.version>3.1.1</maven-install-plugin.vespa.version> - <maven-jar-plugin.vespa.version>3.3.0</maven-jar-plugin.vespa.version> + <maven-jar-plugin.vespa.version>3.4.0</maven-jar-plugin.vespa.version> <maven-javadoc-plugin.vespa.version>3.6.3</maven-javadoc-plugin.vespa.version> <maven-plugin-api.vespa.version>${maven-core.vespa.version}</maven-plugin-api.vespa.version> <maven-plugin-tools.vespa.version>3.12.0</maven-plugin-tools.vespa.version> diff --git a/searchlib/src/vespa/searchlib/attribute/direct_multi_term_blueprint.h b/searchlib/src/vespa/searchlib/attribute/direct_multi_term_blueprint.h index 1759ca71432..413d0dd0bf4 100644 --- a/searchlib/src/vespa/searchlib/attribute/direct_multi_term_blueprint.h +++ b/searchlib/src/vespa/searchlib/attribute/direct_multi_term_blueprint.h @@ -93,8 +93,10 @@ public: } }; double est = OrFlow::estimate_of(MyAdapter(docid_limit), _terms); - return {est, OrFlow::cost_of(MyAdapter(docid_limit), _terms, false), - OrFlow::cost_of(MyAdapter(docid_limit), _terms, true) + queryeval::flow::heap_cost(est, _terms.size())}; + // Iterator benchmarking has shown that non-strict cost should be 1.0. + // Program: searchlib/src/tests/queryeval/iterator_benchmark + // TODO: Add more details, and consider moving constant to flow_tuning.h + return {est, 1.0, OrFlow::cost_of(MyAdapter(docid_limit), _terms, true) + queryeval::flow::heap_cost(est, _terms.size())}; } std::unique_ptr<queryeval::SearchIterator> createLeafSearch(const fef::TermFieldMatchDataArray &tfmda) const override; diff --git a/searchlib/src/vespa/searchlib/queryeval/hitcollector.cpp b/searchlib/src/vespa/searchlib/queryeval/hitcollector.cpp index b43b560ae2a..bf7f44f0e7a 100644 --- a/searchlib/src/vespa/searchlib/queryeval/hitcollector.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/hitcollector.cpp @@ -34,8 +34,7 @@ HitCollector::sortHitsByDocId() } } -HitCollector::HitCollector(uint32_t numDocs, - uint32_t maxHitsSize) +HitCollector::HitCollector(uint32_t numDocs, uint32_t maxHitsSize) : _numDocs(numDocs), _maxHitsSize(std::min(maxHitsSize, numDocs)), _maxDocIdVectorSize((numDocs + 31) / 32), @@ -63,14 +62,14 @@ HitCollector::RankedHitCollector::collect(uint32_t docId, feature_t score) { HitCollector & hc = this->_hc; if (hc._hits.size() < hc._maxHitsSize) { - if (__builtin_expect(((hc._hits.size() > 0) && + if (__builtin_expect(((!hc._hits.empty()) && (docId < hc._hits.back().first) && (hc._hitsSortOrder == SortOrder::DOC_ID)), false)) { hc._hitsSortOrder = SortOrder::NONE; hc._unordered = true; } - hc._hits.push_back(std::make_pair(docId, score)); + hc._hits.emplace_back(docId, score); } else { collectAndChangeCollector(docId, score); } @@ -86,7 +85,7 @@ HitCollector::BitVectorCollector<CollectRankedHit>::collect(uint32_t docId, feat } void -HitCollector::CollectorBase::replaceHitInVector(uint32_t docId, feature_t score) { +HitCollector::CollectorBase::replaceHitInVector(uint32_t docId, feature_t score) noexcept { // replace lowest scored hit in hit vector std::pop_heap(_hc._hits.begin(), _hc._hits.end(), ScoreComparator()); _hc._hits.back().first = docId; @@ -138,7 +137,7 @@ HitCollector::DocIdCollector<CollectRankedHit>::collect(uint32_t docId, feature_ } HitCollector & hc = this->_hc; if (hc._docIdVector.size() < hc._maxDocIdVectorSize) { - if (__builtin_expect(((hc._docIdVector.size() > 0) && + if (__builtin_expect(((!hc._docIdVector.empty()) && (docId < hc._docIdVector.back()) && (hc._unordered == false)), false)) { @@ -173,7 +172,7 @@ HitCollector::getSortedHitSequence(size_t max_hits) { size_t num_hits = std::min(_hits.size(), max_hits); sortHitsByScore(num_hits); - return SortedHitSequence(_hits.data(), _scoreOrder.data(), num_hits); + return {_hits.data(), _scoreOrder.data(), num_hits}; } void diff --git a/searchlib/src/vespa/searchlib/queryeval/hitcollector.h b/searchlib/src/vespa/searchlib/queryeval/hitcollector.h index a98a5bdf625..94ffe619bab 100644 --- a/searchlib/src/vespa/searchlib/queryeval/hitcollector.h +++ b/searchlib/src/vespa/searchlib/queryeval/hitcollector.h @@ -39,7 +39,7 @@ private: feature_t _adjust; struct ScoreComparator { - bool operator() (const Hit & lhs, const Hit & rhs) const { + bool operator() (const Hit & lhs, const Hit & rhs) const noexcept { if (lhs.second == rhs.second) { return (lhs.first < rhs.first); } @@ -48,7 +48,7 @@ private: }; struct IndirectScoreComparator { - IndirectScoreComparator(const Hit * hits) : _hits(hits) { } + explicit IndirectScoreComparator(const Hit * hits) noexcept : _hits(hits) { } bool operator() (uint32_t lhs, uint32_t rhs) const { if (_hits[lhs].second == _hits[rhs].second) { return (_hits[lhs].first < _hits[rhs].first); @@ -59,17 +59,17 @@ private: }; struct IndirectScoreRadix { - IndirectScoreRadix(const Hit * hits) : _hits(hits) { } - uint64_t operator () (uint32_t v) { + explicit IndirectScoreRadix(const Hit * hits) noexcept : _hits(hits) { } + uint64_t operator () (uint32_t v) const noexcept { return vespalib::convertForSort<double, false>::convert(_hits[v].second); } const Hit * _hits; }; struct DocIdRadix { - uint32_t operator () (const Hit & v) { return v.first; } + uint32_t operator () (const Hit & v) const noexcept { return v.first; } }; struct DocIdComparator { - bool operator() (const Hit & lhs, const Hit & rhs) const { + bool operator() (const Hit & lhs, const Hit & rhs) const noexcept { return (lhs.first < rhs.first); } }; @@ -77,47 +77,47 @@ private: class Collector { public: using UP = std::unique_ptr<Collector>; - virtual ~Collector() {} + virtual ~Collector() = default; virtual void collect(uint32_t docId, feature_t score) = 0; - virtual bool isDocIdCollector() const { return false; } + virtual bool isDocIdCollector() const noexcept { return false; } }; Collector::UP _collector; class CollectorBase : public Collector { public: - CollectorBase(HitCollector &hc) : _hc(hc) { } + explicit CollectorBase(HitCollector &hc) noexcept : _hc(hc) { } void considerForHitVector(uint32_t docId, feature_t score) { if (__builtin_expect((score > _hc._hits[0].second), false)) { replaceHitInVector(docId, score); } } protected: - void replaceHitInVector(uint32_t docId, feature_t score); + VESPA_DLL_LOCAL void replaceHitInVector(uint32_t docId, feature_t score) noexcept; HitCollector &_hc; }; - class RankedHitCollector : public CollectorBase { + class RankedHitCollector final : public CollectorBase { public: - RankedHitCollector(HitCollector &hc) : CollectorBase(hc) { } + explicit RankedHitCollector(HitCollector &hc) noexcept : CollectorBase(hc) { } void collect(uint32_t docId, feature_t score) override; void collectAndChangeCollector(uint32_t docId, feature_t score) __attribute__((noinline)); }; template <bool CollectRankedHit> - class DocIdCollector : public CollectorBase { + class DocIdCollector final : public CollectorBase { public: - DocIdCollector(HitCollector &hc) : CollectorBase(hc) { } + explicit DocIdCollector(HitCollector &hc) noexcept : CollectorBase(hc) { } void collect(uint32_t docId, feature_t score) override; void collectAndChangeCollector(uint32_t docId) __attribute__((noinline)); - bool isDocIdCollector() const override { return true; } + bool isDocIdCollector() const noexcept override { return true; } }; template <bool CollectRankedHit> - class BitVectorCollector : public CollectorBase { + class BitVectorCollector final : public CollectorBase { public: - BitVectorCollector(HitCollector &hc) : CollectorBase(hc) { } - virtual void collect(uint32_t docId, feature_t score) override; + explicit BitVectorCollector(HitCollector &hc) noexcept : CollectorBase(hc) { } + void collect(uint32_t docId, feature_t score) override; }; HitRank getReScore(feature_t score) const { 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 f5231cf3509..f915a7df335 100644 --- a/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.cpp @@ -7,12 +7,11 @@ #include <vespa/vespalib/util/priority_queue.h> #include <vespa/vespalib/objects/visit.hpp> -namespace search { -namespace queryeval { +namespace search::queryeval { namespace wand { template <typename FutureHeap, typename PastHeap, bool IS_STRICT> -class WeakAndSearchLR : public WeakAndSearch +class WeakAndSearchLR final : public WeakAndSearch { private: using Scores = vespalib::PriorityQueue<score_t>; @@ -47,7 +46,7 @@ public: : _terms(terms, TermFrequencyScorer(), 0, - fef::MatchData::UP(nullptr)), + fef::MatchData::UP()), _heaps(DocIdOrder(_terms.docId()), _terms.size()), _algo(), _threshold(1), @@ -55,9 +54,9 @@ public: _n(n) { } - virtual size_t get_num_terms() const override { return _terms.size(); } - virtual int32_t get_term_weight(size_t idx) const override { return _terms.weight(idx); } - virtual score_t get_max_score(size_t idx) const override { return _terms.maxScore(idx); } + size_t get_num_terms() const override { return _terms.size(); } + int32_t get_term_weight(size_t idx) const override { return _terms.weight(idx); } + score_t get_max_score(size_t idx) const override { return _terms.maxScore(idx); } const Terms &getTerms() const override { return _terms.input_terms(); } uint32_t getN() const override { return _n; } void doSeek(uint32_t docid) override { @@ -138,5 +137,4 @@ WeakAndSearch::create(const Terms &terms, uint32_t n, bool strict) //----------------------------------------------------------------------------- -} // namespace queryeval -} // namespace search +} |