in src/main/java/net/hydromatic/linq4j/expressions/OptimizeVisitor.java [218:268]
private Expression visit0(
BinaryExpression binary,
Expression expression0,
Expression expression1) {
Boolean always;
switch (binary.getNodeType()) {
case AndAlso:
always = always(expression0);
if (always != null) {
return always
? expression1
: FALSE_EXPR;
}
break;
case OrElse:
always = always(expression0);
if (always != null) {
// true or x --> true
// false or x --> x
return always
? TRUE_EXPR
: expression1;
}
break;
case Equal:
if (isConstantNull(expression1)
&& Primitive.is(expression0.getType())) {
return FALSE_EXPR;
}
// a == true -> a
// a == false -> !a
always = always(expression0);
if (always != null) {
return always ? expression1 : Expressions.not(expression1);
}
break;
case NotEqual:
if (isConstantNull(expression1)
&& Primitive.is(expression0.getType())) {
return TRUE_EXPR;
}
// a != true -> !a
// a != false -> a
always = always(expression0);
if (always != null) {
return always ? Expressions.not(expression1) : expression1;
}
break;
}
return null;
}