protected Optional<RowDataPredicate> arithmeticOperator(
      RowDataPredicate.Opt arithmeticOpt, CallExpression call) {
    List<ResolvedExpression> resolvedChildren = call.getResolvedChildren();
    Optional<RowDataPredicate> leftPredicate = resolvedChildren.get(0).accept(this);
    Optional<RowDataPredicate> rightPredicate = resolvedChildren.get(1).accept(this);
    Serializable left = leftPredicate.get().parameters()[0];
    Serializable right = rightPredicate.get().parameters()[0];
    if (left instanceof Number && right instanceof Number) {
      Serializable result;
      switch (arithmeticOpt) {
        case MINUS:
          result = ((Number) left).longValue() - ((Number) right).longValue();
          break;
        case TIMES:
          result = ((Number) left).longValue() * ((Number) right).longValue();
          break;
        case PLUS:
          result = ((Number) left).longValue() + ((Number) right).longValue();
          break;
        case DIVIDE:
          result = ((Number) left).longValue() / ((Number) right).longValue();
          break;
        default:
          throw new IllegalArgumentException(
              String.format(
                  "Not supported arithmetic opt: %s, call expression: %s", arithmeticOpt, call));
      }
      return Optional.of(new RowDataPredicate(new Serializable[] {result}));
    }
    throw new IllegalArgumentException(
        String.format(
            "arithmetic operator: %s only supported numerical parameters, call expression: %s",
            arithmeticOpt, call));
  }
Visits a {@link CallExpression} and renders it as a {@link RowDataPredicate}.

@param call the call expression to visit
@return an optional {@link RowDataPredicate}
amoro-format-mixed/amoro-mixed-flink/amoro-mixed-flink-common/src/main/java/org/apache/amoro/flink/lookup/filter/RowDataPredicateExpressionVisitor.java