diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-12-29 08:51:51 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-01-01 17:12:45 +0000 |
commit | ce77fff993f6bab999bcf70cdcc255dbeb161d19 (patch) | |
tree | 138c11d1c2bdfe793e0cb086ef9e0f745161a93d | |
parent | 1ba19f37f37d22262b32da29372e94f87f3a97f5 (diff) |
Implement AndBlueprint.fetchPostings
6 files changed, 29 insertions, 7 deletions
diff --git a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp index ac0e88386e0..4aab1de06b3 100644 --- a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp +++ b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp @@ -91,18 +91,20 @@ TEST("test AndNot Blueprint") { TEST("test And propagates updated histestimate") { AndBlueprint *bp = new AndBlueprint(); bp->setSourceId(2); - bp->setDocIdLimit(4000); bp->addChild(ap(MyLeafSpec(20).create<RememberExecuteInfo>()->setSourceId(2))); bp->addChild(ap(MyLeafSpec(200).create<RememberExecuteInfo>()->setSourceId(2))); bp->addChild(ap(MyLeafSpec(2000).create<RememberExecuteInfo>()->setSourceId(2))); bp->optimize_self(); + bp->setDocIdLimit(5000); bp->fetchPostings(ExecuteInfo::create(true)); EXPECT_EQUAL(3u, bp->childCnt()); for (uint32_t i = 0; i < bp->childCnt(); i++) { const RememberExecuteInfo & child = dynamic_cast<const RememberExecuteInfo &>(bp->getChild(i)); EXPECT_EQUAL((i == 0), child.executeInfo.isStrict()); - EXPECT_EQUAL(1.0, child.executeInfo.hitRate()); } + EXPECT_EQUAL(1.0, dynamic_cast<const RememberExecuteInfo &>(bp->getChild(0)).executeInfo.hitRate()); + EXPECT_EQUAL(1.0/250, dynamic_cast<const RememberExecuteInfo &>(bp->getChild(1)).executeInfo.hitRate()); + EXPECT_EQUAL(1.0/(250*25), dynamic_cast<const RememberExecuteInfo &>(bp->getChild(2)).executeInfo.hitRate()); } TEST("test And Blueprint") { diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp index b6ecd8d1c7d..49b5ab082bd 100644 --- a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp @@ -317,6 +317,13 @@ IntermediateBlueprint::calculateState() const return state; } +ExecuteInfo +IntermediateBlueprint::computeNext(const Blueprint & child, const ExecuteInfo & execInfo) const +{ + (void) child; + return execInfo; +} + bool IntermediateBlueprint::should_do_termwise_eval(const UnpackInfo &unpack, double match_limit) const { @@ -414,9 +421,11 @@ IntermediateBlueprint::visitMembers(vespalib::ObjectVisitor &visitor) const void IntermediateBlueprint::fetchPostings(const ExecuteInfo &execInfo) { + ExecuteInfo childInfo = ExecuteInfo(execInfo.isStrict() && inheritStrict(0), execInfo.hitRate()); for (size_t i = 0; i < _children.size(); ++i) { - ExecuteInfo childInfo = ExecuteInfo(execInfo.isStrict() && inheritStrict(i), execInfo.hitRate()); - _children[i]->fetchPostings(childInfo); + Blueprint & child = *_children[i]; + child.fetchPostings(childInfo); + childInfo = computeNext(child, ExecuteInfo(execInfo.isStrict() && inheritStrict(i+1), childInfo.hitRate())); } } diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.h b/searchlib/src/vespa/searchlib/queryeval/blueprint.h index f982cc7b044..6b1a9f7af65 100644 --- a/searchlib/src/vespa/searchlib/queryeval/blueprint.h +++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.h @@ -246,6 +246,7 @@ private: bool infer_allow_termwise_eval() const; size_t count_termwise_nodes(const UnpackInfo &unpack) const; + virtual ExecuteInfo computeNext(const Blueprint & child, const ExecuteInfo & execInfo) const; protected: // returns an empty collection if children have empty or diff --git a/searchlib/src/vespa/searchlib/queryeval/executeinfo.h b/searchlib/src/vespa/searchlib/queryeval/executeinfo.h index 3cd82327429..97e3d81a805 100644 --- a/searchlib/src/vespa/searchlib/queryeval/executeinfo.h +++ b/searchlib/src/vespa/searchlib/queryeval/executeinfo.h @@ -11,17 +11,17 @@ namespace search::queryeval { class ExecuteInfo { public: ExecuteInfo() : ExecuteInfo(false, 1.0) { } - ExecuteInfo(bool strict, float hitRate_in) + ExecuteInfo(bool strict, double hitRate_in) : _hitRate(hitRate_in), _strict(strict) { } bool isStrict() const { return _strict; } - float hitRate() const { return _hitRate; } + double hitRate() const { return _hitRate; } static const ExecuteInfo TRUE; static const ExecuteInfo FALSE; static ExecuteInfo create(bool strict); private: - float _hitRate; + double _hitRate; bool _strict; }; diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp index 1e618d5edf4..fa0bcbd2759 100644 --- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp @@ -243,6 +243,11 @@ AndBlueprint::createIntermediateSearch(const MultiSearch::Children &subSearches, return SearchIterator::UP(search); } +ExecuteInfo +AndBlueprint::computeNext(const Blueprint & child, const ExecuteInfo &execInfo) const { + return ExecuteInfo(execInfo.isStrict(), (execInfo.hitRate()*child.getState().estimate().estHits)/get_docid_limit()); +} + //----------------------------------------------------------------------------- Blueprint::HitEstimate diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h index 1034edb2f1e..d20d64db9f7 100644 --- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h +++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h @@ -37,6 +37,11 @@ public: HitEstimate combine(const std::vector<HitEstimate> &data) const override; FieldSpecBaseList exposeFields() const override; void optimize_self() override; + +private: + ExecuteInfo computeNext(const Blueprint & child, const ExecuteInfo &execInfo) const override; + +public: Blueprint::UP get_replacement() override; void sort(std::vector<Blueprint*> &children) const override; bool inheritStrict(size_t i) const override; |