diff options
author | Tor Egge <Tor.Egge@online.no> | 2024-01-24 14:54:38 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2024-01-24 14:54:38 +0100 |
commit | 8c7a850613454ed93cf026bb3801a73f4261309c (patch) | |
tree | bc1b0e4354afacc4e62a5def60a7172628d4fa7d | |
parent | 1750cc3a7dbe1958ecf0850204736a45ce06c1e9 (diff) |
Reduce code duplication. Fix typos in unit test.
4 files changed, 24 insertions, 38 deletions
diff --git a/searchlib/src/tests/query/streaming/near_test.cpp b/searchlib/src/tests/query/streaming/near_test.cpp index ad30725db19..2f95eb13dbd 100644 --- a/searchlib/src/tests/query/streaming/near_test.cpp +++ b/searchlib/src/tests/query/streaming/near_test.cpp @@ -136,28 +136,28 @@ TEST_P(NearTest, test_near_fail_field) { { 1, 0, 10, 4} } })); } -TEST_P(NearTest, test_near_sucess_after_step_first_term) +TEST_P(NearTest, test_near_success_after_step_first_term) { EXPECT_TRUE(evaluate_query(4, { { { 0, 0, 10, 0}, { 0, 0, 10, 2} }, { { 0, 0, 10, 3} }, { { 0, 0, 10, 5} } })); } -TEST_P(NearTest, test_near_sucess_after_step_second_term) +TEST_P(NearTest, test_near_success_after_step_second_term) { EXPECT_TRUE(evaluate_query(4, { { { 0, 0, 10, 2} }, { { 0, 0, 10, 0}, {0, 0, 10, 3} }, { { 0, 0, 10, 5} } })); } -TEST_P(NearTest, test_near_sucess_in_second_element) +TEST_P(NearTest, test_near_success_in_second_element) { EXPECT_TRUE(evaluate_query(4, { { { 0, 0, 10, 0}, { 0, 1, 10, 0} }, { { 0, 0, 10, 2}, { 0, 1, 10, 2} }, { { 0, 0, 10, 5}, { 0, 1, 10, 4} } })); } -TEST_P(NearTest, test_near_sucess_in_second_field) +TEST_P(NearTest, test_near_success_in_second_field) { EXPECT_TRUE(evaluate_query(4, { { { 0, 0, 10, 0}, { 1, 0, 10, 0} }, { { 0, 0, 10, 2}, { 1, 0, 10, 2} }, diff --git a/searchlib/src/vespa/searchlib/query/streaming/near_query_node.cpp b/searchlib/src/vespa/searchlib/query/streaming/near_query_node.cpp index f1722e4924a..a777841bd70 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/near_query_node.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/near_query_node.cpp @@ -6,8 +6,9 @@ namespace search::streaming { +template <bool ordered> bool -NearQueryNode::evaluate() const +NearQueryNode::evaluate_helper() const { HitIteratorPack itr_pack(getChildren()); if (!itr_pack.all_valid()) { @@ -21,8 +22,9 @@ NearQueryNode::evaluate() const bool retry_element = true; while (retry_element) { bool match = true; + uint32_t min_next_position = min_position; for (auto& it : itr_pack) { - if (!it.seek_in_field_element(min_position, itr_pack.get_field_element_ref())) { + if (!it.seek_in_field_element(min_next_position, itr_pack.get_field_element_ref())) { retry_element = false; match = false; break; @@ -32,6 +34,9 @@ NearQueryNode::evaluate() const match = false; break; } + if constexpr (ordered) { + min_next_position = it->position() + 1; + } } if (match) { return true; @@ -41,6 +46,12 @@ NearQueryNode::evaluate() const return false; } +bool +NearQueryNode::evaluate() const +{ + return evaluate_helper<false>(); +} + void NearQueryNode::visitMembers(vespalib::ObjectVisitor &visitor) const { @@ -48,4 +59,7 @@ NearQueryNode::visitMembers(vespalib::ObjectVisitor &visitor) const visit(visitor, "distance", static_cast<uint64_t>(_distance)); } +template bool NearQueryNode::evaluate_helper<false>() const; +template bool NearQueryNode::evaluate_helper<true>() const; + } diff --git a/searchlib/src/vespa/searchlib/query/streaming/near_query_node.h b/searchlib/src/vespa/searchlib/query/streaming/near_query_node.h index 63b7e748296..b49d17ff936 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/near_query_node.h +++ b/searchlib/src/vespa/searchlib/query/streaming/near_query_node.h @@ -11,6 +11,9 @@ namespace search::streaming { */ class NearQueryNode : public AndQueryNode { +protected: + template <bool ordered> + bool evaluate_helper() const; public: NearQueryNode() noexcept : AndQueryNode("NEAR"), _distance(0) { } explicit NearQueryNode(const char * opName) noexcept : AndQueryNode(opName), _distance(0) { } diff --git a/searchlib/src/vespa/searchlib/query/streaming/onear_query_node.cpp b/searchlib/src/vespa/searchlib/query/streaming/onear_query_node.cpp index 023cb6f95e3..45c04b411dc 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/onear_query_node.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/onear_query_node.cpp @@ -8,38 +8,7 @@ namespace search::streaming { bool ONearQueryNode::evaluate() const { - HitIteratorPack itr_pack(getChildren()); - if (!itr_pack.all_valid()) { - return false; - } - while (itr_pack.seek_to_matching_field_element()) { - uint32_t min_position = 0; - if (itr_pack.front()->position() > min_position + distance()) { - min_position = itr_pack.front()->position() - distance(); - } - bool retry_element = true; - while (retry_element) { - bool match = true; - uint32_t min_next_position = min_position; - for (auto& it : itr_pack) { - if (!it.seek_in_field_element(min_next_position, itr_pack.get_field_element_ref())) { - retry_element = false; - match = false; - break; - } - if (it->position() > min_position + distance()) { - min_position = it->position() - distance(); - match = false; - break; - } - min_next_position = it->position() + 1; - } - if (match) { - return true; - } - } - } - return false; + return evaluate_helper<true>(); } } |