diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-05-12 12:11:13 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-05-12 12:11:13 +0000 |
commit | 9f6559f0104c6abb45852b82c0386e5702100c63 (patch) | |
tree | 03b446c2512f2126fa6f86be69bf5ef9a860a58c /searchlib | |
parent | 1f84a75a3c5f4b3056d8b263c3bf053db0904709 (diff) |
As a single field per blueprint is the common use case, make that optimal more optimal.
Diffstat (limited to 'searchlib')
6 files changed, 55 insertions, 44 deletions
diff --git a/searchlib/src/tests/queryeval/filter_search/filter_search_test.cpp b/searchlib/src/tests/queryeval/filter_search/filter_search_test.cpp index fdac3c582b1..ea4753ab847 100644 --- a/searchlib/src/tests/queryeval/filter_search/filter_search_test.cpp +++ b/searchlib/src/tests/queryeval/filter_search/filter_search_test.cpp @@ -66,7 +66,7 @@ struct LeafProxy : SimpleLeafBlueprint { child->setParent(this); } LeafProxy(std::unique_ptr<Blueprint> child_in) - : SimpleLeafBlueprint({}), child(std::move(child_in)) { init(); } + : SimpleLeafBlueprint(), child(std::move(child_in)) { init(); } LeafProxy(const FieldSpec &field, std::unique_ptr<Blueprint> child_in) : SimpleLeafBlueprint(field), child(std::move(child_in)) { init(); } SearchIteratorUP createLeafSearch(const TermFieldMatchDataArray &, bool) const override { abort(); } diff --git a/searchlib/src/tests/queryeval/termwise_eval/termwise_eval_test.cpp b/searchlib/src/tests/queryeval/termwise_eval/termwise_eval_test.cpp index bad7146479c..763701b00a3 100644 --- a/searchlib/src/tests/queryeval/termwise_eval/termwise_eval_test.cpp +++ b/searchlib/src/tests/queryeval/termwise_eval/termwise_eval_test.cpp @@ -66,12 +66,12 @@ struct MyTerm : public SearchIterator { struct MyBlueprint : SimpleLeafBlueprint { std::vector<uint32_t> hits; MyBlueprint(const std::vector<uint32_t> &hits_in) - : SimpleLeafBlueprint(FieldSpecBaseList()), hits(hits_in) + : SimpleLeafBlueprint(), hits(hits_in) { setEstimate(HitEstimate(hits.size(), hits.empty())); } MyBlueprint(const std::vector<uint32_t> &hits_in, bool allow_termwise_eval) - : SimpleLeafBlueprint(FieldSpecBaseList()), hits(hits_in) + : SimpleLeafBlueprint(), hits(hits_in) { setEstimate(HitEstimate(hits.size(), hits.empty())); set_allow_termwise_eval(allow_termwise_eval); diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp index 3ed680897e9..b0cb38f5a32 100644 --- a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp @@ -87,6 +87,21 @@ Blueprint::sat_sum(const std::vector<HitEstimate> &data, uint32_t docid_limit) return { uint32_t(std::min(sum, uint64_t(limit))), empty }; } +Blueprint::State::State() + : _fields(), + _estimate(), + _cost_tier(COST_TIER_NORMAL), + _tree_size(1), + _allow_termwise_eval(true), + _want_global_filter(false) +{} + +Blueprint::State::State(FieldSpecBase field) + : State() +{ + _fields.add(field); +} + Blueprint::State::State(FieldSpecBaseList fields_in) : _fields(std::move(fields_in)), _estimate(), @@ -683,14 +698,6 @@ IntermediateBlueprint::calculateUnpackInfo(const fef::MatchData & md) const //----------------------------------------------------------------------------- -LeafBlueprint::LeafBlueprint(FieldSpecBaseList fields, bool allow_termwise_eval) - : _state(std::move(fields)) -{ - _state.allow_termwise_eval(allow_termwise_eval); -} - -LeafBlueprint::~LeafBlueprint() = default; - void LeafBlueprint::fetchPostings(const ExecuteInfo &) { diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.h b/searchlib/src/vespa/searchlib/queryeval/blueprint.h index 543dcae59d0..3e0b56206bb 100644 --- a/searchlib/src/vespa/searchlib/queryeval/blueprint.h +++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.h @@ -76,11 +76,13 @@ public: static constexpr uint32_t COST_TIER_EXPENSIVE = 2; static constexpr uint32_t COST_TIER_MAX = 999; + State(); + State(FieldSpecBase field); State(FieldSpecBaseList fields_in); State(const State &rhs) = delete; - State(State &&rhs) = default; + State(State &&rhs) noexcept = default; State &operator=(const State &rhs) = delete; - State &operator=(State &&rhs) = default; + State &operator=(State &&rhs) noexcept = default; ~State(); bool isTermLike() const { return !_fields.empty(); } @@ -269,7 +271,7 @@ protected: virtual State calculateState() const = 0; public: - StateCache() : _stale(true), _state(FieldSpecBaseList()) {} + StateCache() : _stale(true), _state() {} const State &getState() const final { if (_stale) { updateState(); @@ -348,7 +350,6 @@ class LeafBlueprint : public Blueprint { private: State _state; - protected: void optimize(Blueprint* &self) final; void setEstimate(HitEstimate est); @@ -357,9 +358,25 @@ protected: void set_want_global_filter(bool value); void set_tree_size(uint32_t value); - LeafBlueprint(FieldSpecBaseList fields, bool allow_termwise_eval); + LeafBlueprint(bool allow_termwise_eval) + : _state() + { + _state.allow_termwise_eval(allow_termwise_eval); + } + + LeafBlueprint(FieldSpecBase field, bool allow_termwise_eval) + : _state(field) + { + _state.allow_termwise_eval(allow_termwise_eval); + } + LeafBlueprint(FieldSpecBaseList fields, bool allow_termwise_eval) + : _state(std::move(fields)) + { + _state.allow_termwise_eval(allow_termwise_eval); + } + public: - ~LeafBlueprint() override; + ~LeafBlueprint() override = default; const State &getState() const final { return _state; } void setDocIdLimit(uint32_t limit) final { Blueprint::setDocIdLimit(limit); } void fetchPostings(const ExecuteInfo &execInfo) override; @@ -372,13 +389,14 @@ public: // for leaf nodes representing a single term struct SimpleLeafBlueprint : LeafBlueprint { - explicit SimpleLeafBlueprint(const FieldSpecBase &field) : LeafBlueprint(FieldSpecBaseList(field), true) {} + explicit SimpleLeafBlueprint() : LeafBlueprint(true) {} + explicit SimpleLeafBlueprint(FieldSpecBase field) : LeafBlueprint(field, true) {} explicit SimpleLeafBlueprint(FieldSpecBaseList fields) : LeafBlueprint(std::move(fields), true) {} }; // for leaf nodes representing more complex structures like wand/phrase struct ComplexLeafBlueprint : LeafBlueprint { - explicit ComplexLeafBlueprint(const FieldSpecBase &field) : LeafBlueprint(FieldSpecBaseList(field), false) {} + explicit ComplexLeafBlueprint(FieldSpecBase field) : LeafBlueprint(field, false) {} explicit ComplexLeafBlueprint(FieldSpecBaseList fields) : LeafBlueprint(std::move(fields), false) {} }; diff --git a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp index dc9ddcccfe4..1af5f7fa3d4 100644 --- a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp @@ -11,8 +11,7 @@ namespace search::queryeval { //----------------------------------------------------------------------------- SearchIterator::UP -EmptyBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArray &, - bool) const +EmptyBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArray &, bool) const { return std::make_unique<EmptySearch>(); } @@ -23,22 +22,11 @@ EmptyBlueprint::createFilterSearch(bool /*strict*/, FilterConstraint /* constrai return std::make_unique<EmptySearch>(); } -EmptyBlueprint::EmptyBlueprint(const FieldSpecBase &field) - : SimpleLeafBlueprint(field) -{ -} - EmptyBlueprint::EmptyBlueprint(FieldSpecBaseList fields) : SimpleLeafBlueprint(std::move(fields)) { } -EmptyBlueprint::EmptyBlueprint() - : SimpleLeafBlueprint(FieldSpecBaseList()) -{ -} - - SearchIterator::UP AlwaysTrueBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArray &, bool) const { @@ -51,7 +39,7 @@ AlwaysTrueBlueprint::createFilterSearch(bool /*strict*/, FilterConstraint /* con return std::make_unique<FullSearch>(); } -AlwaysTrueBlueprint::AlwaysTrueBlueprint() : SimpleLeafBlueprint(FieldSpecBaseList()) +AlwaysTrueBlueprint::AlwaysTrueBlueprint() : SimpleLeafBlueprint() { setEstimate(HitEstimate(search::endDocId, false)); } @@ -61,25 +49,23 @@ AlwaysTrueBlueprint::AlwaysTrueBlueprint() : SimpleLeafBlueprint(FieldSpecBaseLi SearchIterator::UP SimpleBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArray &, bool strict) const { - SimpleSearch *ss = new SimpleSearch(_result, strict); - SearchIterator::UP search(ss); - ss->tag(_tag); + auto search = std::make_unique<SimpleSearch>(_result, strict); + search->tag(_tag); return search; } SearchIterator::UP SimpleBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) const { - SimpleSearch *ss = new SimpleSearch(_result, strict); - SearchIterator::UP search(ss); - ss->tag(_tag + - (strict ? "<strict," : "<nostrict,") + - (constraint == FilterConstraint::UPPER_BOUND ? "upper>" : "lower>")); + auto search = std::make_unique<SimpleSearch>(_result, strict); + search->tag(_tag + + (strict ? "<strict," : "<nostrict,") + + (constraint == FilterConstraint::UPPER_BOUND ? "upper>" : "lower>")); return search; } SimpleBlueprint::SimpleBlueprint(const SimpleResult &result) - : SimpleLeafBlueprint(FieldSpecBaseList()), + : SimpleLeafBlueprint(), _tag(), _result(result) { diff --git a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h index 1fb6f9005dd..57c3e5f3533 100644 --- a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h +++ b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h @@ -17,8 +17,8 @@ protected: SearchIterator::UP createLeafSearch(const search::fef::TermFieldMatchDataArray &tfmda, bool strict) const override; public: EmptyBlueprint(FieldSpecBaseList fields); - EmptyBlueprint(const FieldSpecBase &field); - EmptyBlueprint(); + EmptyBlueprint(FieldSpecBase field) : SimpleLeafBlueprint(field) {} + EmptyBlueprint() = default; SearchIterator::UP createFilterSearch(bool strict, FilterConstraint constraint) const override; }; |