diff --git a/src/filter.cpp b/src/filter.cpp index b42c3e5d..e7a46093 100644 --- a/src/filter.cpp +++ b/src/filter.cpp @@ -459,6 +459,23 @@ bool filter_result_iterator_t::valid(uint32_t id) { } } + if (filter_node->filter_exp.apply_not_equals) { + // Even when iterator becomes invalid, we keep it marked as valid since we are evaluating not equals. + if (!valid()) { + is_valid = true; + return is_valid; + } + + skip_to(id); + + if (!is_valid) { + is_valid = true; + return is_valid; + } + + return doc != id; + } + skip_to(id); return is_valid && doc == id; } diff --git a/test/filter_test.cpp b/test/filter_test.cpp index 96121e92..3c4b94a5 100644 --- a/test/filter_test.cpp +++ b/test/filter_test.cpp @@ -256,7 +256,22 @@ TEST_F(FilterTest, FilterTreeIterator) { ASSERT_TRUE(iter_validate_ids_test.valid(i)); } - ASSERT_FALSE(iter_skip_complex_filter_test.valid()); + ASSERT_TRUE(iter_op.ok()); + + delete filter_tree_root; + filter_tree_root = nullptr; + filter_op = filter::parse_filter_query("name: James || tags: != gold", coll->get_schema(), store, doc_id_prefix, + filter_tree_root); + ASSERT_TRUE(filter_op.ok()); + + auto iter_validate_ids_not_equals_filter_test = filter_result_iterator_t(coll->get_name(), coll->_get_index(), + filter_tree_root, iter_op); + + expected = {1, 3, 5}; + for (auto const& i : expected) { + ASSERT_TRUE(iter_validate_ids_not_equals_filter_test.valid(i)); + } + ASSERT_TRUE(iter_op.ok()); delete filter_tree_root;