From 6db0b108a14ec5765d5822f03086f937e80e6d16 Mon Sep 17 00:00:00 2001 From: Harpreet Sangar Date: Fri, 21 Apr 2023 09:48:19 +0530 Subject: [PATCH] Add tests. --- src/filter_result_iterator.cpp | 23 +++++++++-- test/filter_test.cpp | 70 ++++++++++++++++++++++++++++++---- 2 files changed, 81 insertions(+), 12 deletions(-) diff --git a/src/filter_result_iterator.cpp b/src/filter_result_iterator.cpp index c5098581..2e144af8 100644 --- a/src/filter_result_iterator.cpp +++ b/src/filter_result_iterator.cpp @@ -858,11 +858,15 @@ void filter_result_iterator_t::skip_to(uint32_t id) { seq_id = result_index; uint32_t previous_match; + + // Keep ignoring the found gaps till they cannot contain id. do { - previous_match = seq_id; - advance_string_filter_token_iterators(); - doc_matching_string_filter(f.is_array()); - } while (is_valid && previous_match + 1 == seq_id && seq_id >= id); + do { + previous_match = seq_id; + advance_string_filter_token_iterators(); + doc_matching_string_filter(f.is_array()); + } while (is_valid && previous_match + 1 == seq_id); + } while (is_valid && seq_id <= id); if (!is_valid) { // filter matched all the ids in the index. So for not equals, there's no match. @@ -873,11 +877,22 @@ void filter_result_iterator_t::skip_to(uint32_t id) { is_valid = true; seq_id = previous_match + 1; result_index = index->seq_ids->last_id() + 1; + + // Skip to id, if possible. + if (seq_id < id && id < result_index) { + seq_id = id; + } + return; } result_index = seq_id; seq_id = previous_match + 1; + + if (seq_id < id && id < result_index) { + seq_id = id; + } + return; } diff --git a/test/filter_test.cpp b/test/filter_test.cpp index 86cdd0f5..50e7d6d6 100644 --- a/test/filter_test.cpp +++ b/test/filter_test.cpp @@ -186,16 +186,29 @@ TEST_F(FilterTest, FilterTreeIterator) { filter_tree_root); ASSERT_TRUE(filter_op.ok()); - auto iter_skip_test = filter_result_iterator_t(coll->get_name(), coll->_get_index(), filter_tree_root); - ASSERT_TRUE(iter_skip_test.init_status().ok()); + auto iter_skip_test1 = filter_result_iterator_t(coll->get_name(), coll->_get_index(), filter_tree_root); + ASSERT_TRUE(iter_skip_test1.init_status().ok()); - ASSERT_TRUE(iter_skip_test.is_valid); - iter_skip_test.skip_to(3); - ASSERT_TRUE(iter_skip_test.is_valid); - ASSERT_EQ(4, iter_skip_test.seq_id); - iter_skip_test.next(); + ASSERT_TRUE(iter_skip_test1.is_valid); + iter_skip_test1.skip_to(3); + ASSERT_TRUE(iter_skip_test1.is_valid); + ASSERT_EQ(4, iter_skip_test1.seq_id); + iter_skip_test1.next(); - ASSERT_FALSE(iter_skip_test.is_valid); + ASSERT_FALSE(iter_skip_test1.is_valid); + + delete filter_tree_root; + filter_tree_root = nullptr; + filter_op = filter::parse_filter_query("tags: != silver", coll->get_schema(), store, doc_id_prefix, + filter_tree_root); + ASSERT_TRUE(filter_op.ok()); + + auto iter_skip_test2 = filter_result_iterator_t(coll->get_name(), coll->_get_index(), filter_tree_root); + ASSERT_TRUE(iter_skip_test2.init_status().ok()); + + ASSERT_TRUE(iter_skip_test2.is_valid); + iter_skip_test2.skip_to(3); + ASSERT_FALSE(iter_skip_test2.is_valid); delete filter_tree_root; filter_tree_root = nullptr; @@ -426,4 +439,45 @@ TEST_F(FilterTest, FilterTreeIterator) { delete and_result; delete filter_tree_root; + + doc = R"({ + "name": "James Rowdy", + "age": 36, + "years": [2005, 2022], + "rating": 6.03, + "tags": ["FINE PLATINUM"] + })"_json; + add_op = coll->add(doc.dump()); + ASSERT_TRUE(add_op.ok()); + + filter_tree_root = nullptr; + filter_op = filter::parse_filter_query("tags: != FINE PLATINUM", coll->get_schema(), store, doc_id_prefix, + filter_tree_root); + ASSERT_TRUE(filter_op.ok()); + + auto iter_skip_test3 = filter_result_iterator_t(coll->get_name(), coll->_get_index(), filter_tree_root); + ASSERT_TRUE(iter_skip_test3.init_status().ok()); + + ASSERT_TRUE(iter_skip_test3.is_valid); + iter_skip_test3.skip_to(4); + ASSERT_EQ(4, iter_skip_test3.seq_id); + + ASSERT_TRUE(iter_skip_test3.is_valid); + + delete filter_tree_root; + + filter_tree_root = nullptr; + filter_op = filter::parse_filter_query("tags: != gold", coll->get_schema(), store, doc_id_prefix, + filter_tree_root); + ASSERT_TRUE(filter_op.ok()); + + auto iter_skip_test4 = filter_result_iterator_t(coll->get_name(), coll->_get_index(), filter_tree_root); + ASSERT_TRUE(iter_skip_test4.init_status().ok()); + + ASSERT_TRUE(iter_skip_test4.is_valid); + iter_skip_test4.skip_to(6); + ASSERT_EQ(6, iter_skip_test4.seq_id); + ASSERT_TRUE(iter_skip_test4.is_valid); + + delete filter_tree_root; } \ No newline at end of file