From 5ffa3015103faf9108cd52e183386737a952f388 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Tue, 30 Jun 2020 13:46:31 +0200 Subject: Add filter iterator for same element blueprint. --- .../vespa/searchlib/queryeval/same_element_blueprint.cpp | 15 +++++++++++++++ .../vespa/searchlib/queryeval/same_element_blueprint.h | 1 + 2 files changed, 16 insertions(+) (limited to 'searchlib') diff --git a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp index ac4f164b09f..2e21248d21c 100644 --- a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp @@ -3,6 +3,7 @@ #include "same_element_blueprint.h" #include "same_element_search.h" #include "field_spec.hpp" +#include "andsearch.h" #include #include #include @@ -88,6 +89,20 @@ SameElementBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArra return create_same_element_search(strict); } +SearchIterator::UP +SameElementBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) const +{ + 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; +} + 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 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 &terms() const { return _terms; } const vespalib::string &field_name() const { return _field_name; } -- cgit v1.2.3 From 41127e148f44b2deca171e56142c00a05fc7b683 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Tue, 30 Jun 2020 14:10:34 +0200 Subject: Use empty search when asked for an underestimate filter for same element blueprint. --- .../searchlib/queryeval/same_element_blueprint.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'searchlib') diff --git a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp index 2e21248d21c..4de52af102b 100644 --- a/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.cpp @@ -4,6 +4,7 @@ #include "same_element_search.h" #include "field_spec.hpp" #include "andsearch.h" +#include "emptysearch.h" #include #include #include @@ -92,15 +93,19 @@ SameElementBlueprint::createLeafSearch(const search::fef::TermFieldMatchDataArra SearchIterator::UP SameElementBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) const { - 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)); + 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(); } - UnpackInfo unpack_info; - auto search = AndSearch::create(std::move(sub_searches), strict, unpack_info); - return search; } void -- cgit v1.2.3