Handle repeating IDs for a numerical value during filtering.

This commit is contained in:
kishorenc 2021-03-10 17:52:07 +05:30
parent bd43fc10bc
commit f1d7d323b8
2 changed files with 80 additions and 1 deletions

View File

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

View File

@ -1001,5 +1001,80 @@ TEST_F(CollectionFilteringTest, NumericalFilteringWithAnd) {
ASSERT_EQ(0, results["found"].get<size_t>());
collectionManager.drop_collection("coll1");
}
TEST_F(CollectionFilteringTest, NumericalFilteringWithArray) {
Collection *coll1;
std::vector<field> 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<std::vector<std::string>> 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<int32_t> 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<size_t>());
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<size_t>());
ASSERT_EQ(4, results["hits"].size());
results = coll1->search("*",
{}, "prices:>=2",
{}, {}, 0, 10, 1, FREQUENCY, true).get();
ASSERT_EQ(3, results["found"].get<size_t>());
ASSERT_EQ(3, results["hits"].size());
results = coll1->search("*",
{}, "prices:<4",
{}, {}, 0, 10, 1, FREQUENCY, true).get();
ASSERT_EQ(4, results["found"].get<size_t>());
ASSERT_EQ(4, results["hits"].size());
results = coll1->search("*",
{}, "prices:<=2",
{}, {}, 0, 10, 1, FREQUENCY, true).get();
ASSERT_EQ(4, results["found"].get<size_t>());
ASSERT_EQ(4, results["hits"].size());
collectionManager.drop_collection("coll1");
}