diff --git a/src/filter_result_iterator.cpp b/src/filter_result_iterator.cpp index aecdb930..936332a0 100644 --- a/src/filter_result_iterator.cpp +++ b/src/filter_result_iterator.cpp @@ -2428,6 +2428,14 @@ void filter_result_iterator_t::compute_iterators() { auto const& lists = id_lists[i]; auto const& is_not_equals_comparator = numerical_not_iterator_index.count(i) != 0; + if (lists.empty() && is_not_equals_comparator) { + auto all_ids = index->seq_ids->uncompress(); + std::copy(all_ids, all_ids + index->seq_ids->num_ids(), std::back_inserter(f_id_buff)); + delete[] all_ids; + + continue; + } + for (const auto& list: lists) { if (is_not_equals_comparator) { std::vector equals_ids; diff --git a/test/collection_filtering_test.cpp b/test/collection_filtering_test.cpp index c9a87d62..8e236f4f 100644 --- a/test/collection_filtering_test.cpp +++ b/test/collection_filtering_test.cpp @@ -708,6 +708,17 @@ TEST_F(CollectionFilteringTest, FilterOnNumericFields) { ASSERT_STREQ(id.c_str(), result_id.c_str()); } + results = coll_array_fields->search("Jeremy", query_fields, "age:!= 0", facets, sort_fields, {0}, 10, 1, FREQUENCY, {false}).get(); + ASSERT_EQ(5, results["hits"].size()); + + ids = {"3", "1", "4", "0", "2"}; + for(size_t i = 0; i < results["hits"].size(); i++) { + nlohmann::json result = results["hits"].at(i); + std::string result_id = result["document"]["id"]; + std::string id = ids.at(i); + ASSERT_EQ(id, result_id); + } + // multiple filters results = coll_array_fields->search("Jeremy", query_fields, "years:<2005 && years:>1987", facets, sort_fields, {0}, 10, 1, FREQUENCY, {false}).get(); ASSERT_EQ(1, results["hits"].size()); @@ -983,6 +994,17 @@ TEST_F(CollectionFilteringTest, FilterOnFloatFields) { ASSERT_EQ(id, result_id); } + results = coll_array_fields->search("Jeremy", query_fields, "rating: [!= 1]", facets, sort_fields_desc, {0}, 10, 1, FREQUENCY, {false}).get(); + ASSERT_EQ(5, results["hits"].size()); + + ids = {"1", "2", "4", "0", "3"}; + for(size_t i = 0; i < results["hits"].size(); i++) { + nlohmann::json result = results["hits"].at(i); + std::string result_id = result["document"]["id"]; + std::string id = ids.at(i); + ASSERT_EQ(id, result_id); + } + // multiple search values against a float array field - also use extra padding between symbols results = coll_array_fields->search("Jeremy", query_fields, "top_3 : [ 5.431, 0.001 , 7.812, 11.992]", facets, sort_fields_desc, {0}, 10, 1, FREQUENCY, {false}).get(); ASSERT_EQ(3, results["hits"].size());