aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-12-29 08:51:51 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-01-01 17:12:45 +0000
commitce77fff993f6bab999bcf70cdcc255dbeb161d19 (patch)
tree138c11d1c2bdfe793e0cb086ef9e0f745161a93d /searchlib
parent1ba19f37f37d22262b32da29372e94f87f3a97f5 (diff)
Implement AndBlueprint.fetchPostings
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.cpp13
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.h1
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/executeinfo.h6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp5
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h5
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;