summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2024-01-24 14:54:38 +0100
committerTor Egge <Tor.Egge@online.no>2024-01-24 14:54:38 +0100
commit8c7a850613454ed93cf026bb3801a73f4261309c (patch)
treebc1b0e4354afacc4e62a5def60a7172628d4fa7d
parent1750cc3a7dbe1958ecf0850204736a45ce06c1e9 (diff)
Reduce code duplication. Fix typos in unit test.
-rw-r--r--searchlib/src/tests/query/streaming/near_test.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/near_query_node.cpp18
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/near_query_node.h3
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/onear_query_node.cpp33
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>();
}
}