in src/main/java/net/hydromatic/linq4j/expressions/OptimizeVisitor.java [271:303]
public Expression visit(UnaryExpression unaryExpression,
Expression expression) {
switch (unaryExpression.getNodeType()) {
case Convert:
if (expression.getType() == unaryExpression.getType()) {
return expression;
}
if (expression instanceof ConstantExpression) {
return Expressions.constant(((ConstantExpression) expression).value,
unaryExpression.getType());
}
break;
case Not:
Boolean always = always(expression);
if (always != null) {
return always ? FALSE_EXPR : TRUE_EXPR;
}
if (expression instanceof UnaryExpression) {
UnaryExpression arg = (UnaryExpression) expression;
if (arg.getNodeType() == ExpressionType.Not) {
return arg.expression;
}
}
if (expression instanceof BinaryExpression) {
BinaryExpression bin = (BinaryExpression) expression;
ExpressionType comp = NOT_BINARY_COMPLEMENT.get(bin.getNodeType());
if (comp != null) {
return Expressions.makeBinary(comp, bin.expression0, bin.expression1);
}
}
}
return super.visit(unaryExpression, expression);
}