From b72e31bc5cb02454f4cd8798bcb114cd0aee728e Mon Sep 17 00:00:00 2001 From: Harpreet Sangar Date: Fri, 28 Apr 2023 14:55:39 +0530 Subject: [PATCH] Fix `filter_result_iterator_t::valid(uint32_t id)` not updating `seq_id` in case of complex filter. --- src/filter_result_iterator.cpp | 8 ++++++++ test/filter_test.cpp | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/filter_result_iterator.cpp b/src/filter_result_iterator.cpp index 34228916..f155d955 100644 --- a/src/filter_result_iterator.cpp +++ b/src/filter_result_iterator.cpp @@ -1014,6 +1014,14 @@ int filter_result_iterator_t::valid(uint32_t id) { if (filter_node->isOperator) { auto left_valid = left_it->valid(id), right_valid = right_it->valid(id); + if (left_it->is_valid && right_it->is_valid) { + seq_id = std::min(left_it->seq_id, right_it->seq_id); + } else if (left_it->is_valid) { + seq_id = left_it->seq_id; + } else if (right_it->is_valid) { + seq_id = right_it->seq_id; + } + if (filter_node->filter_operator == AND) { is_valid = left_it->is_valid && right_it->is_valid; diff --git a/test/filter_test.cpp b/test/filter_test.cpp index 50e7d6d6..d3aa3f31 100644 --- a/test/filter_test.cpp +++ b/test/filter_test.cpp @@ -284,10 +284,11 @@ TEST_F(FilterTest, FilterTreeIterator) { auto iter_validate_ids_test = filter_result_iterator_t(coll->get_name(), coll->_get_index(), filter_tree_root); ASSERT_TRUE(iter_validate_ids_test.init_status().ok()); - std::vector validate_ids = {0, 1, 2, 3, 4, 5, 6}; + std::vector validate_ids = {0, 1, 2, 3, 4, 5, 6}, seq_ids = {0, 2, 2, 3, 4, 5, 5}; expected = {1, 0, 1, 0, 1, 1, -1}; for (uint32_t i = 0; i < validate_ids.size(); i++) { ASSERT_EQ(expected[i], iter_validate_ids_test.valid(validate_ids[i])); + ASSERT_EQ(seq_ids[i], iter_validate_ids_test.seq_id); } delete filter_tree_root; @@ -301,9 +302,11 @@ TEST_F(FilterTest, FilterTreeIterator) { ASSERT_TRUE(iter_validate_ids_not_equals_filter_test.init_status().ok()); validate_ids = {0, 1, 2, 3, 4, 5, 6}; + seq_ids = {1, 1, 3, 3, 5, 5, 5}; expected = {0, 1, 0, 1, 0, 1, -1}; for (uint32_t i = 0; i < validate_ids.size(); i++) { ASSERT_EQ(expected[i], iter_validate_ids_not_equals_filter_test.valid(validate_ids[i])); + ASSERT_EQ(seq_ids[i], iter_validate_ids_not_equals_filter_test.seq_id); } delete filter_tree_root;