summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-06-30 21:06:45 +0200
committerGitHub <noreply@github.com>2020-06-30 21:06:45 +0200
commit0c0ec3379aa3cc4295bedae70cb51eb362731b6d (patch)
treee86adeaed5b86386b0b46f6137afd8cb7d872779
parent4ef11f3f85aee2ec5cd71815a45f5bf4d3dddfd1 (diff)
parentc88dfb03753ea4292a163e249f386ed7e17e2e56 (diff)
Merge pull request #13751 from vespa-engine/toregge/add-filter-iterators-for-weak-and-blueprints
Add filter iterators for weak and blueprints.
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp16
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp10
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h1
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.cpp11
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/wand/parallel_weak_and_blueprint.h1
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;