18
18
package org .apache .spark .sql .catalyst .optimizer
19
19
20
20
import scala .collection .immutable .HashSet
21
-
22
21
import org .apache .spark .sql .catalyst .expressions ._
23
22
import org .apache .spark .sql .catalyst .plans .Inner
24
23
import org .apache .spark .sql .catalyst .plans .FullOuter
@@ -313,19 +312,20 @@ object BooleanSimplification extends Rule[LogicalPlan] with PredicateHelper {
313
312
// a && a => a
314
313
case (l, r) if l fastEquals r => l
315
314
case (_, _) =>
316
- // (a && b && c && ...) || (a && b && d && ...) || (a && b && e && ...) ... =>
317
- // a && b && ((c && ...) || (d && ...) || (e && ...) || ...)
318
315
val lhsSet = splitDisjunctivePredicates(left).toSet
319
316
val rhsSet = splitDisjunctivePredicates(right).toSet
320
317
val common = lhsSet.intersect(rhsSet)
321
318
val ldiff = lhsSet.diff(common)
322
319
val rdiff = rhsSet.diff(common)
323
-
324
320
if (common.size == 0 ) {
321
+ // a && b
325
322
and
326
323
}else if (ldiff.size == 0 || rdiff.size == 0 ) {
324
+ // a && (a || b)
327
325
common.reduce(Or )
328
326
} else {
327
+ // (a || b || c || ...) && (a || b || d || ...) && (a || b || e || ...) ... =>
328
+ // (a || b) || ((c || ...) && (f || ...) && (e || ...) && ...)
329
329
(ldiff.reduceOption(Or ) ++ rdiff.reduceOption(Or ))
330
330
.reduceOption(And )
331
331
.map(_ :: common.toList)
@@ -343,18 +343,20 @@ object BooleanSimplification extends Rule[LogicalPlan] with PredicateHelper {
343
343
// a || a => a
344
344
case (l, r) if l fastEquals r => l
345
345
case (_, _) =>
346
- // (a || b || c || ...) && (a || b || d || ...) && (a || b || e || ...) ... =>
347
- // (a || b) || ((c || ...) && (f || ...) && (e || ...) && ...)
348
346
val lhsSet = splitConjunctivePredicates(left).toSet
349
347
val rhsSet = splitConjunctivePredicates(right).toSet
350
348
val common = lhsSet.intersect(rhsSet)
351
349
val ldiff = lhsSet.diff(common)
352
350
val rdiff = rhsSet.diff(common)
353
351
if (common.size == 0 ) {
352
+ // a || b
354
353
or
355
354
}else if ( ldiff.size == 0 || rdiff.size == 0 ) {
355
+ // a || (b && a)
356
356
common.reduce(And )
357
357
} else {
358
+ // (a && b && c && ...) || (a && b && d && ...) || (a && b && e && ...) ... =>
359
+ // a && b && ((c && ...) || (d && ...) || (e && ...) || ...)
358
360
(ldiff.reduceOption(And ) ++ rdiff.reduceOption(And ))
359
361
.reduceOption(Or )
360
362
.map(_ :: common.toList)
0 commit comments