update facet sort syntax

This commit is contained in:
krunal 2023-09-07 15:43:58 +05:30
parent 28613a0135
commit a969053361
3 changed files with 34 additions and 26 deletions

View File

@ -4855,6 +4855,7 @@ bool Collection::get_enable_nested_fields() {
Option<bool> Collection::parse_facet(const std::string& facet_field, std::vector<facet>& facets) const {
const std::regex base_pattern(".+\\(.*\\)");
const std::regex range_pattern("[[a-zA-Z]+:\\[([0-9]+)\\,\\s*([0-9]+)\\]");
const std::string _alphanumeric = "_alphanumeric";
if ((facet_field.find(":") != std::string::npos)
&& (facet_field.find("sort") == std::string::npos)) { //range based facet
@ -5023,9 +5024,16 @@ Option<bool> Collection::parse_facet(const std::string& facet_field, std::vector
return Option<bool>(404, error);
}
if (facet_field.find("sort") != std::string::npos) { //sort params are supplied with facet
pos = facet_field.find("sort_field");
if(pos == std::string::npos) { //alpha sort
if (facet_field.find("sort_by") != std::string::npos) { //sort params are supplied with facet
std::vector<std::string> tokens;
StringUtils::split(facet_field, tokens, ":");
if(tokens.size() != 3) {
std::string error = "Invalid sort format.";
return Option<bool>(400, error);
}
if(tokens[1] == _alphanumeric) {
const field &a_field = search_schema.at(facet_field_copy);
if (!a_field.is_string()) {
std::string error = "Facet field should be string type to apply alpha sort.";
@ -5033,9 +5041,7 @@ Option<bool> Collection::parse_facet(const std::string& facet_field, std::vector
}
sort_alpha = true;
} else { //sort_field based sort
auto sort_field_fixed_len = strlen("sort_field:");
auto sort_field_len = facet_field.size() - pos - sort_field_fixed_len - 1;
sort_field = facet_field.substr(pos + sort_field_fixed_len, sort_field_len);
sort_field = tokens[1];
if (search_schema.count(sort_field) == 0 || !search_schema.at(sort_field).facet) {
std::string error = "Could not find a facet field named `" + sort_field + "` in the schema.";
@ -5049,9 +5055,9 @@ Option<bool> Collection::parse_facet(const std::string& facet_field, std::vector
}
}
if (facet_field.find("asc") != std::string::npos) {
if (tokens[2].find("asc") != std::string::npos) {
order = "asc";
} else if (facet_field.find("desc") != std::string::npos) {
} else if (tokens[2].find("desc") != std::string::npos) {
order = "desc";
}
}

View File

@ -2023,7 +2023,7 @@ TEST_F(CollectionFacetingTest, FacetSortByAlpha) {
ASSERT_TRUE(add_op.ok());
//sort facets by phone in asc order
auto search_op = coll1->search("*", {}, "", {"phone(sort:asc)"},
auto search_op = coll1->search("*", {}, "", {"phone(sort_by:_alphanumeric:asc)"},
{}, {2});
if (!search_op.ok()) {
@ -2043,7 +2043,7 @@ TEST_F(CollectionFacetingTest, FacetSortByAlpha) {
ASSERT_EQ("Z6 Lite", results["facet_counts"][0]["counts"][6]["value"]);
//sort facets by brand in desc order
search_op = coll1->search("*", {}, "", {"brand(sort:desc)"},
search_op = coll1->search("*", {}, "", {"brand(sort_by:_alphanumeric:desc)"},
{}, {2});
if (!search_op.ok()) {
@ -2063,7 +2063,8 @@ TEST_F(CollectionFacetingTest, FacetSortByAlpha) {
ASSERT_EQ("Iqoo", results["facet_counts"][0]["counts"][6]["value"]);
//sort facets by brand in desc order and phone by asc order
search_op = coll1->search("*", {}, "", {"brand(sort:desc)", "phone(sort:asc)"},
search_op = coll1->search("*", {}, "", {"brand(sort_by:_alphanumeric:desc)",
"phone(sort_by:_alphanumeric:asc)"},
{}, {2});
if (!search_op.ok()) {
@ -2093,7 +2094,7 @@ TEST_F(CollectionFacetingTest, FacetSortByAlpha) {
ASSERT_EQ("Z6 Lite", results["facet_counts"][1]["counts"][6]["value"]);
//try sort on non string field
search_op = coll1->search("*", {}, "", {"rating(sort:desc)"},
search_op = coll1->search("*", {}, "", {"rating(sort_by:_alphanumeric:desc)"},
{}, {2});
ASSERT_EQ(400, search_op.code());
@ -2170,7 +2171,7 @@ TEST_F(CollectionFacetingTest, FacetSortByOtherField) {
//search by calories in asc order
auto search_op = coll1->search("*", {},"",
{"receipe.name(sort:asc, sort_field:receipe.calories)"},
{"receipe.name(sort_by:receipe.calories:asc)"},
{}, {2});
if(!search_op.ok()) {
@ -2189,7 +2190,7 @@ TEST_F(CollectionFacetingTest, FacetSortByOtherField) {
//search by calories in desc order
search_op = coll1->search("*", {},"",
{"receipe.name(sort:desc, sort_field:receipe.calories)"},
{"receipe.name(sort_by:receipe.calories:desc)"},
{}, {2});
if(!search_op.ok()) {
@ -2207,7 +2208,7 @@ TEST_F(CollectionFacetingTest, FacetSortByOtherField) {
ASSERT_EQ("schezwan rice", results["facet_counts"][0]["counts"][4]["value"]);
//try sort by stirng field
search_op = coll1->search("*", {}, "", {"receipe.name(sort:desc, sort_field:receipe.origin)"},
search_op = coll1->search("*", {}, "", {"receipe.name(sort_by:receipe.origin:desc)"},
{}, {2});
ASSERT_EQ(400, search_op.code());
@ -2284,7 +2285,7 @@ TEST_F(CollectionFacetingTest, FacetSortByOtherFloatField) {
//search by calories in asc order
auto search_op = coll1->search("*", {},"",
{"investment.name(sort:asc, sort_field:investment.interest_rate)"},
{"investment.name(sort_by:investment.interest_rate:asc)"},
{}, {2});
if(!search_op.ok()) {
@ -2303,7 +2304,7 @@ TEST_F(CollectionFacetingTest, FacetSortByOtherFloatField) {
//search by calories in desc order
search_op = coll1->search("*", {},"",
{"investment.name(sort:desc, sort_field:investment.interest_rate)"},
{"investment.name(sort_by:investment.interest_rate:desc)"},
{}, {2});
if(!search_op.ok()) {

View File

@ -1501,7 +1501,7 @@ TEST_F(CollectionOptimizedFacetingTest, FacetSortByAlpha) {
ASSERT_TRUE(add_op.ok());
//sort facets by phone in asc order
auto search_op = coll1->search("*", {}, "", {"phone(sort:asc)"},
auto search_op = coll1->search("*", {}, "", {"phone(sort_by:_alphanumeric:asc)"},
{}, {2});
if (!search_op.ok()) {
@ -1521,7 +1521,7 @@ TEST_F(CollectionOptimizedFacetingTest, FacetSortByAlpha) {
ASSERT_EQ("Z6 Lite", results["facet_counts"][0]["counts"][6]["value"]);
//sort facets by brand in desc order
search_op = coll1->search("*", {}, "", {"brand(sort:desc)"},
search_op = coll1->search("*", {}, "", {"brand(sort_by:_alphanumeric:desc)"},
{}, {2});
if (!search_op.ok()) {
@ -1541,7 +1541,8 @@ TEST_F(CollectionOptimizedFacetingTest, FacetSortByAlpha) {
ASSERT_EQ("Iqoo", results["facet_counts"][0]["counts"][6]["value"]);
//sort facets by brand in desc order and phone by asc order
search_op = coll1->search("*", {}, "", {"brand(sort:desc)", "phone(sort:asc)"},
search_op = coll1->search("*", {}, "", {"brand(sort_by:_alphanumeric:desc)",
"phone(sort_by:_alphanumeric:asc)"},
{}, {2});
if (!search_op.ok()) {
@ -1571,7 +1572,7 @@ TEST_F(CollectionOptimizedFacetingTest, FacetSortByAlpha) {
ASSERT_EQ("Z6 Lite", results["facet_counts"][1]["counts"][6]["value"]);
//try sort on non string field
search_op = coll1->search("*", {}, "", {"rating(sort:desc)"},
search_op = coll1->search("*", {}, "", {"rating(sort_by:_alphanumeric:desc)"},
{}, {2});
ASSERT_EQ(400, search_op.code());
@ -1648,7 +1649,7 @@ TEST_F(CollectionOptimizedFacetingTest, FacetSortByOtherField) {
//search by calories in asc order
auto search_op = coll1->search("*", {},"",
{"receipe.name(sort:asc, sort_field:receipe.calories)"},
{"receipe.name(sort_by:receipe.calories:asc)"},
{}, {2});
if(!search_op.ok()) {
@ -1667,7 +1668,7 @@ TEST_F(CollectionOptimizedFacetingTest, FacetSortByOtherField) {
//search by calories in desc order
search_op = coll1->search("*", {},"",
{"receipe.name(sort:desc, sort_field:receipe.calories)"},
{"receipe.name(sort_by:receipe.calories:desc)"},
{}, {2});
if(!search_op.ok()) {
@ -1685,7 +1686,7 @@ TEST_F(CollectionOptimizedFacetingTest, FacetSortByOtherField) {
ASSERT_EQ("schezwan rice", results["facet_counts"][0]["counts"][4]["value"]);
//try sort by stirng field
search_op = coll1->search("*", {}, "", {"receipe.name(sort:desc, sort_field:receipe.origin)"},
search_op = coll1->search("*", {}, "", {"receipe.name(sort_by:receipe.origin:desc)"},
{}, {2});
ASSERT_EQ(400, search_op.code());
@ -1762,7 +1763,7 @@ TEST_F(CollectionOptimizedFacetingTest, FacetSortByOtherFloatField) {
//search by calories in asc order
auto search_op = coll1->search("*", {},"",
{"investment.name(sort:asc, sort_field:investment.interest_rate)"},
{"investment.name(sort_by:investment.interest_rate:asc)"},
{}, {2});
if(!search_op.ok()) {
@ -1781,7 +1782,7 @@ TEST_F(CollectionOptimizedFacetingTest, FacetSortByOtherFloatField) {
//search by calories in desc order
search_op = coll1->search("*", {},"",
{"investment.name(sort:desc, sort_field:investment.interest_rate)"},
{"investment.name(sort_by:investment.interest_rate:desc)"},
{}, {2});
if(!search_op.ok()) {