summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2020-06-30 18:11:51 +0200
committerGitHub <noreply@github.com>2020-06-30 18:11:51 +0200
commit4ef11f3f85aee2ec5cd71815a45f5bf4d3dddfd1 (patch)
treecca879bc5f695a6b0a149fa26762fd6151175dee
parente096756d9dc4d59c18c925b1f0c3a8805bcc4b6e (diff)
parent41127e148f44b2deca171e56142c00a05fc7b683 (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.cpp20
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/same_element_blueprint.h1
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; }