Skip to content

Commit

Permalink
Enforcing "NOT" and "-" queries consistency in UserInputAst
Browse files Browse the repository at this point in the history
  • Loading branch information
bazhenov committed Oct 9, 2022
1 parent 5f565e7 commit 5c24487
Showing 1 changed file with 25 additions and 0 deletions.
25 changes: 25 additions & 0 deletions query-grammar/src/query_grammar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,25 @@ pub fn parse_to_ast<'a>() -> impl Parser<&'a str, Output = UserInputAst> {
spaces()
.with(optional(ast()).skip(eof()))
.map(|opt_ast| opt_ast.unwrap_or_else(UserInputAst::empty_query))
.map(|ast| rewrite_ast(ast))
}

/// Removes unnecessary children clauses in AST
///
/// Motivated by [issue #1433](https://github.com/quickwit-oss/tantivy/issues/1433)
fn rewrite_ast(input: UserInputAst) -> UserInputAst {
if let UserInputAst::Clause(terms) = input {
UserInputAst::Clause(terms.into_iter().map(rewrite_ast_clause).collect())
} else {
input
}
}

fn rewrite_ast_clause(input: (Option<Occur>, UserInputAst)) -> (Option<Occur>, UserInputAst) {
match input {
(None, UserInputAst::Clause(mut clauses)) if clauses.len() == 1 => clauses.remove(0),
other => other,
}
}

#[cfg(test)]
Expand Down Expand Up @@ -749,4 +768,10 @@ mod test {
test_parse_query_to_ast_helper("foo:\"a b\"~300", "\"foo\":\"a b\"~300");
test_parse_query_to_ast_helper("\"a b\"~300^2", "(\"a b\"~300)^2");
}

#[test]
fn test_not_queries_are_consistent() {
test_parse_query_to_ast_helper("tata -toto", "(*\"tata\" -\"toto\")");
test_parse_query_to_ast_helper("tata NOT toto", "(*\"tata\" -\"toto\")");
}
}

0 comments on commit 5c24487

Please sign in to comment.