mirror of
https://github.com/typesense/typesense.git
synced 2025-05-22 06:40:30 +08:00
update regex and add min max range facets
This commit is contained in:
parent
8581fdd0ba
commit
5ab502127c
@ -4870,7 +4870,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]*[.])?[0-9]+)\\,\\s*([+-]?([0-9]*[.])?[0-9]+)\\]");
|
||||
const std::regex range_pattern("[[a-zA-Z]+:\\[([+-]?([0-9]*[.])?[0-9]*)\\,\\s*([+-]?([0-9]*[.])?[0-9]*)\\]");
|
||||
|
||||
if(facet_field.find(":") != std::string::npos) { //range based facet
|
||||
if(!std::regex_match(facet_field, base_pattern)){
|
||||
@ -4959,14 +4959,47 @@ Option<bool> Collection::parse_facet(const std::string& facet_field, std::vector
|
||||
int64_t lower_range, upper_range;
|
||||
|
||||
if(a_field.is_integer()) {
|
||||
lower_range = std::stoll(range.substr(pos1 + 2, pos2));
|
||||
upper_range = std::stoll(range.substr(pos2 + 1, pos3));
|
||||
} else {
|
||||
float val = std::stof(range.substr(pos1 + 2, pos2));
|
||||
lower_range = Index::float_to_int64_t(val);
|
||||
auto start = pos1 + 2;
|
||||
auto end = pos2 - start;
|
||||
auto lower_range_str = range.substr(start, end);
|
||||
StringUtils::trim(lower_range_str);
|
||||
if(lower_range_str.empty()) {
|
||||
lower_range = INT64_MIN;
|
||||
} else {
|
||||
lower_range = std::stoll(lower_range_str);
|
||||
}
|
||||
|
||||
val = std::stof(range.substr(pos2 + 1, pos3));
|
||||
upper_range = Index::float_to_int64_t(val);
|
||||
start = pos2 + 1;
|
||||
end = pos3 - start;
|
||||
auto upper_range_str = range.substr(start, end);
|
||||
StringUtils::trim(upper_range_str);
|
||||
if(upper_range_str.empty()) {
|
||||
upper_range = INT64_MAX;
|
||||
} else {
|
||||
upper_range = std::stoll(upper_range_str);
|
||||
}
|
||||
} else {
|
||||
auto start = pos1 + 2;
|
||||
auto end = pos2 - start;
|
||||
auto lower_range_str = range.substr(start, end);
|
||||
StringUtils::trim(lower_range_str);
|
||||
if(lower_range_str.empty()) {
|
||||
lower_range = INT64_MIN;
|
||||
} else {
|
||||
float val = std::stof(lower_range_str);
|
||||
lower_range = Index::float_to_int64_t(val);
|
||||
}
|
||||
|
||||
start = pos2 + 1;
|
||||
end = pos3 - start;
|
||||
auto upper_range_str = range.substr(start, end);
|
||||
StringUtils::trim(upper_range_str);
|
||||
if(upper_range_str.empty()) {
|
||||
upper_range = INT64_MAX;
|
||||
} else {
|
||||
float val = std::stof(upper_range_str);
|
||||
upper_range = Index::float_to_int64_t(val);
|
||||
}
|
||||
}
|
||||
|
||||
tupVec.emplace_back(std::make_tuple(lower_range, upper_range, range_val));
|
||||
|
Loading…
x
Reference in New Issue
Block a user