diff options
author | Geir Storli <geirst@verizonmedia.com> | 2020-06-30 18:11:51 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-30 18:11:51 +0200 |
commit | 4ef11f3f85aee2ec5cd71815a45f5bf4d3dddfd1 (patch) | |
tree | cca879bc5f695a6b0a149fa26762fd6151175dee | |
parent | e096756d9dc4d59c18c925b1f0c3a8805bcc4b6e (diff) | |
parent | 41127e148f44b2deca171e56142c00a05fc7b683 (diff) |
Merge pull request #13755 from vespa-engine/toregge/add-filter-iterator-for-same-element-blueprint
Add filter iterator for same element blueprint.
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp | 20 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h | 1 |
2 files changed, 21 insertions, 0 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp index ac4f164b09f..4de52af102b 100644 --- a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp @@ -3,6 +3,8 @@ #include "same_element_blueprint.h" #include "same_element_search.h" #include "field_spec.hpp" +#include "andsearch.h" +#include "emptysearch.h" #include <vespa/searchlib/fef/termfieldmatchdata.h> #include <vespa/searchlib/attribute/searchcontextelementiterator.h> #include <vespa/vespalib/objects/visit.hpp> @@ -88,6 +90,24 @@ SameElementBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArra return create_same_element_search(strict); } +SearchIterator::UP +SameElementBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) const +{ + if (constraint == Blueprint::FilterConstraint::UPPER_BOUND) { + MultiSearch::Children sub_searches; + sub_searches.reserve(_terms.size()); + for (size_t i = 0; i < _terms.size(); ++i) { + auto search = _terms[i]->createFilterSearch(strict && (i == 0), constraint); + sub_searches.push_back(std::move(search)); + } + UnpackInfo unpack_info; + auto search = AndSearch::create(std::move(sub_searches), strict, unpack_info); + return search; + } else { + return std::make_unique<EmptySearch>(); + } +} + void SameElementBlueprint::visitMembers(vespalib::ObjectVisitor &visitor) const { diff --git a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h index 8d647ac3a32..be04203fc6d 100644 --- a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h +++ b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h @@ -40,6 +40,7 @@ public: std::unique_ptr<SameElementSearch> create_same_element_search(bool strict) const; SearchIteratorUP createLeafSearch(const search::fef::TermFieldMatchDataArray &tfmda, bool strict) const override; + SearchIteratorUP createFilterSearch(bool strict, FilterConstraint constraint) const override; void visitMembers(vespalib::ObjectVisitor &visitor) const override; const std::vector<Blueprint::UP> &terms() const { return _terms; } const vespalib::string &field_name() const { return _field_name; } |