Merge pull request #1230 from krunal1313/nested_facet_parent

separate out parent field from value
This commit is contained in:
Kishore Nallan 2023-09-19 14:57:17 +05:30 committed by GitHub
commit c82fed3938
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 22 deletions

View File

@ -404,7 +404,7 @@ public:
bool facet_value_to_string(const facet &a_facet, const facet_count_t &facet_count, const nlohmann::json &document,
std::string &value) const;
std::string get_facet_parent(const std::string& facet_field_name, const nlohmann::json& document) const;
nlohmann::json get_facet_parent(const std::string& facet_field_name, const nlohmann::json& document) const;
static void populate_result_kvs(Topster *topster, std::vector<std::vector<KV *>> &result_kvs,
const spp::sparse_hash_map<uint64_t, uint32_t>& groups_processed,

View File

@ -687,6 +687,7 @@ struct facet_value_t {
std::string highlighted;
uint32_t count;
int64_t sort_field_val;
nlohmann::json parent;
};
struct facet_hash_values_t {

View File

@ -2336,7 +2336,7 @@ Option<nlohmann::json> Collection::search(std::string raw_query,
// remap facet value hash with actual string
auto & facet_count = facet_counts[fi];
std::string value;
nlohmann::json document;
nlohmann::json document, parent;
if(should_fetch_doc_from_store) {
const std::string &seq_id_key = get_seq_id_key((uint32_t) facet_count.doc_id);
@ -2360,7 +2360,7 @@ Option<nlohmann::json> Collection::search(std::string raw_query,
}
if(the_field.nested && should_return_parent) {
value = get_facet_parent(the_field.name, document);
parent = get_facet_parent(the_field.name, document);
}
std::unordered_map<std::string, size_t> ftoken_pos;
@ -2433,7 +2433,8 @@ Option<nlohmann::json> Collection::search(std::string raw_query,
highlightedss << value[i];
i++;
}
facet_value_t facet_value = {value, highlightedss.str(), facet_count.count, facet_count.sort_field_val};
facet_value_t facet_value = {value, highlightedss.str(), facet_count.count,
facet_count.sort_field_val, parent};
facet_values.emplace_back(facet_value);
}
}
@ -2469,6 +2470,10 @@ Option<nlohmann::json> Collection::search(std::string raw_query,
facet_value_count["value"] = value;
facet_value_count["highlighted"] = facet_count.highlighted;
facet_value_count["count"] = facet_count.count;
if(!facet_count.parent.empty()) {
facet_value_count["parent"] = facet_count.parent;
}
facet_result["counts"].push_back(facet_value_count);
}
@ -3076,7 +3081,7 @@ bool Collection::facet_value_to_string(const facet &a_facet, const facet_count_t
return true;
}
std::string Collection::get_facet_parent(const std::string& facet_field_name, const nlohmann::json& document) const {
nlohmann::json Collection::get_facet_parent(const std::string& facet_field_name, const nlohmann::json& document) const {
std::vector<std::string> tokens;
StringUtils::split(facet_field_name, tokens, ".");
std::vector<nlohmann::json> level_docs;
@ -3103,7 +3108,7 @@ std::string Collection::get_facet_parent(const std::string& facet_field_name, co
if(!parent_found) {
doc = level_docs[0]; //return the top most root
}
return doc.dump();
return doc;
}
bool Collection::is_nested_array(const nlohmann::json& obj, std::vector<std::string> path_parts, size_t part_i) const {

View File

@ -1777,8 +1777,10 @@ TEST_F(CollectionFacetingTest, FacetingReturnParent) {
auto results = search_op.get();
ASSERT_EQ(1, results["facet_counts"].size());
ASSERT_EQ(2, results["facet_counts"][0]["counts"].size());
ASSERT_EQ("{\"b\":0,\"color\":\"red\",\"g\":0,\"r\":255}", results["facet_counts"][0]["counts"][0]["value"]);
ASSERT_EQ("{\"b\":255,\"color\":\"blue\",\"g\":0,\"r\":0}", results["facet_counts"][0]["counts"][1]["value"]);
ASSERT_EQ("{\"b\":0,\"color\":\"red\",\"g\":0,\"r\":255}", results["facet_counts"][0]["counts"][0]["parent"].dump());
ASSERT_EQ("red", results["facet_counts"][0]["counts"][0]["value"]);
ASSERT_EQ("{\"b\":255,\"color\":\"blue\",\"g\":0,\"r\":0}", results["facet_counts"][0]["counts"][1]["parent"].dump());
ASSERT_EQ("blue", results["facet_counts"][0]["counts"][1]["value"]);
//not passing facet_fields in facet_return_parent list will only return facet value, not immediate parent for those field
search_op = coll1->search("*", {},"", {"value.color"},
@ -1833,8 +1835,10 @@ TEST_F(CollectionFacetingTest, FacetingReturnParent) {
ASSERT_EQ("blue", results["facet_counts"][0]["counts"][1]["value"]);
ASSERT_EQ(2, results["facet_counts"][1]["counts"].size());
ASSERT_EQ("{\"b\":0,\"color\":\"red\",\"g\":0,\"r\":255}", results["facet_counts"][1]["counts"][0]["value"]);
ASSERT_EQ("{\"b\":255,\"color\":\"blue\",\"g\":0,\"r\":0}", results["facet_counts"][1]["counts"][1]["value"]);
ASSERT_EQ("{\"b\":255,\"color\":\"blue\",\"g\":0,\"r\":0}", results["facet_counts"][1]["counts"][0]["parent"].dump());
ASSERT_EQ("0", results["facet_counts"][1]["counts"][0]["value"]);
ASSERT_EQ("{\"b\":0,\"color\":\"red\",\"g\":0,\"r\":255}", results["facet_counts"][1]["counts"][1]["parent"].dump());
ASSERT_EQ("255", results["facet_counts"][1]["counts"][1]["value"]);
}
TEST_F(CollectionFacetingTest, FacetingReturnParentDeepNested) {
@ -1897,8 +1901,10 @@ TEST_F(CollectionFacetingTest, FacetingReturnParentDeepNested) {
auto results = search_op.get();
ASSERT_EQ(1, results["facet_counts"].size());
ASSERT_EQ(2, results["facet_counts"][0]["counts"].size());
ASSERT_EQ("{\"specification\":{\"detail\":{\"width\":30}}}", results["facet_counts"][0]["counts"][0]["value"]);
ASSERT_EQ("{\"specification\":{\"detail\":{\"width\":25}}}", results["facet_counts"][0]["counts"][1]["value"]);
ASSERT_EQ("{\"specification\":{\"detail\":{\"width\":30}}}", results["facet_counts"][0]["counts"][0]["parent"].dump());
ASSERT_EQ("30", results["facet_counts"][0]["counts"][0]["value"]);
ASSERT_EQ("{\"specification\":{\"detail\":{\"width\":25}}}", results["facet_counts"][0]["counts"][1]["parent"].dump());
ASSERT_EQ("25", results["facet_counts"][0]["counts"][1]["value"]);
}
TEST_F(CollectionFacetingTest, FacetingReturnParentObject) {
@ -1959,8 +1965,10 @@ TEST_F(CollectionFacetingTest, FacetingReturnParentObject) {
auto results = search_op.get();
ASSERT_EQ(1, results["facet_counts"].size());
ASSERT_EQ(2, results["facet_counts"][0]["counts"].size());
ASSERT_EQ("{\"b\":0,\"color\":\"red\",\"g\":0,\"r\":255}", results["facet_counts"][0]["counts"][0]["value"]);
ASSERT_EQ("{\"b\":255,\"color\":\"blue\",\"g\":0,\"r\":0}", results["facet_counts"][0]["counts"][1]["value"]);
ASSERT_EQ("{\"b\":0,\"color\":\"red\",\"g\":0,\"r\":255}", results["facet_counts"][0]["counts"][0]["parent"].dump());
ASSERT_EQ("red", results["facet_counts"][0]["counts"][0]["value"]);
ASSERT_EQ("{\"b\":255,\"color\":\"blue\",\"g\":0,\"r\":0}", results["facet_counts"][0]["counts"][1]["parent"].dump());
ASSERT_EQ("blue", results["facet_counts"][0]["counts"][1]["value"]);
}

View File

@ -1503,8 +1503,10 @@ TEST_F(CollectionOptimizedFacetingTest, FacetingReturnParent) {
auto results = search_op.get();
ASSERT_EQ(1, results["facet_counts"].size());
ASSERT_EQ(2, results["facet_counts"][0]["counts"].size());
ASSERT_EQ("{\"b\":0,\"color\":\"red\",\"g\":0,\"r\":255}", results["facet_counts"][0]["counts"][0]["value"]);
ASSERT_EQ("{\"b\":255,\"color\":\"blue\",\"g\":0,\"r\":0}", results["facet_counts"][0]["counts"][1]["value"]);
ASSERT_EQ("{\"b\":0,\"color\":\"red\",\"g\":0,\"r\":255}", results["facet_counts"][0]["counts"][0]["parent"].dump());
ASSERT_EQ("red", results["facet_counts"][0]["counts"][0]["value"]);
ASSERT_EQ("{\"b\":255,\"color\":\"blue\",\"g\":0,\"r\":0}", results["facet_counts"][0]["counts"][1]["parent"].dump());
ASSERT_EQ("blue", results["facet_counts"][0]["counts"][1]["value"]);
//not passing facet_fields in facet_return_parent list will only return facet value, not immediate parent for those field
search_op = coll1->search("*", {},"", {"value.color"},
@ -1559,8 +1561,10 @@ TEST_F(CollectionOptimizedFacetingTest, FacetingReturnParent) {
ASSERT_EQ("blue", results["facet_counts"][0]["counts"][1]["value"]);
ASSERT_EQ(2, results["facet_counts"][1]["counts"].size());
ASSERT_EQ("{\"b\":0,\"color\":\"red\",\"g\":0,\"r\":255}", results["facet_counts"][1]["counts"][0]["value"]);
ASSERT_EQ("{\"b\":255,\"color\":\"blue\",\"g\":0,\"r\":0}", results["facet_counts"][1]["counts"][1]["value"]);
ASSERT_EQ("{\"b\":255,\"color\":\"blue\",\"g\":0,\"r\":0}", results["facet_counts"][1]["counts"][0]["parent"].dump());
ASSERT_EQ("0", results["facet_counts"][1]["counts"][0]["value"]);
ASSERT_EQ("{\"b\":0,\"color\":\"red\",\"g\":0,\"r\":255}", results["facet_counts"][1]["counts"][1]["parent"].dump());
ASSERT_EQ("255", results["facet_counts"][1]["counts"][1]["value"]);
}
TEST_F(CollectionOptimizedFacetingTest, FacetingReturnParentDeepNested) {
@ -1623,8 +1627,10 @@ TEST_F(CollectionOptimizedFacetingTest, FacetingReturnParentDeepNested) {
auto results = search_op.get();
ASSERT_EQ(1, results["facet_counts"].size());
ASSERT_EQ(2, results["facet_counts"][0]["counts"].size());
ASSERT_EQ("{\"specification\":{\"detail\":{\"width\":30}}}", results["facet_counts"][0]["counts"][0]["value"]);
ASSERT_EQ("{\"specification\":{\"detail\":{\"width\":25}}}", results["facet_counts"][0]["counts"][1]["value"]);
ASSERT_EQ("{\"specification\":{\"detail\":{\"width\":30}}}", results["facet_counts"][0]["counts"][0]["parent"].dump());
ASSERT_EQ("30", results["facet_counts"][0]["counts"][0]["value"]);
ASSERT_EQ("{\"specification\":{\"detail\":{\"width\":25}}}", results["facet_counts"][0]["counts"][1]["parent"].dump());
ASSERT_EQ("25", results["facet_counts"][0]["counts"][1]["value"]);
}
TEST_F(CollectionOptimizedFacetingTest, FacetingReturnParentObject) {
@ -1685,8 +1691,10 @@ TEST_F(CollectionOptimizedFacetingTest, FacetingReturnParentObject) {
auto results = search_op.get();
ASSERT_EQ(1, results["facet_counts"].size());
ASSERT_EQ(2, results["facet_counts"][0]["counts"].size());
ASSERT_EQ("{\"b\":0,\"color\":\"red\",\"g\":0,\"r\":255}", results["facet_counts"][0]["counts"][0]["value"]);
ASSERT_EQ("{\"b\":255,\"color\":\"blue\",\"g\":0,\"r\":0}", results["facet_counts"][0]["counts"][1]["value"]);
ASSERT_EQ("{\"b\":0,\"color\":\"red\",\"g\":0,\"r\":255}", results["facet_counts"][0]["counts"][0]["parent"].dump());
ASSERT_EQ("red", results["facet_counts"][0]["counts"][0]["value"]);
ASSERT_EQ("{\"b\":255,\"color\":\"blue\",\"g\":0,\"r\":0}", results["facet_counts"][0]["counts"][1]["parent"].dump());
ASSERT_EQ("blue", results["facet_counts"][0]["counts"][1]["value"]);
}
TEST_F(CollectionOptimizedFacetingTest, FacetSortByAlpha) {