forked from mirrors/jj
revset: remove uninteresting expressions early
Since internalize_filter() should no longer insert redundant 'all() & x' nodes, it's simpler to clean up uninteresting nodes first.
This commit is contained in:
parent
75e072b80c
commit
1eaa05b6fd
1 changed files with 13 additions and 5 deletions
|
@ -1291,8 +1291,8 @@ fn unfold_difference(expression: &Rc<RevsetExpression>) -> Option<Rc<RevsetExpre
|
|||
/// tree.
|
||||
pub fn optimize(expression: Rc<RevsetExpression>) -> Rc<RevsetExpression> {
|
||||
let expression = unfold_difference(&expression).unwrap_or(expression);
|
||||
let expression = internalize_filter(&expression).unwrap_or(expression);
|
||||
let expression = fold_redundant_expression(&expression).unwrap_or(expression);
|
||||
let expression = internalize_filter(&expression).unwrap_or(expression);
|
||||
fold_difference(&expression).unwrap_or(expression)
|
||||
}
|
||||
|
||||
|
@ -2471,11 +2471,12 @@ mod tests {
|
|||
);
|
||||
|
||||
assert_eq!(
|
||||
optimize(parse("present(author(foo) & all())").unwrap()),
|
||||
optimize(parse("present(author(foo) ~ bar)").unwrap()),
|
||||
Rc::new(RevsetExpression::AsFilter(Rc::new(
|
||||
RevsetExpression::Present(RevsetExpression::filter(RevsetFilterPredicate::Author(
|
||||
"foo".to_owned()
|
||||
)))
|
||||
RevsetExpression::Present(
|
||||
RevsetExpression::filter(RevsetFilterPredicate::Author("foo".to_owned()))
|
||||
.minus(&RevsetExpression::symbol("bar".to_owned()))
|
||||
)
|
||||
)))
|
||||
);
|
||||
assert_eq!(
|
||||
|
@ -2596,6 +2597,13 @@ mod tests {
|
|||
"###);
|
||||
|
||||
// Binary difference operation should go through the same optimization passes.
|
||||
insta::assert_debug_snapshot!(optimize(parse("all() ~ foo").unwrap()), @r###"
|
||||
NotIn(
|
||||
Symbol(
|
||||
"foo",
|
||||
),
|
||||
)
|
||||
"###);
|
||||
insta::assert_debug_snapshot!(optimize(parse("foo ~ bar").unwrap()), @r###"
|
||||
Difference(
|
||||
Symbol(
|
||||
|
|
Loading…
Reference in a new issue