From b72c46f21ff1fad5aaffc171338ecc1c78bd789f Mon Sep 17 00:00:00 2001 From: Harpreet Sangar Date: Thu, 30 Mar 2023 09:52:10 +0530 Subject: [PATCH] Handle null filter tree. --- include/filter.h | 5 +++++ src/filter.cpp | 10 +++++++++- test/filter_test.cpp | 6 ++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/include/filter.h b/include/filter.h index 41ccfac8..babee59d 100644 --- a/include/filter.h +++ b/include/filter.h @@ -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); diff --git a/src/filter.cpp b/src/filter.cpp index d40a5564..27c21198 100644 --- a/src/filter.cpp +++ b/src/filter.cpp @@ -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 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(); diff --git a/test/filter_test.cpp b/test/filter_test.cpp index af7145f2..6a952c57 100644 --- a/test/filter_test.cpp +++ b/test/filter_test.cpp @@ -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 filter_op = filter::parse_filter_query("name: foo", coll->get_schema(), store, doc_id_prefix, filter_tree_root); ASSERT_TRUE(filter_op.ok());