in src/main/java/net/hydromatic/linq4j/expressions/OptimizeVisitor.java [80:153]
public Expression visit(
TernaryExpression ternary,
Expression expression0,
Expression expression1,
Expression expression2) {
switch (ternary.getNodeType()) {
case Conditional:
Boolean always = always(expression0);
if (always != null) {
// true ? y : z === y
// false ? y : z === z
return always
? expression1
: expression2;
}
if (expression1.equals(expression2)) {
// a ? b : b === b
return expression1;
}
// !a ? b : c == a ? c : b
if (expression0 instanceof UnaryExpression) {
UnaryExpression una = (UnaryExpression) expression0;
if (una.getNodeType() == ExpressionType.Not) {
return Expressions.makeTernary(ternary.getNodeType(),
una.expression, expression2, expression1);
}
}
// a ? true : b === a || b
// a ? false : b === !a && b
always = always(expression1);
if (always != null && isKnownNotNull(expression2)) {
return (always
? Expressions.orElse(expression0, expression2)
: Expressions.andAlso(Expressions.not(expression0),
expression2)).accept(this);
}
// a ? b : true === !a || b
// a ? b : false === a && b
always = always(expression2);
if (always != null && isKnownNotNull(expression1)) {
return (always
? Expressions.orElse(Expressions.not(expression0),
expression1)
: Expressions.andAlso(expression0, expression1)).accept(this);
}
if (expression0 instanceof BinaryExpression
&& (expression0.getNodeType() == ExpressionType.Equal
|| expression0.getNodeType() == ExpressionType.NotEqual)) {
BinaryExpression cmp = (BinaryExpression) expression0;
Expression expr = null;
if (eq(cmp.expression0, expression2)
&& eq(cmp.expression1, expression1)) {
// a == b ? b : a === a (hint: if a==b, then a == b ? a : a)
// a != b ? b : a === b (hint: if a==b, then a != b ? b : b)
expr = expression0.getNodeType() == ExpressionType.Equal
? expression2 : expression1;
}
if (eq(cmp.expression0, expression1)
&& eq(cmp.expression1, expression2)) {
// a == b ? a : b === b (hint: if a==b, then a == b ? b : b)
// a != b ? a : b === a (hint: if a==b, then a == b ? a : a)
expr = expression0.getNodeType() == ExpressionType.Equal
? expression2 : expression1;
}
if (expr != null) {
return expr;
}
}
}
return super.visit(ternary, expression0, expression1, expression2);
}