[SPARK-20350] Add optimization rules to apply Complementation Laws.
## What changes were proposed in this pull request? Apply Complementation Laws during boolean expression simplification. ## How was this patch tested? Tested using unit tests, integration tests, and manual tests. Author: ptkool <michael.styles@shopify.com> Author: Michael Styles <michael.styles@shopify.com> Closes #17650 from ptkool/apply_complementation_laws.
This commit is contained in:
parent
4fea7848c4
commit
63824b2c8e
|
@ -154,6 +154,11 @@ object BooleanSimplification extends Rule[LogicalPlan] with PredicateHelper {
|
|||
case TrueLiteral Or _ => TrueLiteral
|
||||
case _ Or TrueLiteral => TrueLiteral
|
||||
|
||||
case a And b if Not(a).semanticEquals(b) => FalseLiteral
|
||||
case a Or b if Not(a).semanticEquals(b) => TrueLiteral
|
||||
case a And b if a.semanticEquals(Not(b)) => FalseLiteral
|
||||
case a Or b if a.semanticEquals(Not(b)) => TrueLiteral
|
||||
|
||||
case a And b if a.semanticEquals(b) => a
|
||||
case a Or b if a.semanticEquals(b) => a
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@ import org.apache.spark.sql.catalyst.plans.PlanTest
|
|||
import org.apache.spark.sql.catalyst.plans.logical._
|
||||
import org.apache.spark.sql.catalyst.rules._
|
||||
import org.apache.spark.sql.internal.SQLConf
|
||||
import org.apache.spark.sql.Row
|
||||
|
||||
class BooleanSimplificationSuite extends PlanTest with PredicateHelper {
|
||||
|
||||
|
@ -42,6 +43,16 @@ class BooleanSimplificationSuite extends PlanTest with PredicateHelper {
|
|||
|
||||
val testRelation = LocalRelation('a.int, 'b.int, 'c.int, 'd.string)
|
||||
|
||||
val testRelationWithData = LocalRelation.fromExternalRows(
|
||||
testRelation.output, Seq(Row(1, 2, 3, "abc"))
|
||||
)
|
||||
|
||||
private def checkCondition(input: Expression, expected: LogicalPlan): Unit = {
|
||||
val plan = testRelationWithData.where(input).analyze
|
||||
val actual = Optimize.execute(plan)
|
||||
comparePlans(actual, expected)
|
||||
}
|
||||
|
||||
private def checkCondition(input: Expression, expected: Expression): Unit = {
|
||||
val plan = testRelation.where(input).analyze
|
||||
val actual = Optimize.execute(plan)
|
||||
|
@ -160,4 +171,12 @@ class BooleanSimplificationSuite extends PlanTest with PredicateHelper {
|
|||
testRelation.where('a > 2 || ('b > 3 && 'b < 5)))
|
||||
comparePlans(actual, expected)
|
||||
}
|
||||
|
||||
test("Complementation Laws") {
|
||||
checkCondition('a && !'a, testRelation)
|
||||
checkCondition(!'a && 'a, testRelation)
|
||||
|
||||
checkCondition('a || !'a, testRelationWithData)
|
||||
checkCondition(!'a || 'a, testRelationWithData)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue