예제 #1
0
  public static boolean visit(SQLEvalVisitor visitor, SQLBinaryOpExpr x) {
    SQLExpr left = x.getLeft();
    SQLExpr right = x.getRight();

    left.accept(visitor);
    if (!left.getAttributes().containsKey(EVAL_VALUE)) {
      return false;
    }

    right.accept(visitor);
    if (!right.getAttributes().containsKey(EVAL_VALUE)) {
      return false;
    }

    Object value = null;
    switch (x.getOperator()) {
      case Add:
        value = add(left.getAttribute(EVAL_VALUE), right.getAttributes().get(EVAL_VALUE));
        x.putAttribute(EVAL_VALUE, value);
        break;
      case Subtract:
        value = sub(left.getAttribute(EVAL_VALUE), right.getAttributes().get(EVAL_VALUE));
        x.putAttribute(EVAL_VALUE, value);
        break;
      case Multiply:
        value = multi(left.getAttribute(EVAL_VALUE), right.getAttributes().get(EVAL_VALUE));
        x.putAttribute(EVAL_VALUE, value);
        break;
      case Divide:
        value = div(left.getAttribute(EVAL_VALUE), right.getAttributes().get(EVAL_VALUE));
        x.putAttribute(EVAL_VALUE, value);
        break;
      case GreaterThan:
        value = gt(left.getAttribute(EVAL_VALUE), right.getAttributes().get(EVAL_VALUE));
        x.putAttribute(EVAL_VALUE, value);
        break;
      case GreaterThanOrEqual:
        value = gteq(left.getAttribute(EVAL_VALUE), right.getAttributes().get(EVAL_VALUE));
        x.putAttribute(EVAL_VALUE, value);
        break;
      case LessThan:
        value = lt(left.getAttribute(EVAL_VALUE), right.getAttributes().get(EVAL_VALUE));
        x.putAttribute(EVAL_VALUE, value);
        break;
      case LessThanOrEqual:
        value = lteq(left.getAttribute(EVAL_VALUE), right.getAttributes().get(EVAL_VALUE));
        x.putAttribute(EVAL_VALUE, value);
        break;
      case Is:
        value = eq(left.getAttribute(EVAL_VALUE), right.getAttributes().get(EVAL_VALUE));
        x.putAttribute(EVAL_VALUE, value);
        break;
      case IsNot:
        value = !eq(left.getAttribute(EVAL_VALUE), right.getAttributes().get(EVAL_VALUE));
        x.putAttribute(EVAL_VALUE, value);
        break;
      case RegExp:
      case RLike:
        {
          String pattern = _string(right.getAttributes().get(EVAL_VALUE));
          String input = _string(left.getAttributes().get(EVAL_VALUE));
          boolean matchResult = Pattern.matches(pattern, input);
          x.putAttribute(EVAL_VALUE, matchResult);
        }
        break;
      case NotRegExp:
      case NotRLike:
        {
          String pattern = _string(right.getAttributes().get(EVAL_VALUE));
          String input = _string(left.getAttributes().get(EVAL_VALUE));
          boolean matchResult = !Pattern.matches(pattern, input);
          x.putAttribute(EVAL_VALUE, matchResult);
        }
        break;
      default:
        break;
    }

    return false;
  }