mirror of
https://github.com/typesense/typesense.git
synced 2025-05-23 15:23:40 +08:00
Handle null filter tree.
This commit is contained in:
parent
025f4bbd3a
commit
dc74be283f
@ -53,6 +53,11 @@ public:
|
||||
collection_name(collection_name),
|
||||
index(index),
|
||||
filter_node(filter_node) {
|
||||
if (filter_node == nullptr) {
|
||||
is_valid = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// Generate the iterator tree and then initialize each node.
|
||||
if (filter_node->isOperator) {
|
||||
left_it = new filter_result_iterator_t(collection_name, index, filter_node->left);
|
||||
|
@ -207,6 +207,10 @@ void filter_result_iterator_t::next() {
|
||||
}
|
||||
|
||||
void filter_result_iterator_t::init() {
|
||||
if (filter_node == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (filter_node->isOperator) {
|
||||
if (filter_node->filter_operator == AND) {
|
||||
and_filter_iterators();
|
||||
@ -494,7 +498,7 @@ int filter_result_iterator_t::valid(uint32_t id) {
|
||||
}
|
||||
|
||||
Option<bool> filter_result_iterator_t::init_status() {
|
||||
if (filter_node->isOperator) {
|
||||
if (filter_node != nullptr && filter_node->isOperator) {
|
||||
auto left_status = left_it->init_status();
|
||||
|
||||
return !left_status.ok() ? left_status : right_it->init_status();
|
||||
@ -546,6 +550,10 @@ bool filter_result_iterator_t::contains_atleast_one(const void *obj) {
|
||||
}
|
||||
|
||||
void filter_result_iterator_t::reset() {
|
||||
if (filter_node == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (filter_node->isOperator) {
|
||||
// Reset the subtrees then apply operators to arrive at the first valid doc.
|
||||
left_it->reset();
|
||||
|
@ -61,6 +61,12 @@ TEST_F(FilterTest, FilterTreeIterator) {
|
||||
|
||||
const std::string doc_id_prefix = std::to_string(coll->get_collection_id()) + "_" + Collection::DOC_ID_PREFIX + "_";
|
||||
filter_node_t* filter_tree_root = nullptr;
|
||||
|
||||
auto iter_null_filter_tree_test = filter_result_iterator_t(coll->get_name(), coll->_get_index(), filter_tree_root);
|
||||
|
||||
ASSERT_TRUE(iter_null_filter_tree_test.init_status().ok());
|
||||
ASSERT_FALSE(iter_null_filter_tree_test.valid());
|
||||
|
||||
Option<bool> filter_op = filter::parse_filter_query("name: foo", coll->get_schema(), store, doc_id_prefix,
|
||||
filter_tree_root);
|
||||
ASSERT_TRUE(filter_op.ok());
|
||||
|
Loading…
x
Reference in New Issue
Block a user