From 045a39f2b5b44f6a16e8889364be066fd5e62ae9 Mon Sep 17 00:00:00 2001 From: krunal Date: Tue, 19 Sep 2023 12:44:34 +0530 Subject: [PATCH] separate out parent field from value --- include/field.h | 1 + src/collection.cpp | 11 +++++++--- test/collection_faceting_test.cpp | 24 ++++++++++++++------- test/collection_optimized_faceting_test.cpp | 24 ++++++++++++++------- 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/include/field.h b/include/field.h index e8fcd1e7..f080459f 100644 --- a/include/field.h +++ b/include/field.h @@ -687,6 +687,7 @@ struct facet_value_t { std::string highlighted; uint32_t count; int64_t sort_field_val; + std::string parent; }; struct facet_hash_values_t { diff --git a/src/collection.cpp b/src/collection.cpp index 08aa02f3..fd931758 100644 --- a/src/collection.cpp +++ b/src/collection.cpp @@ -2335,7 +2335,7 @@ Option Collection::search(std::string raw_query, for(size_t fi = 0; fi < max_facets; fi++) { // remap facet value hash with actual string auto & facet_count = facet_counts[fi]; - std::string value; + std::string value, parent; nlohmann::json document; if(should_fetch_doc_from_store) { @@ -2360,7 +2360,7 @@ Option 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 ftoken_pos; @@ -2433,7 +2433,8 @@ Option 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 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); } diff --git a/test/collection_faceting_test.cpp b/test/collection_faceting_test.cpp index 213c5821..7252d246 100644 --- a/test/collection_faceting_test.cpp +++ b/test/collection_faceting_test.cpp @@ -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"]); + 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"]); + 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"]); + 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"]); + 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"]); + ASSERT_EQ("30", results["facet_counts"][0]["counts"][0]["value"]); + ASSERT_EQ("{\"specification\":{\"detail\":{\"width\":25}}}", results["facet_counts"][0]["counts"][1]["parent"]); + 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"]); + 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"]); + ASSERT_EQ("blue", results["facet_counts"][0]["counts"][1]["value"]); } diff --git a/test/collection_optimized_faceting_test.cpp b/test/collection_optimized_faceting_test.cpp index 41b7753e..c1358e24 100644 --- a/test/collection_optimized_faceting_test.cpp +++ b/test/collection_optimized_faceting_test.cpp @@ -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"]); + 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"]); + 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"]); + 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"]); + 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"]); + ASSERT_EQ("30", results["facet_counts"][0]["counts"][0]["value"]); + ASSERT_EQ("{\"specification\":{\"detail\":{\"width\":25}}}", results["facet_counts"][0]["counts"][1]["parent"]); + 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"]); + 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"]); + ASSERT_EQ("blue", results["facet_counts"][0]["counts"][1]["value"]); } TEST_F(CollectionOptimizedFacetingTest, FacetSortByAlpha) {