mirror of
https://github.com/typesense/typesense.git
synced 2025-05-17 20:22:32 +08:00
Handle repeating IDs for a numerical value during filtering.
This commit is contained in:
parent
bd43fc10bc
commit
f1d7d323b8
@ -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(),
|
||||
|
@ -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");
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user