summaryrefslogtreecommitdiffstats
path: root/searchlib/src
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-09-25 20:56:22 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-09-26 11:02:04 +0000
commit72a561ae8d19d91f911aa475fb6d34a143373fdd (patch)
tree76d4a158184f09d0666b6dc72bade3cae01d6f1d /searchlib/src
parent9f4e0f7d89a6b7f393d1cedd04a7d53e63e3f63d (diff)
- Make iterator pack template argument to handle both AttributeIteratorPack and SearchIteratorPack.
- Use DocumentWeightOrFilterSearch to implement weightset search when filter and no rank needed.
Diffstat (limited to 'searchlib/src')
-rw-r--r--searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.cpp43
-rw-r--r--searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.h10
-rw-r--r--searchlib/src/vespa/searchlib/attribute/iterator_pack.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/attribute/iterator_pack.h8
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/iterator_pack.h12
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp1
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp5
8 files changed, 58 insertions, 31 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.cpp b/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.cpp
index c840c5cbc91..97e725649d3 100644
--- a/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.cpp
@@ -2,22 +2,27 @@
#include "document_weight_or_filter_search.h"
#include "iterator_pack.h"
+#include <vespa/searchlib/fef/matchdata.h>
+#include <vespa/searchlib/queryeval/iterator_pack.h>
#include <vespa/searchlib/common/bitvector.h>
#include <vespa/searchlib/queryeval/emptysearch.h>
+using search::queryeval::SearchIteratorPack;
+
namespace search::attribute {
+template<typename IteratorPack>
class DocumentWeightOrFilterSearchImpl : public DocumentWeightOrFilterSearch
{
- AttributeIteratorPack _children;
+ IteratorPack _children;
void seek_all(uint32_t docId);
public:
- explicit DocumentWeightOrFilterSearchImpl(AttributeIteratorPack&& children);
+ explicit DocumentWeightOrFilterSearchImpl(IteratorPack&& children);
~DocumentWeightOrFilterSearchImpl() override;
void doSeek(uint32_t docId) override;
- void doUnpack(uint32_t) override;
+ void doUnpack(uint32_t) override { }
void initRange(uint32_t begin, uint32_t end) override {
SearchIterator::initRange(begin, end);
@@ -40,16 +45,19 @@ public:
Trinary is_strict() const override { return Trinary::True; }
};
-DocumentWeightOrFilterSearchImpl::DocumentWeightOrFilterSearchImpl(AttributeIteratorPack&& children)
+template<typename IteratorPack>
+DocumentWeightOrFilterSearchImpl<IteratorPack>::DocumentWeightOrFilterSearchImpl(IteratorPack&& children)
: DocumentWeightOrFilterSearch(),
_children(std::move(children))
{
}
-DocumentWeightOrFilterSearchImpl::~DocumentWeightOrFilterSearchImpl() = default;
+template<typename IteratorPack>
+DocumentWeightOrFilterSearchImpl<IteratorPack>::~DocumentWeightOrFilterSearchImpl() = default;
+template<typename IteratorPack>
void
-DocumentWeightOrFilterSearchImpl::seek_all(uint32_t docId) {
+DocumentWeightOrFilterSearchImpl<IteratorPack>::seek_all(uint32_t docId) {
for (uint16_t i = 0; i < _children.size(); ++i) {
uint32_t next = _children.get_docid(i);
if (next < docId) {
@@ -58,8 +66,9 @@ DocumentWeightOrFilterSearchImpl::seek_all(uint32_t docId) {
}
}
+template<typename IteratorPack>
void
-DocumentWeightOrFilterSearchImpl::doSeek(uint32_t docId)
+DocumentWeightOrFilterSearchImpl<IteratorPack>::doSeek(uint32_t docId)
{
uint32_t min_doc_id = endDocId;
for (uint16_t i = 0; i < _children.size(); ++i) {
@@ -76,11 +85,6 @@ DocumentWeightOrFilterSearchImpl::doSeek(uint32_t docId)
setDocId(min_doc_id);
}
-void
-DocumentWeightOrFilterSearchImpl::doUnpack(uint32_t)
-{
-}
-
std::unique_ptr<queryeval::SearchIterator>
DocumentWeightOrFilterSearch::create(std::vector<DocumentWeightIterator>&& children)
{
@@ -89,7 +93,20 @@ DocumentWeightOrFilterSearch::create(std::vector<DocumentWeightIterator>&& child
} else {
std::sort(children.begin(), children.end(),
[](const auto & a, const auto & b) { return a.size() > b.size(); });
- return std::make_unique<DocumentWeightOrFilterSearchImpl>(AttributeIteratorPack(std::move(children)));
+ using OrFilter = DocumentWeightOrFilterSearchImpl<AttributeIteratorPack>;
+ return std::make_unique<OrFilter>(AttributeIteratorPack(std::move(children)));
+ }
+}
+
+std::unique_ptr<queryeval::SearchIterator>
+DocumentWeightOrFilterSearch::create(const std::vector<SearchIterator *>& children,
+ std::unique_ptr<fef::MatchData> md)
+{
+ if (children.empty()) {
+ return std::make_unique<queryeval::EmptySearch>();
+ } else {
+ using OrFilter = DocumentWeightOrFilterSearchImpl<SearchIteratorPack>;
+ return std::make_unique<OrFilter>(SearchIteratorPack(children, std::move(md)));
}
}
diff --git a/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.h b/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.h
index c601856573f..19fa20e2d51 100644
--- a/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.h
+++ b/searchlib/src/vespa/searchlib/attribute/document_weight_or_filter_search.h
@@ -3,6 +3,7 @@
#include "i_document_weight_attribute.h"
#include <vespa/searchlib/queryeval/searchiterator.h>
+namespace search::fef { class MatchData; }
namespace search::attribute {
/**
@@ -12,12 +13,11 @@ namespace search::attribute {
class DocumentWeightOrFilterSearch : public queryeval::SearchIterator
{
protected:
- DocumentWeightOrFilterSearch()
- : queryeval::SearchIterator()
- {
- }
+ DocumentWeightOrFilterSearch() = default;
public:
- static std::unique_ptr<queryeval::SearchIterator> create(std::vector<DocumentWeightIterator>&& children);
+ static std::unique_ptr<SearchIterator> create(std::vector<DocumentWeightIterator>&& children);
+ static std::unique_ptr<SearchIterator> create(const std::vector<SearchIterator *>& children,
+ std::unique_ptr<fef::MatchData> md);
};
}
diff --git a/searchlib/src/vespa/searchlib/attribute/iterator_pack.cpp b/searchlib/src/vespa/searchlib/attribute/iterator_pack.cpp
index ab06fc270bd..3d9e3095536 100644
--- a/searchlib/src/vespa/searchlib/attribute/iterator_pack.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/iterator_pack.cpp
@@ -5,6 +5,14 @@
namespace search {
+AttributeIteratorPack::~AttributeIteratorPack() = default;
+
+AttributeIteratorPack::AttributeIteratorPack(std::vector<DocumentWeightIterator> &&children)
+ : _children(std::move(children))
+{
+ assert(_children.size() < 0x10000);
+}
+
std::unique_ptr<BitVector>
AttributeIteratorPack::get_hits(uint32_t begin_id, uint32_t end_id) {
BitVector::UP result(BitVector::create(begin_id, end_id));
diff --git a/searchlib/src/vespa/searchlib/attribute/iterator_pack.h b/searchlib/src/vespa/searchlib/attribute/iterator_pack.h
index 1753a3d0c2d..80e4c227860 100644
--- a/searchlib/src/vespa/searchlib/attribute/iterator_pack.h
+++ b/searchlib/src/vespa/searchlib/attribute/iterator_pack.h
@@ -15,12 +15,12 @@ private:
std::vector<DocumentWeightIterator> _children;
public:
- AttributeIteratorPack() : _children() {}
+ AttributeIteratorPack() noexcept : _children() {}
AttributeIteratorPack(AttributeIteratorPack &&rhs) noexcept = default;
AttributeIteratorPack &operator=(AttributeIteratorPack &&rhs) noexcept = default;
- explicit AttributeIteratorPack(std::vector<DocumentWeightIterator> &&children)
- : _children(std::move(children)) {}
+ explicit AttributeIteratorPack(std::vector<DocumentWeightIterator> &&children);
+ ~AttributeIteratorPack();
uint32_t get_docid(uint16_t ref) const {
return _children[ref].valid() ? _children[ref].getKey() : endDocId;
@@ -41,7 +41,7 @@ public:
std::unique_ptr<BitVector> get_hits(uint32_t begin_id, uint32_t end_id);
void or_hits_into(BitVector &result, uint32_t begin_id);
- size_t size() const noexcept { return _children.size(); }
+ uint16_t size() const noexcept { return _children.size(); }
void initRange(uint32_t begin, uint32_t end) {
(void) end;
for (auto &child: _children) {
diff --git a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp
index e9f1b526a87..5280100b5bc 100644
--- a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp
@@ -28,6 +28,7 @@ SearchIteratorPack::SearchIteratorPack(const std::vector<SearchIterator*> &child
_children.emplace_back(child);
}
assert((_children.size() == _childMatch.size()) || _childMatch.empty());
+ assert(_children.size() < 0x10000);
}
SearchIteratorPack::SearchIteratorPack(const std::vector<SearchIterator*> &children, MatchDataUP md)
@@ -36,7 +37,6 @@ SearchIteratorPack::SearchIteratorPack(const std::vector<SearchIterator*> &child
std::unique_ptr<BitVector>
SearchIteratorPack::get_hits(uint32_t begin_id, uint32_t end_id) const {
-
BitVector::UP result = TermwiseHelper::orChildren(_children.begin(), _children.end(), begin_id);
if (! result ) {
result = BitVector::create(begin_id, end_id);
diff --git a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h
index 907371008d9..ca1e6461533 100644
--- a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h
+++ b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.h
@@ -31,27 +31,25 @@ public:
// TODO: use MultiSearch::Children to pass ownership
SearchIteratorPack(const std::vector<SearchIterator*> &children, MatchDataUP md);
- uint32_t get_docid(uint32_t ref) const {
+ uint32_t get_docid(uint16_t ref) const {
return _children[ref]->getDocId();
}
- uint32_t seek(uint32_t ref, uint32_t docid) {
+ uint32_t seek(uint16_t ref, uint32_t docid) {
_children[ref]->seek(docid);
return _children[ref]->getDocId();
}
- int32_t get_weight(uint32_t ref, uint32_t docid) {
+ int32_t get_weight(uint16_t ref, uint32_t docid) {
_children[ref]->doUnpack(docid);
return _childMatch[ref]->getWeight();
}
- void unpack(uint32_t ref, uint32_t docid) {
+ void unpack(uint16_t ref, uint32_t docid) {
_children[ref]->doUnpack(docid);
}
- size_t size() const {
- return _children.size();
- }
+ uint16_t size() const { return _children.size(); }
void initRange(uint32_t begin, uint32_t end) {
for (auto & child: _children) {
child->initRange(begin, end);
diff --git a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp
index 97f6bc2e6f8..55009e714b9 100644
--- a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_blueprint.cpp
@@ -92,7 +92,6 @@ WeightedSetTermBlueprint::addTerm(Blueprint::UP term, int32_t weight, HitEstimat
_terms.push_back(std::move(term));
}
-
SearchIterator::UP
WeightedSetTermBlueprint::createLeafSearch(const fef::TermFieldMatchDataArray &tfmda, bool) const
{
diff --git a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp
index 8478a0d3c35..27cfff1cf24 100644
--- a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp
@@ -2,6 +2,7 @@
#include "weighted_set_term_search.h"
#include <vespa/searchlib/common/bitvector.h>
+#include <vespa/searchlib/attribute/document_weight_or_filter_search.h>
#include <vespa/vespalib/objects/visit.h>
#include <vespa/searchcommon/attribute/i_search_context.h>
@@ -171,6 +172,10 @@ WeightedSetTermSearch::create(const std::vector<SearchIterator *> &children,
using ArrayHeapImpl = WeightedSetTermSearchImpl<vespalib::LeftArrayHeap, SearchIteratorPack>;
using HeapImpl = WeightedSetTermSearchImpl<vespalib::LeftHeap, SearchIteratorPack>;
+ if (field_is_filter && tmd.isNotNeeded()) {
+ return attribute::DocumentWeightOrFilterSearch::create(children, std::move(match_data));
+ }
+
if (children.size() < 128) {
return SearchIterator::UP(new ArrayHeapImpl(tmd, field_is_filter, weights, SearchIteratorPack(children, std::move(match_data))));
}