Skip to content

Commit

Permalink
Enforcing "NOT" and "-" queries consistency in UserInputAst (#1609)
Browse files Browse the repository at this point in the history
* Enforcing "NOT" and "-" queries consistency in UserInputAst

* Mutable implementation if rewrite_ast_clause()
  • Loading branch information
bazhenov authored May 12, 2023
1 parent 00c5df6 commit e248a49
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions query-grammar/src/query_grammar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,28 @@ 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(rewrite_ast)
}

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

fn rewrite_ast_clause(input: &mut (Option<Occur>, UserInputAst)) {
match input {
(None, UserInputAst::Clause(ref mut clauses)) if clauses.len() == 1 => {
*input = clauses.pop().unwrap(); // safe because clauses.len() == 1
}
_ => {}
}
}

#[cfg(test)]
Expand Down Expand Up @@ -810,4 +832,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 e248a49

Please sign in to comment.