summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp56
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h6
2 files changed, 62 insertions, 0 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
index 430bc3956e7..91000189a8d 100644
--- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
@@ -168,6 +168,33 @@ AndNotBlueprint::createIntermediateSearch(const MultiSearch::Children &subSearch
return SearchIterator::UP(AndNotSearch::create(subSearches, strict));
}
+namespace {
+Blueprint::FilterConstraint invert(Blueprint::FilterConstraint constraint) {
+ if (constraint == Blueprint::FilterConstraint::UPPER_BOUND) {
+ return Blueprint::FilterConstraint::LOWER_BOUND;
+ }
+ if (constraint == Blueprint::FilterConstraint::LOWER_BOUND) {
+ return Blueprint::FilterConstraint::UPPER_BOUND;
+ }
+ abort();
+}
+} // namespace <unnamed>
+
+SearchIterator::UP
+AndNotBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) const
+{
+ MultiSearch::Children subSearches;
+ subSearches.reserve(childCnt());
+ for (size_t i = 0; i < childCnt(); ++i) {
+ bool child_strict = strict && inheritStrict(i);
+ auto search = (i == 0)
+ ? getChild(i).createFilterSearch(child_strict, constraint)
+ : getChild(i).createFilterSearch(child_strict, invert(constraint));
+ subSearches.push_back(search.release());
+ }
+ return SearchIterator::UP(AndNotSearch::create(subSearches, strict));
+}
+
//-----------------------------------------------------------------------------
Blueprint::HitEstimate
@@ -243,6 +270,22 @@ AndBlueprint::createIntermediateSearch(const MultiSearch::Children &subSearches,
return SearchIterator::UP(search);
}
+SearchIterator::UP
+AndBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) const
+{
+ MultiSearch::Children subSearches;
+ subSearches.reserve(childCnt());
+ for (size_t i = 0; i < childCnt(); ++i) {
+ bool child_strict = strict && inheritStrict(i);
+ auto search = getChild(i).createFilterSearch(child_strict, constraint);
+ subSearches.push_back(search.release());
+ }
+ UnpackInfo unpackInfo;
+ AndSearch * search = AndSearch::create(subSearches, strict, unpackInfo);
+ search->estimate(getState().estimate().estHits);
+ return SearchIterator::UP(search);
+}
+
double
AndBlueprint::computeNextHitRate(const Blueprint & child, double hitRate) const {
return hitRate * child.hit_ratio();
@@ -320,6 +363,19 @@ OrBlueprint::createIntermediateSearch(const MultiSearch::Children &subSearches,
return SearchIterator::UP(OrSearch::create(subSearches, strict, unpackInfo));
}
+SearchIterator::UP
+OrBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) const
+{
+ MultiSearch::Children subSearches;
+ subSearches.reserve(childCnt());
+ for (size_t i = 0; i < childCnt(); ++i) {
+ auto search = getChild(i).createFilterSearch(strict, constraint);
+ subSearches.push_back(search.release());
+ }
+ UnpackInfo unpackInfo;
+ return SearchIterator::UP(OrSearch::create(subSearches, strict, unpackInfo));
+}
+
//-----------------------------------------------------------------------------
WeakAndBlueprint::~WeakAndBlueprint() = default;
diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h
index 3a6b5e1a31a..ecad9431a81 100644
--- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h
+++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h
@@ -24,6 +24,8 @@ public:
SearchIterator::UP
createIntermediateSearch(const MultiSearch::Children &subSearches,
bool strict, fef::MatchData &md) const override;
+ SearchIterator::UP
+ createFilterSearch(bool strict, FilterConstraint constraint) const override;
private:
bool isPositive(size_t index) const override { return index == 0; }
};
@@ -48,6 +50,8 @@ public:
SearchIterator::UP
createIntermediateSearch(const MultiSearch::Children &subSearches,
bool strict, fef::MatchData &md) const override;
+ SearchIterator::UP
+ createFilterSearch(bool strict, FilterConstraint constraint) const override;
};
//-----------------------------------------------------------------------------
@@ -65,6 +69,8 @@ public:
SearchIterator::UP
createIntermediateSearch(const MultiSearch::Children &subSearches,
bool strict, fef::MatchData &md) const override;
+ SearchIterator::UP
+ createFilterSearch(bool strict, FilterConstraint constraint) const override;
};
//-----------------------------------------------------------------------------