Fix numeric not equals filter not matching any docs when its value is absent. (#1873)

This commit is contained in:
Harpreet Sangar 2024-08-07 16:08:15 +05:30 committed by GitHub
parent b46c72572b
commit b12db0dcd9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 0 deletions

View File

@ -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<uint32_t> equals_ids;

View File

@ -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());