aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/queryeval/same_element
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2023-01-12 14:40:39 +0000
committerGeir Storli <geirst@yahooinc.com>2023-01-12 14:40:39 +0000
commitca18a63e3b492b218026ca012970d4bb7cecc992 (patch)
tree169dd9600b7501d3dfd58c73c2e54c1de99d6a42 /searchlib/src/tests/queryeval/same_element
parent6520197c31113ba7cb173138f2431d3a481ab494 (diff)
Expose SameElement query terms to ranking.
A TermFieldMatchData is allocated per SameElement term, and this is used to signal matching docids in doUnpack() on the SameElement search iterator. This allows using the matches() rank feature on a field (virtual) that is searched using a SameElement term.
Diffstat (limited to 'searchlib/src/tests/queryeval/same_element')
-rw-r--r--searchlib/src/tests/queryeval/same_element/same_element_test.cpp29
1 files changed, 23 insertions, 6 deletions
diff --git a/searchlib/src/tests/queryeval/same_element/same_element_test.cpp b/searchlib/src/tests/queryeval/same_element/same_element_test.cpp
index 7c2b5d0b135..fba8d5d7899 100644
--- a/searchlib/src/tests/queryeval/same_element/same_element_test.cpp
+++ b/searchlib/src/tests/queryeval/same_element/same_element_test.cpp
@@ -22,8 +22,19 @@ void verify_elements(SameElementSearch &se, uint32_t docid, const std::initializ
EXPECT_EQUAL(actual, expect);
}
+FieldSpec make_field_spec() {
+ // This field spec is aligned with the match data created below.
+ uint32_t field_id = 0;
+ TermFieldHandle handle = 0;
+ return {"foo", field_id, handle};
+}
+
+MatchData::UP make_match_data() {
+ return MatchData::makeTestInstance(1, 1);
+}
+
std::unique_ptr<SameElementBlueprint> make_blueprint(const std::vector<FakeResult> &children, bool fake_attr = false) {
- auto result = std::make_unique<SameElementBlueprint>("foo", false);
+ auto result = std::make_unique<SameElementBlueprint>(make_field_spec(), false);
for (size_t i = 0; i < children.size(); ++i) {
uint32_t field_id = i;
vespalib::string field_name = vespalib::make_string("f%u", field_id);
@@ -43,7 +54,7 @@ Blueprint::UP finalize(Blueprint::UP bp, bool strict) {
}
SimpleResult find_matches(const std::vector<FakeResult> &children) {
- auto md = MatchData::makeTestInstance(0, 0);
+ auto md = make_match_data();
auto bp = finalize(make_blueprint(children), false);
auto search = bp->createSearch(*md, false);
return SimpleResult().search(*search, 1000);
@@ -73,7 +84,7 @@ TEST("require that matching elements can be identified") {
auto a = make_result({{5, {1,3,7,12}}, {10, {1,2,3}}});
auto b = make_result({{5, {3,5,7,10}}, {10, {4,5,6}}});
auto bp = finalize(make_blueprint({a,b}), false);
- auto md = MatchData::makeTestInstance(0, 0);
+ auto md = make_match_data();
auto search = bp->createSearch(*md, false);
search->initRange(1, 1000);
SameElementSearch *se = dynamic_cast<SameElementSearch*>(search.get());
@@ -91,18 +102,24 @@ TEST("require that children must match within same element") {
EXPECT_EQUAL(result, expect);
}
-TEST("require that strict iterator seeks to next hit") {
- auto md = MatchData::makeTestInstance(0, 0);
+TEST("require that strict iterator seeks to next hit and can unpack matching docid") {
+ auto md = make_match_data();
auto a = make_result({{5, {1,2}}, {7, {1,2}}, {8, {1,2}}, {9, {1,2}}});
auto b = make_result({{5, {3}}, {6, {1,2}}, {7, {2,4}}, {9, {1}}});
auto bp = finalize(make_blueprint({a,b}), true);
auto search = bp->createSearch(*md, true);
+ auto* tfmd = md->resolveTermField(0);
search->initRange(1, 1000);
EXPECT_LESS(search->getDocId(), 1u);
EXPECT_FALSE(search->seek(1));
EXPECT_EQUAL(search->getDocId(), 7u);
+ search->unpack(7);
+ EXPECT_EQUAL(tfmd->getDocId(), 7u);
EXPECT_TRUE(search->seek(9));
EXPECT_EQUAL(search->getDocId(), 9u);
+ EXPECT_EQUAL(tfmd->getDocId(), 7u);
+ search->unpack(9);
+ EXPECT_EQUAL(tfmd->getDocId(), 9u);
EXPECT_FALSE(search->seek(10));
EXPECT_TRUE(search->isAtEnd());
}
@@ -129,7 +146,7 @@ TEST("require that attribute iterators are wrapped for element unpacking") {
auto a = make_result({{5, {1,3,7}}});
auto b = make_result({{5, {3,5,10}}});
auto bp = finalize(make_blueprint({a,b}, true), true);
- auto md = MatchData::makeTestInstance(0, 0);
+ auto md = make_match_data();
auto search = bp->createSearch(*md, false);
SameElementSearch *se = dynamic_cast<SameElementSearch*>(search.get());
ASSERT_TRUE(se != nullptr);