mirror of
https://github.com/typesense/typesense.git
synced 2025-05-21 22:33:27 +08:00
Fix numeric not equals filter not matching any docs when its value is absent. (#1873)
This commit is contained in:
parent
b46c72572b
commit
b12db0dcd9
@ -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;
|
||||
|
@ -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());
|
||||
|
Loading…
x
Reference in New Issue
Block a user