mirror of
https://github.com/typesense/typesense.git
synced 2025-05-20 21:52:23 +08:00
update facet sort syntax
This commit is contained in:
parent
28613a0135
commit
a969053361
@ -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";
|
||||
}
|
||||
}
|
||||
|
@ -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()) {
|
||||
|
@ -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()) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user