Skip to content

Commit

Permalink
[SPARK-7142] [SQL] Minor enhancement to BooleanSimplification Optimiz…
Browse files Browse the repository at this point in the history
…er rule

Use these in the optimizer as well:

            A and (not(A) or B) => A and B
            not(A and B) => not(A) or not(B)
            not(A or B) => not(A) and not(B)

Author: Yash Datta <[email protected]>

Closes #5700 from saucam/bool_simp.
  • Loading branch information
Yash Datta authored and marmbrus committed Sep 10, 2015
1 parent 4f1daa1 commit f892d92
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,11 @@ object BooleanSimplification extends Rule[LogicalPlan] with PredicateHelper {
case (_, Literal(false, BooleanType)) => Literal(false)
// a && a => a
case (l, r) if l fastEquals r => l
// a && (not(a) || b) => a && b
case (l, Or(l1, r)) if (Not(l) fastEquals l1) => And(l, r)
case (l, Or(r, l1)) if (Not(l) fastEquals l1) => And(l, r)
case (Or(l, l1), r) if (l1 fastEquals Not(r)) => And(l, r)
case (Or(l1, l), r) if (l1 fastEquals Not(r)) => And(l, r)
// (a || b) && (a || c) => a || (b && c)
case _ =>
// 1. Split left and right to get the disjunctive predicates,
Expand Down Expand Up @@ -512,6 +517,10 @@ object BooleanSimplification extends Rule[LogicalPlan] with PredicateHelper {
case LessThan(l, r) => GreaterThanOrEqual(l, r)
// not(l <= r) => l > r
case LessThanOrEqual(l, r) => GreaterThan(l, r)
// not(l || r) => not(l) && not(r)
case Or(l, r) => And(Not(l), Not(r))
// not(l && r) => not(l) or not(r)
case And(l, r) => Or(Not(l), Not(r))
// not(not(e)) => e
case Not(e) => e
case _ => not
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,22 @@ class BooleanSimplificationSuite extends PlanTest with PredicateHelper {
('a === 'b || 'b > 3 && 'a > 3 && 'a < 5))
}

test("a && (!a || b)") {
checkCondition(('a && (!('a) || 'b )), ('a && 'b))

checkCondition(('a && ('b || !('a) )), ('a && 'b))

checkCondition(((!('a) || 'b ) && 'a), ('b && 'a))

checkCondition((('b || !('a) ) && 'a), ('b && 'a))
}

test("!(a && b) , !(a || b)") {
checkCondition((!('a && 'b)), (!('a) || !('b)))

checkCondition(!('a || 'b), (!('a) && !('b)))
}

private val caseInsensitiveAnalyzer =
new Analyzer(EmptyCatalog, EmptyFunctionRegistry, new SimpleCatalystConf(false))

Expand Down

0 comments on commit f892d92

Please sign in to comment.