aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@yahooinc.com>2024-02-06 14:51:08 +0000
committerHåvard Pettersen <havardpe@yahooinc.com>2024-02-06 14:51:08 +0000
commita6948ade3670315acfeeae6f92c8c8c75e19dbe5 (patch)
tree1e994e43583c277f06f0680ec6fc5d7c4f710fe3
parentd7a8e66652a1b338760c52eabfce42e541be7a28 (diff)
make default flow stats more explicit
for both simple and complex leafs account for number of inner children in complex leafs account for seek nesting for complex leafs with children
-rw-r--r--searchcore/src/tests/proton/matching/match_phase_limiter/match_phase_limiter_test.cpp3
-rw-r--r--searchcore/src/vespa/searchcore/proton/documentmetastore/lid_allocator.cpp3
-rw-r--r--searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp3
-rw-r--r--searchlib/src/tests/queryeval/filter_search/filter_search_test.cpp1
-rw-r--r--searchlib/src/tests/queryeval/queryeval_test.cpp6
-rw-r--r--searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp3
-rw-r--r--searchlib/src/tests/queryeval/termwise_eval/termwise_eval_test.cpp3
-rw-r--r--searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp3
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp12
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attribute_weighted_set_blueprint.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attribute_weighted_set_blueprint.h1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/direct_multi_term_blueprint.h4
-rw-r--r--searchlib/src/vespa/searchlib/diskindex/disktermblueprint.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/diskindex/disktermblueprint.h2
-rw-r--r--searchlib/src/vespa/searchlib/memoryindex/field_index.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.cpp23
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.h3
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/dot_product_blueprint.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/dot_product_blueprint.h2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.h2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp18
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h7
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.h4
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/predicate_blueprint.h5
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.h2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.h2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.h2
33 files changed, 158 insertions, 10 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 824ee891873..5e10d12e16f 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
@@ -75,6 +75,9 @@ struct MockBlueprint : SimpleLeafBlueprint {
{
setEstimate(HitEstimate(756, false));
}
+ search::queryeval::FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ return default_flow_stats(docid_limit, 756, 0);
+ }
SearchIterator::UP createLeafSearch(const TermFieldMatchDataArray &tfmda, bool strict) const override
{
if (postings_fetched) {
diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_allocator.cpp b/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_allocator.cpp
index c434203898e..3f533fea28d 100644
--- a/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_allocator.cpp
+++ b/searchcore/src/vespa/searchcore/proton/documentmetastore/lid_allocator.cpp
@@ -205,6 +205,9 @@ private:
}
return search::BitVectorIterator::create(&_activeLids, get_docid_limit(), *tfmd, strict);
}
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ return default_flow_stats(docid_limit, _activeLids.size(), 0);
+ }
SearchIterator::UP
createLeafSearch(const TermFieldMatchDataArray &tfmda, bool strict) const override
{
diff --git a/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp b/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp
index 51164427690..d739151a2c4 100644
--- a/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp
+++ b/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp
@@ -145,6 +145,9 @@ struct MyTerm : SimpleLeafBlueprint {
MyTerm(FieldSpecBase field, uint32_t hitEstimate) : SimpleLeafBlueprint(field) {
setEstimate(HitEstimate(hitEstimate, false));
}
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ return default_flow_stats(docid_limit, getState().estimate().estHits, 0);
+ }
SearchIterator::UP createLeafSearch(const search::fef::TermFieldMatchDataArray &, bool) const override {
return {};
}
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 ca450c6d712..3e8bc06bfd8 100644
--- a/searchlib/src/tests/queryeval/filter_search/filter_search_test.cpp
+++ b/searchlib/src/tests/queryeval/filter_search/filter_search_test.cpp
@@ -71,6 +71,7 @@ struct LeafProxy : SimpleLeafBlueprint {
: SimpleLeafBlueprint(), child(std::move(child_in)) { init(); }
LeafProxy(FieldSpecBase field, std::unique_ptr<Blueprint> child_in)
: SimpleLeafBlueprint(field), child(std::move(child_in)) { init(); }
+ FlowStats calculate_flow_stats(uint32_t) const override { abort(); }
SearchIteratorUP createLeafSearch(const TermFieldMatchDataArray &, bool) const override { abort(); }
SearchIteratorUP createFilterSearch(bool strict, Constraint constraint) const override {
return child->createFilterSearch(strict, constraint);
diff --git a/searchlib/src/tests/queryeval/queryeval_test.cpp b/searchlib/src/tests/queryeval/queryeval_test.cpp
index c3a9a0d326e..e8f30ba84ff 100644
--- a/searchlib/src/tests/queryeval/queryeval_test.cpp
+++ b/searchlib/src/tests/queryeval/queryeval_test.cpp
@@ -358,6 +358,12 @@ public:
_sc = _a.getSearch(std::make_unique<search::QueryTermSimple>("1", search::QueryTermSimple::Type::WORD),
SearchContextParams().useBitVector(true));
}
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ auto est = _sc->calc_hit_estimate();
+ return est.is_unknown()
+ ? default_flow_stats(0)
+ : default_flow_stats(docid_limit, est.est_hits(), 0);
+ }
SearchIterator::UP
createLeafSearch(const TermFieldMatchDataArray &tfmda, bool strict) const override
{
diff --git a/searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp b/searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp
index cbe497d6363..99812900d40 100644
--- a/searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp
+++ b/searchlib/src/tests/queryeval/simple_phrase/simple_phrase_test.cpp
@@ -35,6 +35,9 @@ struct MyTerm : public search::queryeval::SimpleLeafBlueprint {
{
setEstimate(HitEstimate(hits, (hits == 0)));
}
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ return default_flow_stats(docid_limit, getState().estimate().estHits, 0);
+ }
SearchIterator::UP createLeafSearch(const search::fef::TermFieldMatchDataArray &, bool) const override {
return {};
}
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 3a10ed6df53..2a3ce66dba6 100644
--- a/searchlib/src/tests/queryeval/termwise_eval/termwise_eval_test.cpp
+++ b/searchlib/src/tests/queryeval/termwise_eval/termwise_eval_test.cpp
@@ -83,6 +83,9 @@ struct MyBlueprint : SimpleLeafBlueprint {
set_allow_termwise_eval(allow_termwise_eval);
}
~MyBlueprint() override;
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ return default_flow_stats(docid_limit, getState().estimate().estHits, 0);
+ }
SearchIterator::UP createLeafSearch(const fef::TermFieldMatchDataArray &,
bool strict) const override
{
diff --git a/searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp b/searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp
index 24d62f66714..54663e48060 100644
--- a/searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp
+++ b/searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp
@@ -344,6 +344,9 @@ struct VerifyMatchData {
++vmd.child_cnt;
return std::make_unique<EmptySearch>();
}
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ return default_flow_stats(docid_limit, 0, 0);
+ }
[[nodiscard]] SearchIteratorUP createFilterSearch(bool strict, FilterConstraint constraint) const override {
return create_default_filter(strict, constraint);
}
diff --git a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp
index 09da4697583..f358ee56dd4 100644
--- a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp
@@ -265,6 +265,10 @@ public:
bool should_use() const { return _should_use; }
+ queryeval::FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ return default_flow_stats(docid_limit, getState().estimate().estHits, _rangeSearches.size());
+ }
+
SearchIterator::UP
createLeafSearch(const TermFieldMatchDataArray &tfmda, bool strict) const override
{
@@ -324,6 +328,10 @@ public:
const common::Location &location() const { return _location; }
+ queryeval::FlowStats calculate_flow_stats(uint32_t) const override {
+ return default_flow_stats(0);
+ }
+
SearchIterator::UP
createLeafSearch(const TermFieldMatchDataArray &tfmda, bool strict) const override
{
@@ -449,6 +457,10 @@ public:
setEstimate(estimate);
}
+ queryeval::FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ return default_flow_stats(docid_limit, getState().estimate().estHits, _terms.size());
+ }
+
SearchIterator::UP createLeafSearch(const TermFieldMatchDataArray &tfmda, bool strict) const override {
assert(tfmda.size() == 1);
if (_terms.empty()) {
diff --git a/searchlib/src/vespa/searchlib/attribute/attribute_weighted_set_blueprint.cpp b/searchlib/src/vespa/searchlib/attribute/attribute_weighted_set_blueprint.cpp
index a5003ba542b..ede2ecd0ad5 100644
--- a/searchlib/src/vespa/searchlib/attribute/attribute_weighted_set_blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/attribute_weighted_set_blueprint.cpp
@@ -116,6 +116,12 @@ AttributeWeightedSetBlueprint::addToken(std::unique_ptr<ISearchContext> context,
_contexts.push_back(context.release());
}
+queryeval::FlowStats
+AttributeWeightedSetBlueprint::calculate_flow_stats(uint32_t docid_limit) const
+{
+ return default_flow_stats(docid_limit, _estHits, _weights.size());
+}
+
queryeval::SearchIterator::UP
AttributeWeightedSetBlueprint::createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool strict) const
{
diff --git a/searchlib/src/vespa/searchlib/attribute/attribute_weighted_set_blueprint.h b/searchlib/src/vespa/searchlib/attribute/attribute_weighted_set_blueprint.h
index d24bfa64111..16319654024 100644
--- a/searchlib/src/vespa/searchlib/attribute/attribute_weighted_set_blueprint.h
+++ b/searchlib/src/vespa/searchlib/attribute/attribute_weighted_set_blueprint.h
@@ -28,6 +28,7 @@ public:
AttributeWeightedSetBlueprint(const queryeval::FieldSpec &field, const IAttributeVector & attr);
~AttributeWeightedSetBlueprint();
void addToken(std::unique_ptr<ISearchContext> context, int32_t weight);
+ queryeval::FlowStats calculate_flow_stats(uint32_t docid_limit) const override;
queryeval::SearchIterator::UP createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool strict) const override;
queryeval::SearchIterator::UP createFilterSearch(bool strict, FilterConstraint constraint) const override;
void fetchPostings(const queryeval::ExecuteInfo &execInfo) override;
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 485427391ad..e0b206dbdd9 100644
--- a/searchlib/src/vespa/searchlib/attribute/direct_multi_term_blueprint.h
+++ b/searchlib/src/vespa/searchlib/attribute/direct_multi_term_blueprint.h
@@ -71,6 +71,10 @@ public:
setEstimate(estimate);
}
+ queryeval::FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ return default_flow_stats(docid_limit, getState().estimate().estHits, _terms.size());
+ }
+
std::unique_ptr<queryeval::SearchIterator> createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool) const override;
std::unique_ptr<queryeval::SearchIterator> createFilterSearch(bool strict, FilterConstraint constraint) const override;
diff --git a/searchlib/src/vespa/searchlib/diskindex/disktermblueprint.cpp b/searchlib/src/vespa/searchlib/diskindex/disktermblueprint.cpp
index 08a690ce9fe..97c8dd391ba 100644
--- a/searchlib/src/vespa/searchlib/diskindex/disktermblueprint.cpp
+++ b/searchlib/src/vespa/searchlib/diskindex/disktermblueprint.cpp
@@ -65,6 +65,12 @@ DiskTermBlueprint::fetchPostings(const queryeval::ExecuteInfo &execInfo)
_fetchPostingsDone = true;
}
+queryeval::FlowStats
+DiskTermBlueprint::calculate_flow_stats(uint32_t docid_limit) const
+{
+ return default_flow_stats(docid_limit, _lookupRes->counts._numDocs, 0);
+}
+
SearchIterator::UP
DiskTermBlueprint::createLeafSearch(const TermFieldMatchDataArray & tfmda, bool strict) const
{
diff --git a/searchlib/src/vespa/searchlib/diskindex/disktermblueprint.h b/searchlib/src/vespa/searchlib/diskindex/disktermblueprint.h
index 1f04a4a804b..a8754663aab 100644
--- a/searchlib/src/vespa/searchlib/diskindex/disktermblueprint.h
+++ b/searchlib/src/vespa/searchlib/diskindex/disktermblueprint.h
@@ -37,6 +37,8 @@ public:
DiskIndex::LookupResult::UP lookupRes,
bool useBitVector);
+ queryeval::FlowStats calculate_flow_stats(uint32_t docid_limit) const override;
+
// Inherit doc from Blueprint.
// For now, this DiskTermBlueprint instance must have longer lifetime than the created iterator.
std::unique_ptr<queryeval::SearchIterator> createLeafSearch(const fef::TermFieldMatchDataArray & tfmda, bool strict) const override;
diff --git a/searchlib/src/vespa/searchlib/memoryindex/field_index.cpp b/searchlib/src/vespa/searchlib/memoryindex/field_index.cpp
index 18b5d749aeb..24582d7e692 100644
--- a/searchlib/src/vespa/searchlib/memoryindex/field_index.cpp
+++ b/searchlib/src/vespa/searchlib/memoryindex/field_index.cpp
@@ -256,6 +256,10 @@ public:
setEstimate(estimate);
}
+ queryeval::FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ return default_flow_stats(docid_limit, _posting_itr.size(), 0);
+ }
+
SearchIterator::UP createLeafSearch(const TermFieldMatchDataArray& tfmda, bool) const override {
auto result = make_search_iterator<interleaved_features>(_posting_itr, _feature_store, _field_id, tfmda);
if (_use_bit_vector) {
diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp
index b05e5cbef3d..2f69c45d418 100644
--- a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp
@@ -161,6 +161,20 @@ Blueprint::root() const
return *bp;
}
+FlowStats
+Blueprint::default_flow_stats(uint32_t docid_limit, uint32_t abs_est, size_t child_cnt)
+{
+ double rel_est = abs_to_rel_est(abs_est, docid_limit);
+ double seek_cost = (child_cnt == 0) ? rel_est : (rel_est * 2.0);
+ return {rel_est, 1.0 + child_cnt, seek_cost};
+}
+
+FlowStats
+Blueprint::default_flow_stats(size_t child_cnt)
+{
+ return {0.5, 1.0 + child_cnt, 1.0 + child_cnt};
+}
+
std::unique_ptr<MatchingElementsSearch>
Blueprint::create_matching_elements_search(const MatchingElementsFields &fields) const
{
@@ -714,13 +728,6 @@ IntermediateBlueprint::calculateUnpackInfo(const fef::MatchData & md) const
//-----------------------------------------------------------------------------
-FlowStats
-LeafBlueprint::calculate_flow_stats(uint32_t docid_limit) const
-{
- double rel_est = abs_to_rel_est(_state.estimate().estHits, docid_limit);
- return {rel_est, 1.0, rel_est};
-}
-
void
LeafBlueprint::fetchPostings(const ExecuteInfo &)
{
@@ -791,8 +798,6 @@ LeafBlueprint::set_tree_size(uint32_t value)
}
-//-----------------------------------------------------------------------------
-
void visit(vespalib::ObjectVisitor &self, const vespalib::string &name,
const search::queryeval::Blueprint *obj)
{
diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.h b/searchlib/src/vespa/searchlib/queryeval/blueprint.h
index 20606c713a5..510351a4843 100644
--- a/searchlib/src/vespa/searchlib/queryeval/blueprint.h
+++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.h
@@ -278,6 +278,8 @@ public:
void update_flow_stats(uint32_t docid_limit) {
_flow_stats = calculate_flow_stats(docid_limit);
}
+ static FlowStats default_flow_stats(uint32_t docid_limit, uint32_t abs_est, size_t child_cnt);
+ static FlowStats default_flow_stats(size_t child_cnt);
virtual void fetchPostings(const ExecuteInfo &execInfo) = 0;
virtual void freeze() = 0;
@@ -453,7 +455,6 @@ protected:
public:
~LeafBlueprint() override = default;
const State &getState() const final { return _state; }
- FlowStats calculate_flow_stats(uint32_t docid_limit) const override;
void fetchPostings(const ExecuteInfo &execInfo) override;
void freeze() final;
SearchIteratorUP createSearch(fef::MatchData &md, bool strict) const override;
diff --git a/searchlib/src/vespa/searchlib/queryeval/dot_product_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/dot_product_blueprint.cpp
index 51f73158090..3b8975f9883 100644
--- a/searchlib/src/vespa/searchlib/queryeval/dot_product_blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/dot_product_blueprint.cpp
@@ -38,6 +38,12 @@ DotProductBlueprint::addTerm(Blueprint::UP term, int32_t weight, HitEstimate & e
_terms.push_back(std::move(term));
}
+FlowStats
+DotProductBlueprint::calculate_flow_stats(uint32_t docid_limit) const
+{
+ return default_flow_stats(docid_limit, getState().estimate().estHits, _terms.size());
+}
+
SearchIterator::UP
DotProductBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArray &tfmda, bool) const
{
diff --git a/searchlib/src/vespa/searchlib/queryeval/dot_product_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/dot_product_blueprint.h
index e49e163d24d..ca59f84fce8 100644
--- a/searchlib/src/vespa/searchlib/queryeval/dot_product_blueprint.h
+++ b/searchlib/src/vespa/searchlib/queryeval/dot_product_blueprint.h
@@ -33,6 +33,8 @@ public:
setEstimate(estimate);
}
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override;
+
SearchIteratorUP createLeafSearch(const search::fef::TermFieldMatchDataArray &tfmda, bool strict) const override;
SearchIteratorUP createFilterSearch(bool strict, FilterConstraint constraint) const override;
diff --git a/searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.cpp
index ef03a140a35..84745fdd0bd 100644
--- a/searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.cpp
@@ -52,6 +52,12 @@ EquivBlueprint::EquivBlueprint(FieldSpecBaseList fields,
EquivBlueprint::~EquivBlueprint() = default;
+FlowStats
+EquivBlueprint::calculate_flow_stats(uint32_t docid_limit) const
+{
+ return default_flow_stats(docid_limit, _estimate.estHits, _terms.size());
+}
+
SearchIterator::UP
EquivBlueprint::createLeafSearch(const fef::TermFieldMatchDataArray &outputs, bool strict) const
{
diff --git a/searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.h
index df1ea13105a..27e990b3320 100644
--- a/searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.h
+++ b/searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.h
@@ -22,6 +22,8 @@ public:
// used by create visitor
EquivBlueprint& addTerm(Blueprint::UP term, double exactness);
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override;
+
SearchIteratorUP createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool strict) const override;
SearchIteratorUP createFilterSearch(bool strict, FilterConstraint constraint) const override;
diff --git a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp
index 6c619ee085b..b12c2eea404 100644
--- a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.cpp
@@ -10,6 +10,12 @@ namespace search::queryeval {
//-----------------------------------------------------------------------------
+FlowStats
+EmptyBlueprint::calculate_flow_stats(uint32_t docid_limit) const
+{
+ return default_flow_stats(docid_limit, 0, 0);
+}
+
SearchIterator::UP
EmptyBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArray &, bool) const
{
@@ -27,6 +33,12 @@ EmptyBlueprint::EmptyBlueprint(FieldSpecBaseList fields)
{
}
+FlowStats
+AlwaysTrueBlueprint::calculate_flow_stats(uint32_t docid_limit) const
+{
+ return default_flow_stats(docid_limit, docid_limit, 0);
+}
+
SearchIterator::UP
AlwaysTrueBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArray &, bool) const
{
@@ -46,6 +58,12 @@ AlwaysTrueBlueprint::AlwaysTrueBlueprint() : SimpleLeafBlueprint()
//-----------------------------------------------------------------------------
+FlowStats
+SimpleBlueprint::calculate_flow_stats(uint32_t docid_limit) const
+{
+ return default_flow_stats(docid_limit, _result.getHitCount(), 0);
+}
+
SearchIterator::UP
SimpleBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArray &, bool strict) const
{
diff --git a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h
index a1c23649dd6..d967933fbee 100644
--- a/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h
+++ b/searchlib/src/vespa/searchlib/queryeval/leaf_blueprints.h
@@ -19,6 +19,7 @@ public:
EmptyBlueprint(FieldSpecBaseList fields);
EmptyBlueprint(FieldSpecBase field) : SimpleLeafBlueprint(field) {}
EmptyBlueprint() = default;
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override;
SearchIterator::UP createFilterSearch(bool strict, FilterConstraint constraint) const override;
EmptyBlueprint *as_empty() noexcept final override { return this; }
};
@@ -29,6 +30,7 @@ protected:
SearchIterator::UP createLeafSearch(const search::fef::TermFieldMatchDataArray &tfmda, bool strict) const override;
public:
AlwaysTrueBlueprint();
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override;
SearchIterator::UP createFilterSearch(bool strict, FilterConstraint constraint) const override;
};
@@ -48,6 +50,7 @@ public:
~SimpleBlueprint() override;
SimpleBlueprint &tag(const vespalib::string &tag);
const vespalib::string &tag() const { return _tag; }
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override;
SearchIterator::UP createFilterSearch(bool strict, FilterConstraint constraint) const override;
};
@@ -88,6 +91,10 @@ public:
return _ctx.get();
}
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ return default_flow_stats(docid_limit, _result.inspect().size(), 0);
+ }
+
SearchIteratorUP createFilterSearch(bool strict, FilterConstraint constraint) const override {
return create_default_filter(strict, constraint);
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.h
index 1163f6a8805..73608b8172b 100644
--- a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.h
+++ b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_blueprint.h
@@ -69,6 +69,10 @@ public:
Algorithm get_algorithm() const { return _algorithm; }
double get_distance_threshold() const { return _distance_threshold; }
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override {
+ return default_flow_stats(docid_limit, getState().estimate().estHits, 0);
+ }
+
std::unique_ptr<SearchIterator> createLeafSearch(const search::fef::TermFieldMatchDataArray& tfmda,
bool strict) const override;
SearchIteratorUP createFilterSearch(bool strict, FilterConstraint constraint) const override {
diff --git a/searchlib/src/vespa/searchlib/queryeval/predicate_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/predicate_blueprint.h
index ed4b088f576..d9c432b38bd 100644
--- a/searchlib/src/vespa/searchlib/queryeval/predicate_blueprint.h
+++ b/searchlib/src/vespa/searchlib/queryeval/predicate_blueprint.h
@@ -49,6 +49,11 @@ public:
~PredicateBlueprint();
void fetchPostings(const ExecuteInfo &execInfo) override;
+ FlowStats calculate_flow_stats(uint32_t) const override {
+ return default_flow_stats(_interval_btree_iterators.size() + _interval_vector_iterators.size() +
+ _bounds_btree_iterators.size() + _bounds_vector_iterators.size() + 2);
+ }
+
SearchIterator::UP
createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool strict) const override;
SearchIteratorUP createFilterSearch(bool strict, FilterConstraint constraint) const override {
diff --git a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp
index 96181377282..3d4f917aeac 100644
--- a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp
@@ -44,6 +44,12 @@ SameElementBlueprint::addTerm(Blueprint::UP term)
_terms.push_back(std::move(term));
}
+FlowStats
+SameElementBlueprint::calculate_flow_stats(uint32_t docid_limit) const
+{
+ return default_flow_stats(docid_limit, _estimate.estHits, _terms.size());
+}
+
void
SameElementBlueprint::optimize_self(OptimizePass pass)
{
diff --git a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h
index 6a988e67149..279a5f7d654 100644
--- a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h
+++ b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h
@@ -34,6 +34,8 @@ public:
// used by create visitor
void addTerm(Blueprint::UP term);
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override;
+
void optimize_self(OptimizePass pass) override;
void fetchPostings(const ExecuteInfo &execInfo) override;
diff --git a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp
index 3cb69f00240..ace7d12c32b 100644
--- a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp
@@ -45,6 +45,12 @@ SimplePhraseBlueprint::addTerm(Blueprint::UP term)
_terms.push_back(std::move(term));
}
+FlowStats
+SimplePhraseBlueprint::calculate_flow_stats(uint32_t docid_limit) const
+{
+ return default_flow_stats(docid_limit, _estimate.estHits, _terms.size());
+}
+
SearchIterator::UP
SimplePhraseBlueprint::createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool strict) const
{
diff --git a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.h
index 64c1cc7d6f4..da7ec9c9b36 100644
--- a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.h
+++ b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.h
@@ -30,6 +30,8 @@ public:
// used by create visitor
void addTerm(Blueprint::UP term);
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override;
+
SearchIteratorUP createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool strict) const override;
SearchIteratorUP createFilterSearch(bool strict, FilterConstraint constraint) const override;
void visitMembers(vespalib::ObjectVisitor &visitor) const override;
diff --git a/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.cpp
index e85e81e21e5..4e400b3c055 100644
--- a/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.cpp
@@ -65,6 +65,12 @@ ParallelWeakAndBlueprint::addTerm(Blueprint::UP term, int32_t weight, HitEstimat
_terms.push_back(std::move(term));
}
+FlowStats
+ParallelWeakAndBlueprint::calculate_flow_stats(uint32_t docid_limit) const
+{
+ return default_flow_stats(docid_limit, getState().estimate().estHits, _terms.size());
+}
+
SearchIterator::UP
ParallelWeakAndBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArray &tfmda, bool strict) const
{
diff --git a/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.h
index f023d203100..ade64577c80 100644
--- a/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.h
+++ b/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.h
@@ -62,6 +62,8 @@ public:
set_tree_size(_terms.size() + 1);
}
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override;
+
SearchIterator::UP createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool strict) const override;
std::unique_ptr<SearchIterator> createFilterSearch(bool strict, FilterConstraint constraint) const override;
void visitMembers(vespalib::ObjectVisitor &visitor) const override;
diff --git a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp
index e2e9516badf..b3bbec8428f 100644
--- a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp
@@ -92,6 +92,12 @@ WeightedSetTermBlueprint::addTerm(Blueprint::UP term, int32_t weight, HitEstimat
_terms.push_back(std::move(term));
}
+FlowStats
+WeightedSetTermBlueprint::calculate_flow_stats(uint32_t docid_limit) const
+{
+ return default_flow_stats(docid_limit, getState().estimate().estHits, _terms.size());
+}
+
SearchIterator::UP
WeightedSetTermBlueprint::createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool) const
{
diff --git a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.h
index 83203ea6533..240b2a47eb3 100644
--- a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.h
+++ b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.h
@@ -35,6 +35,8 @@ public:
setEstimate(estimate);
}
+ FlowStats calculate_flow_stats(uint32_t docid_limit) const override;
+
SearchIteratorUP createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool strict) const override;
SearchIteratorUP createFilterSearch(bool strict, FilterConstraint constraint) const override;
std::unique_ptr<MatchingElementsSearch> create_matching_elements_search(const MatchingElementsFields &fields) const override;