diff --git a/include/num_tree.h b/include/num_tree.h index 7b0449c6..8f42c1cd 100644 --- a/include/num_tree.h +++ b/include/num_tree.h @@ -22,7 +22,9 @@ public: int64map.emplace(value, new sorted_array); } - int64map[value]->append(id); + if(!int64map[value]->contains(id)) { + int64map[value]->append(id); + } } void range_inclusive_search(int64_t start, int64_t end, uint32_t** ids, size_t& ids_len) { @@ -104,6 +106,7 @@ public: } std::sort(consolidated_ids.begin(), consolidated_ids.end()); + consolidated_ids.erase(unique(consolidated_ids.begin(), consolidated_ids.end()), consolidated_ids.end()); uint32_t *out = nullptr; ids_len = ArrayUtils::or_scalar(&consolidated_ids[0], consolidated_ids.size(), @@ -134,6 +137,7 @@ public: } std::sort(consolidated_ids.begin(), consolidated_ids.end()); + consolidated_ids.erase(unique(consolidated_ids.begin(), consolidated_ids.end()), consolidated_ids.end()); uint32_t *out = nullptr; ids_len = ArrayUtils::or_scalar(&consolidated_ids[0], consolidated_ids.size(), diff --git a/test/collection_filtering_test.cpp b/test/collection_filtering_test.cpp index 82704872..2682c1aa 100644 --- a/test/collection_filtering_test.cpp +++ b/test/collection_filtering_test.cpp @@ -1001,5 +1001,80 @@ TEST_F(CollectionFilteringTest, NumericalFilteringWithAnd) { ASSERT_EQ(0, results["found"].get()); + collectionManager.drop_collection("coll1"); +} + +TEST_F(CollectionFilteringTest, NumericalFilteringWithArray) { + Collection *coll1; + + std::vector fields = {field("title", field_types::STRING, false), + field("prices", field_types::INT32_ARRAY, false),}; + + coll1 = collectionManager.get_collection("coll1").get(); + if (coll1 == nullptr) { + coll1 = collectionManager.create_collection("coll1", 1, fields, "").get(); + } + + std::vector> records = { + {"1", "T Shirt 1", "1", "2", "3"}, + {"2", "T Shirt 2", "1", "2", "3"}, + {"3", "T Shirt 3", "1", "2", "3"}, + {"4", "T Shirt 4", "1", "1", "1"}, + }; + + for (size_t i = 0; i < records.size(); i++) { + nlohmann::json doc; + + doc["id"] = records[i][0]; + doc["title"] = records[i][1]; + + std::vector prices; + for(size_t j = 2; j <= 4; j++) { + prices.push_back(std::stoi(records[i][j])); + } + + doc["prices"] = prices; + + ASSERT_TRUE(coll1->add(doc.dump()).ok()); + } + + // check equals on a repeating price + auto results = coll1->search("*", + {}, "prices:1", + {}, {}, 0, 10, 1, FREQUENCY, true).get(); + + ASSERT_EQ(4, results["found"].get()); + ASSERT_EQ(4, results["hits"].size()); + + // check ranges + + results = coll1->search("*", + {}, "prices:>=1", + {}, {}, 0, 10, 1, FREQUENCY, true).get(); + + ASSERT_EQ(4, results["found"].get()); + ASSERT_EQ(4, results["hits"].size()); + + results = coll1->search("*", + {}, "prices:>=2", + {}, {}, 0, 10, 1, FREQUENCY, true).get(); + + ASSERT_EQ(3, results["found"].get()); + ASSERT_EQ(3, results["hits"].size()); + + results = coll1->search("*", + {}, "prices:<4", + {}, {}, 0, 10, 1, FREQUENCY, true).get(); + + ASSERT_EQ(4, results["found"].get()); + ASSERT_EQ(4, results["hits"].size()); + + results = coll1->search("*", + {}, "prices:<=2", + {}, {}, 0, 10, 1, FREQUENCY, true).get(); + + ASSERT_EQ(4, results["found"].get()); + ASSERT_EQ(4, results["hits"].size()); + collectionManager.drop_collection("coll1"); } \ No newline at end of file