mirror of
				https://github.com/meilisearch/meilisearch.git
				synced 2025-11-04 01:46:28 +00:00 
			
		
		
		
	introduce the reserved keywords in the filters
This commit is contained in:
		@@ -595,6 +595,18 @@ fn field_id(
 | 
			
		||||
) -> StdResult<Option<FieldId>, PestError<Rule>> {
 | 
			
		||||
    // lexing ensures that we at least have a key
 | 
			
		||||
    let key = items.next().unwrap();
 | 
			
		||||
    if key.as_rule() == Rule::reserved {
 | 
			
		||||
        return Err(PestError::new_from_span(
 | 
			
		||||
            ErrorVariant::CustomError {
 | 
			
		||||
                message: format!(
 | 
			
		||||
                    "`{}` is a reserved keyword and thus can't be used as a filter expression. Available filterable attributes are: {}",
 | 
			
		||||
                    key.as_str(),
 | 
			
		||||
                    filterable_fields.iter().join(", "),
 | 
			
		||||
                ),
 | 
			
		||||
            },
 | 
			
		||||
            key.as_span(),
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if !filterable_fields.contains(key.as_str()) {
 | 
			
		||||
        return Err(PestError::new_from_span(
 | 
			
		||||
@@ -671,6 +683,13 @@ mod tests {
 | 
			
		||||
        let condition = FilterCondition::from_str(&rtxn, &index, "NOT channel = ponce").unwrap();
 | 
			
		||||
        let expected = Operator(0, Operator::NotEqual(None, S("ponce")));
 | 
			
		||||
        assert_eq!(condition, expected);
 | 
			
		||||
 | 
			
		||||
        let result = FilterCondition::from_str(&rtxn, &index, "_geo = France");
 | 
			
		||||
        assert!(result.is_err());
 | 
			
		||||
        let error = result.unwrap_err();
 | 
			
		||||
        assert!(error.to_string().contains(
 | 
			
		||||
            "`_geo` is a reserved keyword and thus can't be used as a filter expression."
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
key = _{quoted | word}
 | 
			
		||||
value = _{quoted | word}
 | 
			
		||||
key = _{reserved | quoted | word }
 | 
			
		||||
value = _{quoted | word }
 | 
			
		||||
quoted = _{ (PUSH("'") | PUSH("\"")) ~ string ~ POP  }
 | 
			
		||||
string = {char*}
 | 
			
		||||
word = ${(LETTER | NUMBER | "_" | "-" | ".")+}
 | 
			
		||||
@@ -8,8 +8,9 @@ char =  _{ !(PEEK | "\\") ~ ANY
 | 
			
		||||
    | "\\" ~ (PEEK | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
 | 
			
		||||
    | "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})}
 | 
			
		||||
 | 
			
		||||
reserved = { "_geo" | "_geoDistance" | "_geoPoint" | ("_geoPoint" ~ parameters) }
 | 
			
		||||
// we deliberately choose to allow empty parameters to generate more specific error message later
 | 
			
		||||
parameters ={("(" ~ (value ~ ",")* ~ value? ~ ")") | ""}
 | 
			
		||||
parameters = {("(" ~ (value ~ ",")* ~ value? ~ ")") | ""}
 | 
			
		||||
condition = _{between | eq | greater | less | geq | leq | neq}
 | 
			
		||||
between = {key ~ value ~ "TO" ~ value}
 | 
			
		||||
geq = {key ~ ">=" ~ value}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user