aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-05-12 12:11:13 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-05-12 12:11:13 +0000
commit9f6559f0104c6abb45852b82c0386e5702100c63 (patch)
tree03b446c2512f2126fa6f86be69bf5ef9a860a58c
parent1f84a75a3c5f4b3056d8b263c3bf053db0904709 (diff)
As a single field per blueprint is the common use case, make that optimal more optimal.
-rw-r--r--searchcore/src/tests/proton/matching/match_phase_limiter/match_phase_limiter_test.cpp2
-rw-r--r--searchlib/src/tests/queryeval/filter_search/filter_search_test.cpp2
-rw-r--r--searchlib/src/tests/queryeval/termwise_eval/termwise_eval_test.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.cpp23
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.h34
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp32
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h4
7 files changed, 56 insertions, 45 deletions
diff --git a/searchcore/src/tests/proton/matching/match_phase_limiter/match_phase_limiter_test.cpp b/searchcore/src/tests/proton/matching/match_phase_limiter/match_phase_limiter_test.cpp
index 45ac0a8f924..2cb82fabc4c 100644
--- a/searchcore/src/tests/proton/matching/match_phase_limiter/match_phase_limiter_test.cpp
+++ b/searchcore/src/tests/proton/matching/match_phase_limiter/match_phase_limiter_test.cpp
@@ -71,7 +71,7 @@ struct MockBlueprint : SimpleLeafBlueprint {
bool postings_fetched = false;
search::queryeval::ExecuteInfo postings_strict = search::queryeval::ExecuteInfo::FALSE;
MockBlueprint(const FieldSpec &spec_in, const vespalib::string &term_in)
- : SimpleLeafBlueprint(FieldSpecBaseList().add(spec_in)), spec(spec_in), term(term_in)
+ : SimpleLeafBlueprint(spec_in), spec(spec_in), term(term_in)
{
setEstimate(HitEstimate(756, false));
}
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;
};