From 025f4bbd3a4d5cd6a1726e72400c84789d9f5d96 Mon Sep 17 00:00:00 2001 From: Harpreet Sangar Date: Wed, 29 Mar 2023 13:35:39 +0530 Subject: [PATCH] Add `filter_result_iterator_t::reset`. --- include/filter.h | 4 ++++ src/filter.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ test/filter_test.cpp | 26 ++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/include/filter.h b/include/filter.h index c8d4e3b0..41ccfac8 100644 --- a/include/filter.h +++ b/include/filter.h @@ -94,5 +94,9 @@ public: /// this operation. void skip_to(uint32_t id); + /// Returns true if at least one id from the posting list object matches the filter. bool contains_atleast_one(const void* obj); + + /// Returns to the initial state of the iterator. + void reset(); }; diff --git a/src/filter.cpp b/src/filter.cpp index 304799b3..d40a5564 100644 --- a/src/filter.cpp +++ b/src/filter.cpp @@ -544,3 +544,45 @@ bool filter_result_iterator_t::contains_atleast_one(const void *obj) { return false; } + +void filter_result_iterator_t::reset() { + if (filter_node->isOperator) { + // Reset the subtrees then apply operators to arrive at the first valid doc. + left_it->reset(); + right_it->reset(); + + if (filter_node->filter_operator == AND) { + and_filter_iterators(); + } else { + or_filter_iterators(); + } + + return; + } + + const filter a_filter = filter_node->filter_exp; + + bool is_referenced_filter = !a_filter.referenced_collection_name.empty(); + if (is_referenced_filter || a_filter.field_name == "id") { + result_index = 0; + is_valid = filter_result.count > 0; + return; + } + + if (!index->field_is_indexed(a_filter.field_name)) { + return; + } + + field f = index->search_schema.at(a_filter.field_name); + + if (f.is_string()) { + posting_list_iterators.clear(); + for(auto expanded_plist: expanded_plists) { + delete expanded_plist; + } + expanded_plists.clear(); + + init(); + return; + } +} diff --git a/test/filter_test.cpp b/test/filter_test.cpp index 0c3687db..af7145f2 100644 --- a/test/filter_test.cpp +++ b/test/filter_test.cpp @@ -331,5 +331,31 @@ TEST_F(FilterTest, FilterTreeIterator) { ASSERT_TRUE(iter_plist_contains_atleast_one_test2.contains_atleast_one(&p_list1)); + delete filter_tree_root; + filter_tree_root = nullptr; + filter_op = filter::parse_filter_query("tags:= [gold, silver]", coll->get_schema(), store, doc_id_prefix, + filter_tree_root); + ASSERT_TRUE(filter_op.ok()); + + auto iter_reset_test = filter_result_iterator_t(coll->get_name(), coll->_get_index(), filter_tree_root); + ASSERT_TRUE(iter_reset_test.init_status().ok()); + + expected = {0, 2, 3, 4}; + for (auto const& i : expected) { + ASSERT_TRUE(iter_reset_test.valid()); + ASSERT_EQ(i, iter_reset_test.seq_id); + iter_reset_test.next(); + } + ASSERT_FALSE(iter_reset_test.valid()); + + iter_reset_test.reset(); + + for (auto const& i : expected) { + ASSERT_TRUE(iter_reset_test.valid()); + ASSERT_EQ(i, iter_reset_test.seq_id); + iter_reset_test.next(); + } + ASSERT_FALSE(iter_reset_test.valid()); + delete filter_tree_root; } \ No newline at end of file