public Expression visit()

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);
  }