mirror of
https://github.com/typesense/typesense.git
synced 2025-05-24 07:40:35 +08:00
Add filter_result_iterator_t::reset
.
This commit is contained in:
parent
ce6c314771
commit
025f4bbd3a
@ -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();
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user