diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-06-30 21:06:45 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-30 21:06:45 +0200 |
commit | 0c0ec3379aa3cc4295bedae70cb51eb362731b6d (patch) | |
tree | e86adeaed5b86386b0b46f6137afd8cb7d872779 | |
parent | 4ef11f3f85aee2ec5cd71815a45f5bf4d3dddfd1 (diff) | |
parent | c88dfb03753ea4292a163e249f386ed7e17e2e56 (diff) |
Merge pull request #13751 from vespa-engine/toregge/add-filter-iterators-for-weak-and-blueprints
Add filter iterators for weak and blueprints.
5 files changed, 39 insertions, 0 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp index c4467df5a1c..4a34a07a773 100644 --- a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp +++ b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp @@ -416,9 +416,25 @@ public: .setDocIdLimit(get_docid_limit()), _weights, _terms, _attr, strict); } + std::unique_ptr<SearchIterator> createFilterSearch(bool strict, FilterConstraint constraint) const override; bool always_needs_unpack() const override { return true; } }; +std::unique_ptr<SearchIterator> +DirectWandBlueprint::createFilterSearch(bool, FilterConstraint constraint) const +{ + if (constraint == Blueprint::FilterConstraint::UPPER_BOUND) { + std::vector<DocumentWeightIterator> iterators; + iterators.reserve(_terms.size()); + for (const IDocumentWeightAttribute::LookupResult &r : _terms) { + _attr.create(r.posting_idx, iterators); + } + return attribute::DocumentWeightOrFilterSearch::create(std::move(iterators)); + } else { + return std::make_unique<queryeval::EmptySearch>(); + } +} + //----------------------------------------------------------------------------- class DirectAttributeBlueprint : public queryeval::SimpleLeafBlueprint diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp index aa65342c114..3f632cfc377 100644 --- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp @@ -434,6 +434,16 @@ WeakAndBlueprint::createIntermediateSearch(MultiSearch::Children sub_searches, return WeakAndSearch::create(terms, _n, strict); } +SearchIterator::UP +WeakAndBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) const +{ + if (constraint == Blueprint::FilterConstraint::UPPER_BOUND) { + return create_or_filter(get_children(), strict, constraint); + } else { + return std::make_unique<EmptySearch>(); + } +} + //----------------------------------------------------------------------------- Blueprint::HitEstimate diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h index 6bbe4562641..bc635952d55 100644 --- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h +++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h @@ -92,6 +92,7 @@ public: SearchIterator::UP createIntermediateSearch(MultiSearch::Children subSearches, bool strict, fef::MatchData &md) const override; + SearchIterator::UP createFilterSearch(bool strict, FilterConstraint constraint) const override; WeakAndBlueprint(uint32_t n) : _n(n) {} ~WeakAndBlueprint(); diff --git a/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.cpp index d4f16e2f91c..4e83c45cbc0 100644 --- a/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.cpp @@ -3,6 +3,7 @@ #include "parallel_weak_and_blueprint.h" #include "parallel_weak_and_search.h" #include <vespa/searchlib/queryeval/field_spec.hpp> +#include <vespa/searchlib/queryeval/emptysearch.h> #include <vespa/searchlib/queryeval/searchiterator.h> #include <vespa/searchlib/fef/termfieldmatchdata.h> #include <vespa/vespalib/objects/visit.hpp> @@ -102,6 +103,16 @@ ParallelWeakAndBlueprint::createLeafSearch(const search::fef::TermFieldMatchData std::move(childrenMatchData)), strict)); } +std::unique_ptr<SearchIterator> +ParallelWeakAndBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) const +{ + if (constraint == Blueprint::FilterConstraint::UPPER_BOUND) { + return create_or_filter(_terms, strict, constraint); + } else { + return std::make_unique<EmptySearch>(); + } +} + void ParallelWeakAndBlueprint::fetchPostings(const ExecuteInfo & execInfo) { diff --git a/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.h index 842067f9849..5b034b6de0a 100644 --- a/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.h +++ b/searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.h @@ -59,6 +59,7 @@ public: void addTerm(Blueprint::UP term, int32_t weight); SearchIterator::UP createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool strict) const override; + std::unique_ptr<SearchIterator> createFilterSearch(bool strict, FilterConstraint constraint) const override; void visitMembers(vespalib::ObjectVisitor &visitor) const override; void fetchPostings(const ExecuteInfo &execInfo) override; bool always_needs_unpack() const override; |