protected Optional<RowDataPredicate> castOperator(CallExpression call) {
    List<ResolvedExpression> resolvedChildren = call.getResolvedChildren();
    Optional<RowDataPredicate> leftPredicate = resolvedChildren.get(0).accept(this);
    if (resolvedChildren.size() != 2) {
      throw new IllegalArgumentException(
          String.format(
              "cast operator's children expressions should be 2. call expression: %s", call));
    }
    if (resolvedChildren.get(1) instanceof TypeLiteralExpression) {
      Class<?> type = resolvedChildren.get(1).getOutputDataType().getConversionClass();
      Serializable se = (Serializable) type.cast(leftPredicate.get().parameters()[0]);
      return Optional.of(new RowDataPredicate(new Serializable[] {se}));
    }
    throw new IllegalArgumentException(
        String.format(
            "cast operator's children expressions should be 2. call expression: %s", 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