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