@@ -228,7 +228,8 @@ case class InSet(child: Expression, hset: Set[Any]) extends UnaryExpression with
228228 }
229229}
230230
231- case class And (left : Expression , right : Expression ) extends BinaryOperator with Predicate {
231+ case class And (left : Expression , right : Expression ) extends BinaryOperator
232+ with Predicate with PredicateHelper {
232233
233234 override def inputType : AbstractDataType = BooleanType
234235
@@ -256,10 +257,12 @@ case class And(left: Expression, right: Expression) extends BinaryOperator with
256257 // Non-deterministic expressions cannot be semantic equal
257258 if (! deterministic || ! other.deterministic) return false
258259
259- // we know both expressions are And, so we can tolerate ordering different
260- val elements1 = splitConjunctivePredicates(this ).toSet.toSeq
261- val elements2 = splitConjunctivePredicates(other).toSet.toSeq
262- checkSemantic(elements1, elements2)
260+ // We already know both expressions are And, so we can tolerate ordering different
261+ // Recursively call semanticEquals on subexpressions to check the equivalency of two seqs.
262+ var elements1 = splitConjunctivePredicates(this )
263+ val elements2 = splitConjunctivePredicates(other)
264+ for (e <- elements2) elements1 = removeFirstSemanticEquivalent(elements1, e)
265+ elements1.isEmpty
263266 }
264267
265268 override def genCode (ctx : CodeGenContext , ev : GeneratedExpressionCode ): String = {
@@ -287,7 +290,8 @@ case class And(left: Expression, right: Expression) extends BinaryOperator with
287290}
288291
289292
290- case class Or (left : Expression , right : Expression ) extends BinaryOperator with Predicate {
293+ case class Or (left : Expression , right : Expression ) extends BinaryOperator
294+ with Predicate with PredicateHelper {
291295
292296 override def inputType : AbstractDataType = BooleanType
293297
@@ -316,9 +320,11 @@ case class Or(left: Expression, right: Expression) extends BinaryOperator with P
316320 if (! deterministic || ! other.deterministic) return false
317321
318322 // we know both expressions are Or, so we can tolerate ordering different
319- val elements1 = splitDisjunctivePredicates(this ).toSet.toSeq
320- val elements2 = splitDisjunctivePredicates(other).toSet.toSeq
321- checkSemantic(elements1, elements2)
323+ // Recursively call semanticEquals on subexpressions to check the equivalency of two seqs.
324+ var elements1 = splitDisjunctivePredicates(this )
325+ val elements2 = splitDisjunctivePredicates(other)
326+ for (e <- elements2) elements1 = removeFirstSemanticEquivalent(elements1, e)
327+ elements1.isEmpty
322328 }
323329
324330 override def genCode (ctx : CodeGenContext , ev : GeneratedExpressionCode ): String = {
0 commit comments