Add filter_result_iterator_t::reset.

This commit is contained in:
Harpreet Sangar 2023-03-29 13:35:39 +05:30
parent ce6c314771
commit 025f4bbd3a
3 changed files with 72 additions and 0 deletions

View File

@ -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();
};

View File

@ -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;
}
}

View File

@ -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;
}