aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2023-12-19 14:11:47 +0100
committerGitHub <noreply@github.com>2023-12-19 14:11:47 +0100
commitbfc58b6dfd268d9abd1bd635a9ec3c4cc0009035 (patch)
tree89d33cb77e402b317970de780a7d016f853ee18e /searchlib/src
parent9a82744b7bab8ce525d85beef5bb2d774472e22c (diff)
parent29a322a5ed88935cf225b913ec652be0cdb056ef (diff)
Merge pull request #29706 from vespa-engine/geirst/prepare-for-in-term-used-for-ranking
Support TermFieldMatchData where doUnpack() sets docid.
Diffstat (limited to 'searchlib/src')
-rw-r--r--searchlib/src/tests/attribute/multi_term_or_filter_search/multi_term_or_filter_search_test.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp36
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.h2
3 files changed, 36 insertions, 10 deletions
diff --git a/searchlib/src/tests/attribute/multi_term_or_filter_search/multi_term_or_filter_search_test.cpp b/searchlib/src/tests/attribute/multi_term_or_filter_search/multi_term_or_filter_search_test.cpp
index dea2702ef0d..552a128c518 100644
--- a/searchlib/src/tests/attribute/multi_term_or_filter_search/multi_term_or_filter_search_test.cpp
+++ b/searchlib/src/tests/attribute/multi_term_or_filter_search/multi_term_or_filter_search_test.cpp
@@ -3,6 +3,7 @@
#include <vespa/searchlib/attribute/i_direct_posting_store.h>
#include <vespa/searchlib/attribute/multi_term_or_filter_search.h>
#include <vespa/searchlib/common/bitvector.h>
+#include <vespa/searchlib/fef/termfieldmatchdata.h>
#include <vespa/searchlib/queryeval/searchiterator.h>
#include <vespa/vespalib/gtest/gtest.h>
#define ENABLE_GTEST_MIGRATION
@@ -11,13 +12,16 @@
using PostingList = search::attribute::PostingListTraits<int32_t>::PostingStoreBase;
using Iterator = search::attribute::PostingListTraits<int32_t>::const_iterator;
using KeyData = PostingList::KeyDataType;
+
using search::BitVector;
using search::attribute::MultiTermOrFilterSearch;
+using search::fef::TermFieldMatchData;
using search::queryeval::SearchIterator;
using vespalib::datastore::EntryRef;
class MultiTermOrFilterSearchTest : public ::testing::Test {
PostingList _postings;
+ mutable TermFieldMatchData _tfmd;
vespalib::GenerationHandler _gens;
std::vector<EntryRef> _trees;
uint32_t _range_start;
@@ -62,7 +66,7 @@ public:
for (size_t i = 0; i < num_trees(); ++i) {
iterators.emplace_back(get_tree(i));
}
- auto result = MultiTermOrFilterSearch::create(std::move(iterators));
+ auto result = MultiTermOrFilterSearch::create(std::move(iterators), _tfmd);
result->initRange(_range_start, _range_end);
return result;
};
@@ -73,6 +77,8 @@ public:
while (doc_id < _range_end) {
if (iterator.seek(doc_id)) {
result.emplace_back(doc_id);
+ iterator.unpack(doc_id);
+ EXPECT_EQ(doc_id, _tfmd.getDocId());
++doc_id;
} else {
doc_id = std::max(doc_id + 1, iterator.getDocId());
diff --git a/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp b/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp
index 19668522e17..214851e9681 100644
--- a/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp
@@ -15,14 +15,19 @@ template<typename IteratorPack>
class MultiTermOrFilterSearchImpl : public MultiTermOrFilterSearch
{
IteratorPack _children;
+ fef::TermFieldMatchData* _tfmd;
void seek_all(uint32_t docId);
public:
- explicit MultiTermOrFilterSearchImpl(IteratorPack&& children);
+ explicit MultiTermOrFilterSearchImpl(IteratorPack&& children, fef::TermFieldMatchData* tfmd);
~MultiTermOrFilterSearchImpl() override;
void doSeek(uint32_t docId) override;
- void doUnpack(uint32_t) override { }
+ void doUnpack(uint32_t docid) override {
+ if (_tfmd != nullptr) {
+ _tfmd->resetOnlyDocId(docid);
+ }
+ }
void initRange(uint32_t begin, uint32_t end) override {
SearchIterator::initRange(begin, end);
@@ -46,9 +51,10 @@ public:
};
template<typename IteratorPack>
-MultiTermOrFilterSearchImpl<IteratorPack>::MultiTermOrFilterSearchImpl(IteratorPack&& children)
+MultiTermOrFilterSearchImpl<IteratorPack>::MultiTermOrFilterSearchImpl(IteratorPack&& children, fef::TermFieldMatchData* tfmd)
: MultiTermOrFilterSearch(),
- _children(std::move(children))
+ _children(std::move(children)),
+ _tfmd(tfmd)
{
}
@@ -89,7 +95,7 @@ namespace {
template <typename IteratorType, typename IteratorPackType>
std::unique_ptr<queryeval::SearchIterator>
-create_helper(std::vector<IteratorType>&& children)
+create_helper(std::vector<IteratorType>&& children, fef::TermFieldMatchData* tfmd)
{
if (children.empty()) {
return std::make_unique<queryeval::EmptySearch>();
@@ -97,7 +103,7 @@ create_helper(std::vector<IteratorType>&& children)
std::sort(children.begin(), children.end(),
[](const auto & a, const auto & b) { return a.size() > b.size(); });
using OrFilter = MultiTermOrFilterSearchImpl<IteratorPackType>;
- return std::make_unique<OrFilter>(IteratorPackType(std::move(children)));
+ return std::make_unique<OrFilter>(IteratorPackType(std::move(children)), tfmd);
}
}
@@ -106,13 +112,25 @@ create_helper(std::vector<IteratorType>&& children)
std::unique_ptr<queryeval::SearchIterator>
MultiTermOrFilterSearch::create(std::vector<DocidIterator>&& children)
{
- return create_helper<DocidIterator, DocidIteratorPack>(std::move(children));
+ return create_helper<DocidIterator, DocidIteratorPack>(std::move(children), nullptr);
+}
+
+std::unique_ptr<queryeval::SearchIterator>
+MultiTermOrFilterSearch::create(std::vector<DocidIterator>&& children, fef::TermFieldMatchData& tfmd)
+{
+ return create_helper<DocidIterator, DocidIteratorPack>(std::move(children), &tfmd);
}
std::unique_ptr<queryeval::SearchIterator>
MultiTermOrFilterSearch::create(std::vector<DocidWithWeightIterator>&& children)
{
- return create_helper<DocidWithWeightIterator, DocidWithWeightIteratorPack>(std::move(children));
+ return create_helper<DocidWithWeightIterator, DocidWithWeightIteratorPack>(std::move(children), nullptr);
+}
+
+std::unique_ptr<queryeval::SearchIterator>
+MultiTermOrFilterSearch::create(std::vector<DocidWithWeightIterator>&& children, fef::TermFieldMatchData& tfmd)
+{
+ return create_helper<DocidWithWeightIterator, DocidWithWeightIteratorPack>(std::move(children), &tfmd);
}
std::unique_ptr<queryeval::SearchIterator>
@@ -123,7 +141,7 @@ MultiTermOrFilterSearch::create(const std::vector<SearchIterator *>& children,
return std::make_unique<queryeval::EmptySearch>();
} else {
using OrFilter = MultiTermOrFilterSearchImpl<SearchIteratorPack>;
- return std::make_unique<OrFilter>(SearchIteratorPack(children, std::move(md)));
+ return std::make_unique<OrFilter>(SearchIteratorPack(children, std::move(md)), nullptr);
}
}
diff --git a/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.h b/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.h
index 42eb33d2eed..1e8227c3007 100644
--- a/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.h
+++ b/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.h
@@ -18,7 +18,9 @@ protected:
MultiTermOrFilterSearch() = default;
public:
static std::unique_ptr<SearchIterator> create(std::vector<DocidIterator>&& children);
+ static std::unique_ptr<SearchIterator> create(std::vector<DocidIterator>&& children, fef::TermFieldMatchData& tfmd);
static std::unique_ptr<SearchIterator> create(std::vector<DocidWithWeightIterator>&& children);
+ static std::unique_ptr<SearchIterator> create(std::vector<DocidWithWeightIterator>&& children, fef::TermFieldMatchData& tfmd);
static std::unique_ptr<SearchIterator> create(const std::vector<SearchIterator *>& children,
std::unique_ptr<fef::MatchData> md);
};