in src/main/java/net/hydromatic/linq4j/expressions/OptimizeVisitor.java [156:216]
public Expression visit(
BinaryExpression binary,
Expression expression0,
Expression expression1) {
//
Expression result;
switch (binary.getNodeType()) {
case AndAlso:
case OrElse:
if (eq(expression0, expression1)) {
return expression0;
}
}
switch (binary.getNodeType()) {
case Equal:
case NotEqual:
if (eq(expression0, expression1)) {
return binary.getNodeType() == Equal ? TRUE_EXPR : FALSE_EXPR;
} else if (expression0 instanceof ConstantExpression && expression1
instanceof ConstantExpression) {
ConstantExpression c0 = (ConstantExpression) expression0;
ConstantExpression c1 = (ConstantExpression) expression1;
if (c0.getType() == c1.getType()
|| !(Primitive.is(c0.getType()) || Primitive.is(c1.getType()))) {
return binary.getNodeType() == NotEqual ? TRUE_EXPR : FALSE_EXPR;
}
}
if (expression0 instanceof TernaryExpression
&& expression0.getNodeType() == ExpressionType.Conditional) {
TernaryExpression ternary = (TernaryExpression) expression0;
Expression expr = null;
if (eq(ternary.expression1, expression1)) {
// (a ? b : c) == b === a || c == b
expr = Expressions.orElse(ternary.expression0,
Expressions.equal(ternary.expression2, expression1));
} else if (eq(ternary.expression2, expression1)) {
// (a ? b : c) == c === !a || b == c
expr = Expressions.orElse(Expressions.not(ternary.expression0),
Expressions.equal(ternary.expression1, expression1));
}
if (expr != null) {
if (binary.getNodeType() == ExpressionType.NotEqual) {
expr = Expressions.not(expr);
}
return expr.accept(this);
}
}
// drop down
case AndAlso:
case OrElse:
result = visit0(binary, expression0, expression1);
if (result != null) {
return result;
}
result = visit0(binary, expression1, expression0);
if (result != null) {
return result;
}
}
return super.visit(binary, expression0, expression1);
}