mirror of
https://github.com/typesense/typesense.git
synced 2025-05-20 21:52:23 +08:00
Merge pull request #1249 from krunal1313/range_facets_groupby
adding group_by support for range_facets
This commit is contained in:
commit
86c4712345
@ -1257,6 +1257,10 @@ void Index::do_facets(std::vector<facet> & facets, facet_query_t & facet_query,
|
||||
int64_t range_id = range_pair.first;
|
||||
facet_count_t& facet_count = a_facet.result_map[range_id];
|
||||
facet_count.count += 1;
|
||||
|
||||
if(group_limit) {
|
||||
a_facet.hash_groups[range_id].emplace(distinct_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3359,7 +3363,7 @@ Option<bool> Index::search(std::vector<query_tokens_t>& field_query_tokens, cons
|
||||
);
|
||||
} else {
|
||||
size_t count = 0;
|
||||
if(acc_facet.result_map.count(facet_kv.first) == 0) {
|
||||
if (acc_facet.result_map.count(facet_kv.first) == 0) {
|
||||
// not found, so set it
|
||||
count = facet_kv.second.count;
|
||||
} else {
|
||||
|
@ -1689,3 +1689,111 @@ TEST_F(CollectionFacetingTest, FacetOnArrayFieldWithSpecialChars) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(CollectionFacetingTest, RangeFacetTestWithGroupBy) {
|
||||
std::vector<field> fields = {field("place", field_types::STRING, false),
|
||||
field("state", field_types::STRING, true),
|
||||
field("visitors", field_types::INT32, true),
|
||||
field("rating", field_types::FLOAT, true),
|
||||
field("trackingFrom", field_types::INT32, true),};
|
||||
Collection* coll1 = collectionManager.create_collection(
|
||||
"coll1", 1, fields, "", 0, "", {}, {}
|
||||
).get();
|
||||
nlohmann::json doc1;
|
||||
doc1["id"] = "0";
|
||||
doc1["place"] = "Mysore Palace";
|
||||
doc1["state"] = "Karnataka";
|
||||
doc1["visitors"] = 235486;
|
||||
doc1["rating"] = 4.5;
|
||||
doc1["trackingFrom"] = 1900;
|
||||
|
||||
nlohmann::json doc2;
|
||||
doc2["id"] = "1";
|
||||
doc2["place"] = "Hampi";
|
||||
doc2["state"] = "Karnataka";
|
||||
doc2["visitors"] = 201022;
|
||||
doc2["rating"] = 4.5;
|
||||
doc2["trackingFrom"] = 1900;
|
||||
|
||||
nlohmann::json doc3;
|
||||
doc3["id"] = "2";
|
||||
doc3["place"] = "Mahabalipuram";
|
||||
doc3["state"] = "TamilNadu";
|
||||
doc3["visitors"] = 174684;
|
||||
doc3["rating"] = 3.8;
|
||||
doc3["trackingFrom"] = 1900;
|
||||
|
||||
nlohmann::json doc4;
|
||||
doc4["id"] = "3";
|
||||
doc4["place"] = "Meenakshi Amman Temple";
|
||||
doc4["state"] = "TamilNadu";
|
||||
doc4["visitors"] = 246676;
|
||||
doc4["rating"] = 4.5;
|
||||
doc4["trackingFrom"] = 2000;
|
||||
|
||||
nlohmann::json doc5;
|
||||
doc5["id"] = "4";
|
||||
doc5["place"] = "Staue of Unity";
|
||||
doc5["state"] = "Gujarat";
|
||||
doc5["visitors"] = 345878;
|
||||
doc5["rating"] = 3.8;
|
||||
doc5["trackingFrom"] = 2000;
|
||||
|
||||
ASSERT_TRUE(coll1->add(doc1.dump()).ok());
|
||||
ASSERT_TRUE(coll1->add(doc2.dump()).ok());
|
||||
ASSERT_TRUE(coll1->add(doc3.dump()).ok());
|
||||
ASSERT_TRUE(coll1->add(doc4.dump()).ok());
|
||||
ASSERT_TRUE(coll1->add(doc5.dump()).ok());
|
||||
|
||||
auto result = coll1->search("Karnataka", {"state"},
|
||||
"", {"visitors(Busy:[0, 200000], VeryBusy:[200000, 500000])"},
|
||||
{}, {2}, 10,
|
||||
1, FREQUENCY, {true},
|
||||
10, spp::sparse_hash_set<std::string>(),
|
||||
spp::sparse_hash_set<std::string>(), 10, "", 30, 4, "", 10, {}, {}, {}, 0,
|
||||
"<mark>", "</mark>", {}, 1000,
|
||||
true, false, true, "", true);
|
||||
if(!result.ok()) {
|
||||
LOG(INFO) << result.error();
|
||||
}
|
||||
|
||||
auto results = result.get();
|
||||
|
||||
ASSERT_EQ(1, results["facet_counts"][0]["counts"].size());
|
||||
ASSERT_EQ(2, (int) results["facet_counts"][0]["counts"][0]["count"]);
|
||||
ASSERT_EQ("VeryBusy", results["facet_counts"][0]["counts"][0]["value"].get<std::string>());
|
||||
|
||||
//apply group_by
|
||||
result = coll1->search("*", {"state"},
|
||||
"", {"visitors(Busy:[0, 200000], VeryBusy:[200000, 500000])"},
|
||||
{}, {2}, 10,
|
||||
1, FREQUENCY, {true},
|
||||
10, spp::sparse_hash_set<std::string>(),
|
||||
spp::sparse_hash_set<std::string>(), 10, "",
|
||||
30, 4, "", 10,
|
||||
{}, {}, {"rating"}, 10,"<mark>",
|
||||
"</mark>", {}, 1000,true,
|
||||
false, true, "", true);
|
||||
|
||||
if(!result.ok()) {
|
||||
LOG(INFO) << result.error();
|
||||
}
|
||||
|
||||
results = result.get();
|
||||
|
||||
ASSERT_EQ(2, results["facet_counts"][0]["counts"].size());
|
||||
ASSERT_EQ(2, (int) results["facet_counts"][0]["counts"][0]["count"]);
|
||||
ASSERT_EQ("VeryBusy", results["facet_counts"][0]["counts"][0]["value"].get<std::string>());
|
||||
ASSERT_EQ(1, (int) results["facet_counts"][0]["counts"][1]["count"]);
|
||||
ASSERT_EQ("Busy", results["facet_counts"][0]["counts"][1]["value"].get<std::string>());
|
||||
|
||||
ASSERT_EQ(2, results["grouped_hits"].size());
|
||||
|
||||
ASSERT_EQ(2, results["grouped_hits"][0]["hits"].size());
|
||||
ASSERT_EQ(3.8, results["grouped_hits"][0]["group_key"][0]);
|
||||
|
||||
ASSERT_EQ(3, results["grouped_hits"][1]["hits"].size());
|
||||
ASSERT_EQ(4.5, results["grouped_hits"][1]["group_key"][0]);
|
||||
|
||||
collectionManager.drop_collection("coll1");
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user