diff options
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp | 56 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h | 6 |
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; }; //----------------------------------------------------------------------------- |