mirror of
https://github.com/meilisearch/MeiliSearch
synced 2024-12-25 06:00:08 +01:00
WIP: remove '_nom' suffix/redundant error enum/...
This commit is contained in:
parent
2c65781d91
commit
5de5dd80a3
@ -59,9 +59,7 @@ pub enum UserError {
|
|||||||
InvalidDocumentId { document_id: Value },
|
InvalidDocumentId { document_id: Value },
|
||||||
InvalidFacetsDistribution { invalid_facets_name: HashSet<String> },
|
InvalidFacetsDistribution { invalid_facets_name: HashSet<String> },
|
||||||
InvalidGeoField { document_id: Value, object: Value },
|
InvalidGeoField { document_id: Value, object: Value },
|
||||||
InvalidFilterAttributeNom,
|
InvalidFilter { input: String },
|
||||||
InvalidFilterValue,
|
|
||||||
InvalidFilterNom { input: String },
|
|
||||||
InvalidSortName { name: String },
|
InvalidSortName { name: String },
|
||||||
InvalidSortableAttribute { field: String, valid_fields: HashSet<String> },
|
InvalidSortableAttribute { field: String, valid_fields: HashSet<String> },
|
||||||
SortRankingRuleMissing,
|
SortRankingRuleMissing,
|
||||||
@ -209,10 +207,7 @@ impl StdError for InternalError {}
|
|||||||
impl fmt::Display for UserError {
|
impl fmt::Display for UserError {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
//TODO
|
Self::InvalidFilter { input } => write!(f, "parser error {}", input),
|
||||||
Self::InvalidFilterAttributeNom => write!(f, "parser error "),
|
|
||||||
Self::InvalidFilterValue => write!(f, "parser error "),
|
|
||||||
Self::InvalidFilterNom { input } => write!(f, "parser error {}", input),
|
|
||||||
Self::AttributeLimitReached => f.write_str("maximum number of attributes reached"),
|
Self::AttributeLimitReached => f.write_str("maximum number of attributes reached"),
|
||||||
Self::CriterionError(error) => write!(f, "{}", error),
|
Self::CriterionError(error) => write!(f, "{}", error),
|
||||||
Self::DocumentLimitReached => f.write_str("maximum number of documents reached"),
|
Self::DocumentLimitReached => f.write_str("maximum number of documents reached"),
|
||||||
|
@ -90,7 +90,7 @@ impl FilterCondition {
|
|||||||
nom::Err::Failure(x) => x,
|
nom::Err::Failure(x) => x,
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
Err(Error::UserError(UserError::InvalidFilterNom {
|
Err(Error::UserError(UserError::InvalidFilter {
|
||||||
input: convert_error(expression, ve).to_string(),
|
input: convert_error(expression, ve).to_string(),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
@ -56,13 +56,12 @@ pub struct ParseContext<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> ParseContext<'a> {
|
impl<'a> ParseContext<'a> {
|
||||||
fn parse_or_nom<E>(&'a self, input: &'a str) -> IResult<&'a str, FilterCondition, E>
|
fn parse_or<E>(&'a self, input: &'a str) -> IResult<&'a str, FilterCondition, E>
|
||||||
where
|
where
|
||||||
E: ParseError<&'a str> + ContextError<&'a str> + Debug,
|
E: ParseError<&'a str> + ContextError<&'a str> + Debug,
|
||||||
{
|
{
|
||||||
let (input, lhs) = self.parse_and_nom(input)?;
|
let (input, lhs) = self.parse_and(input)?;
|
||||||
let (input, ors) =
|
let (input, ors) = many0(preceded(self.ws(tag("OR")), |c| Self::parse_or(self, c)))(input)?;
|
||||||
many0(preceded(self.ws(tag("OR")), |c| Self::parse_or_nom(self, c)))(input)?;
|
|
||||||
|
|
||||||
let expr = ors
|
let expr = ors
|
||||||
.into_iter()
|
.into_iter()
|
||||||
@ -70,25 +69,20 @@ impl<'a> ParseContext<'a> {
|
|||||||
Ok((input, expr))
|
Ok((input, expr))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_and_nom<E>(&'a self, input: &'a str) -> IResult<&'a str, FilterCondition, E>
|
fn parse_and<E>(&'a self, input: &'a str) -> IResult<&'a str, FilterCondition, E>
|
||||||
where
|
where
|
||||||
E: ParseError<&'a str> + ContextError<&'a str> + Debug,
|
E: ParseError<&'a str> + ContextError<&'a str> + Debug,
|
||||||
{
|
{
|
||||||
let (input, lhs) = self.parse_not_nom(input)?;
|
let (input, lhs) = self.parse_not(input)?;
|
||||||
// let (input, lhs) = alt((
|
|
||||||
// delimited(self.ws(char('(')), |c| Self::parse_not_nom(self, c), self.ws(char(')'))),
|
|
||||||
// |c| self.parse_not_nom(c),
|
|
||||||
// ))(input)?;
|
|
||||||
|
|
||||||
let (input, ors) =
|
let (input, ors) =
|
||||||
many0(preceded(self.ws(tag("AND")), |c| Self::parse_and_nom(self, c)))(input)?;
|
many0(preceded(self.ws(tag("AND")), |c| Self::parse_and(self, c)))(input)?;
|
||||||
let expr = ors
|
let expr = ors
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.fold(lhs, |acc, branch| FilterCondition::And(Box::new(acc), Box::new(branch)));
|
.fold(lhs, |acc, branch| FilterCondition::And(Box::new(acc), Box::new(branch)));
|
||||||
Ok((input, expr))
|
Ok((input, expr))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_not_nom<E>(&'a self, input: &'a str) -> IResult<&'a str, FilterCondition, E>
|
fn parse_not<E>(&'a self, input: &'a str) -> IResult<&'a str, FilterCondition, E>
|
||||||
where
|
where
|
||||||
E: ParseError<&'a str> + ContextError<&'a str> + Debug,
|
E: ParseError<&'a str> + ContextError<&'a str> + Debug,
|
||||||
{
|
{
|
||||||
@ -307,7 +301,7 @@ impl<'a> ParseContext<'a> {
|
|||||||
where
|
where
|
||||||
E: ParseError<&'a str> + ContextError<&'a str> + Debug,
|
E: ParseError<&'a str> + ContextError<&'a str> + Debug,
|
||||||
{
|
{
|
||||||
let a = self.parse_or_nom(input);
|
let a = self.parse_or(input);
|
||||||
a
|
a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
key = _{reserved | quoted | word }
|
|
||||||
value = _{quoted | word }
|
|
||||||
quoted = _{ (PUSH("'") | PUSH("\"")) ~ string ~ POP }
|
|
||||||
string = {char*}
|
|
||||||
word = ${(LETTER | NUMBER | "_" | "-" | ".")+}
|
|
||||||
|
|
||||||
char = _{ !(PEEK | "\\") ~ ANY
|
|
||||||
| "\\" ~ (PEEK | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
|
|
||||||
| "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})}
|
|
||||||
|
|
||||||
reserved = { "_geoDistance" | ("_geoPoint" ~ parameters) | "_geo" }
|
|
||||||
// we deliberately choose to allow empty parameters to generate more specific error message later
|
|
||||||
parameters = {("(" ~ (value ~ ",")* ~ value? ~ ")") | ""}
|
|
||||||
condition = _{between | eq | greater | less | geq | leq | neq}
|
|
||||||
between = {key ~ value ~ "TO" ~ value}
|
|
||||||
geq = {key ~ ">=" ~ value}
|
|
||||||
leq = {key ~ "<=" ~ value}
|
|
||||||
neq = {key ~ "!=" ~ value}
|
|
||||||
eq = {key ~ "=" ~ value}
|
|
||||||
greater = {key ~ ">" ~ value}
|
|
||||||
less = {key ~ "<" ~ value}
|
|
||||||
geo_radius = {"_geoRadius" ~ parameters }
|
|
||||||
|
|
||||||
prgm = {SOI ~ expr ~ EOI}
|
|
||||||
expr = _{ ( term ~ (operation ~ term)* ) }
|
|
||||||
term = { ("(" ~ expr ~ ")") | condition | not | geo_radius }
|
|
||||||
operation = _{ and | or }
|
|
||||||
and = {"AND"}
|
|
||||||
or = {"OR"}
|
|
||||||
|
|
||||||
not = {"NOT" ~ term}
|
|
||||||
|
|
||||||
WHITESPACE = _{ " " }
|
|
Loading…
x
Reference in New Issue
Block a user