Skip to content

Commit 1bf3258

Browse files
committed
Avoids converting predicate sets to lists
1 parent e833ca4 commit 1bf3258

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ object BooleanSimplification extends Rule[LogicalPlan] with PredicateHelper {
335335
} else {
336336
// (a || b || c || ...) && (a || b || d || ...) =>
337337
// ((c || ...) && (d || ...)) || a || b
338-
(And(ldiff.reduce(Or), rdiff.reduce(Or)) :: common.toList).reduce(Or)
338+
(common + And(ldiff.reduce(Or), rdiff.reduce(Or))).reduce(Or)
339339
}
340340
}
341341
} // end of And(left, right)
@@ -373,7 +373,7 @@ object BooleanSimplification extends Rule[LogicalPlan] with PredicateHelper {
373373
} else {
374374
// (a && b && c && ...) || (a && b && d && ...) =>
375375
// ((c && ...) || (d && ...)) && a && b
376-
(Or(ldiff.reduce(And), rdiff.reduce(And)) :: common.toList).reduce(And)
376+
(common + Or(ldiff.reduce(And), rdiff.reduce(And))).reduce(And)
377377
}
378378
}
379379
} // end of Or(left, right)

sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/BooleanSimplificationSuite.scala

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
package org.apache.spark.sql.catalyst.optimizer
1919

2020
import org.apache.spark.sql.catalyst.analysis.EliminateAnalysisOperators
21-
import org.apache.spark.sql.catalyst.expressions.{Literal, Expression}
21+
import org.apache.spark.sql.catalyst.expressions.{Or, And, Literal, Expression}
2222
import org.apache.spark.sql.catalyst.plans.logical._
2323
import org.apache.spark.sql.catalyst.plans.PlanTest
2424
import org.apache.spark.sql.catalyst.rules._
@@ -40,11 +40,22 @@ class BooleanSimplificationSuite extends PlanTest {
4040

4141
val testRelation = LocalRelation('a.int, 'b.int, 'c.int, 'd.string)
4242

43-
def checkCondition(originCondition: Expression, optimizedCondition: Expression): Unit = {
44-
val originQuery = testRelation.where(originCondition).analyze
45-
val optimized = Optimize(originQuery)
46-
val expected = testRelation.where(optimizedCondition).analyze
47-
comparePlans(optimized, expected)
43+
def compareConditions(e1: Expression, e2: Expression): Boolean = (e1, e2) match {
44+
case (And(l1, l2), And(r1, r2)) =>
45+
compareConditions(l1, r1) && compareConditions(l2, r2) ||
46+
compareConditions(l1, r2) && compareConditions(l2, r1)
47+
48+
case (Or(l1, l2), Or(r1, r2)) =>
49+
compareConditions(l1, r1) && compareConditions(l2, r2) ||
50+
compareConditions(l1, r2) && compareConditions(l2, r1)
51+
52+
case (l, r) => l == r
53+
}
54+
55+
def checkCondition(input: Expression, expected: Expression): Unit = {
56+
val plan = testRelation.where(input).analyze
57+
val actual = Optimize(plan).expressions.head
58+
compareConditions(actual, expected)
4859
}
4960

5061
test("a && a => a") {

0 commit comments

Comments
 (0)