summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-11-16 13:54:15 +0100
committerGitHub <noreply@github.com>2023-11-16 13:54:15 +0100
commit9dc1c4fd4e421663d34715ad045355746325745a (patch)
tree134ee1cfccdc97f6e0b57a2f7f059cc5f6b6408f
parentc635dd4bbee09353915e81fbf2dfd82dfec45cef (diff)
parent6c0a9f6c372af76f6dcd07adae98f4051a87f7ad (diff)
Merge pull request #29350 from vespa-engine/balder/handle-executeinfo-in-or
Balder/handle executeinfo in or
-rw-r--r--searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp21
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp11
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h2
3 files changed, 34 insertions, 0 deletions
diff --git a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp
index a663944938c..db68625840c 100644
--- a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp
+++ b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp
@@ -133,6 +133,27 @@ TEST("test And propagates updated histestimate") {
EXPECT_EQUAL(1.0f/(250*25), dynamic_cast<const RememberExecuteInfo &>(bp.getChild(2)).executeInfo.hitRate());
}
+TEST("test Or propagates updated histestimate") {
+ OrBlueprint bp;
+ bp.setSourceId(2);
+ bp.addChild(ap(MyLeafSpec(5000).create<RememberExecuteInfo>()->setSourceId(2)));
+ bp.addChild(ap(MyLeafSpec(2000).create<RememberExecuteInfo>()->setSourceId(2)));
+ bp.addChild(ap(MyLeafSpec(800).create<RememberExecuteInfo>()->setSourceId(2)));
+ bp.addChild(ap(MyLeafSpec(20).create<RememberExecuteInfo>()->setSourceId(2)));
+ bp.optimize_self();
+ bp.setDocIdLimit(5000);
+ bp.fetchPostings(ExecuteInfo::TRUE);
+ EXPECT_EQUAL(4u, bp.childCnt());
+ for (uint32_t i = 0; i < bp.childCnt(); i++) {
+ const auto & child = dynamic_cast<const RememberExecuteInfo &>(bp.getChild(i));
+ EXPECT_TRUE(child.executeInfo.isStrict());
+ }
+ EXPECT_EQUAL(1.0f, dynamic_cast<const RememberExecuteInfo &>(bp.getChild(0)).executeInfo.hitRate());
+ EXPECT_EQUAL(1.0f, dynamic_cast<const RememberExecuteInfo &>(bp.getChild(1)).executeInfo.hitRate());
+ EXPECT_EQUAL(3.0f/5.0f, dynamic_cast<const RememberExecuteInfo &>(bp.getChild(2)).executeInfo.hitRate());
+ EXPECT_EQUAL(3.0f*42.0f/(5.0f*50.0f), dynamic_cast<const RememberExecuteInfo &>(bp.getChild(3)).executeInfo.hitRate());
+}
+
TEST("test And Blueprint") {
AndBlueprint b;
{ // combine
diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
index 6e0bc695fe3..95c1c05c8d0 100644
--- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
@@ -263,6 +263,17 @@ AndBlueprint::computeNextHitRate(const Blueprint & child, double hitRate) const
return hitRate * child.hit_ratio();
}
+double
+OrBlueprint::computeNextHitRate(const Blueprint & child, double hitRate) const {
+ // Avoid dropping hitRate to zero when meeting a conservatively high hitrate in a child.
+ // Happens at least when using non fast-search attributes, and with AND nodes.
+ constexpr double MIN_INVERSE_HIT_RATIO = 0.10;
+ double inverse_child_hit_ratio = 1.0 - child.hit_ratio();
+ return (inverse_child_hit_ratio > MIN_INVERSE_HIT_RATIO)
+ ? hitRate * inverse_child_hit_ratio
+ : hitRate;
+}
+
//-----------------------------------------------------------------------------
OrBlueprint::~OrBlueprint() = default;
diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h
index b8ca46f7549..02803877c19 100644
--- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h
+++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h
@@ -74,6 +74,8 @@ public:
bool strict, fef::MatchData &md) const override;
SearchIterator::UP
createFilterSearch(bool strict, FilterConstraint constraint) const override;
+private:
+ double computeNextHitRate(const Blueprint & child, double hitRate) const override;
};
//-----------------------------------------------------------------------------