alibaba/QLExpress

希望能支持方法重载,这样有利于同一类功能的方法定义在一起。

Open

#418 opened on Dec 22, 2025

View on GitHub
 (1 comment) (1 reaction) (0 assignees)Java (1,113 forks)batch import
help wanted

Repository metrics

Stars
 (4,457 stars)
PR merge metrics
 (Avg merge 17d) (4 merged PRs in 30d)

Description

希望能支持方法重载,这样有利于同一类功能的方法直接定义在一起。比如

public final class DateFunction {

  @QLFunction("date")
  public static LocalDate date() {
    return LocalDate.now();
  }


  @QLFunction("date")
  public static LocalDate date(final String value) {
    if (value == null) {
      throw new IllegalArgumentException("date() function value parameter cannot be null");
    }
    return LocalDate.parse(value);
  }


  @QLFunction("date")
  public static LocalDate date(final String value, final String format) {
    if (value == null) {
      throw new IllegalArgumentException("date() function parameter value cannot be null");
    }
    if (format == null) {
      throw new IllegalArgumentException("date() function parameter format cannot be null");
    }
    return LocalDate.parse(value, DateTimeFormatter.ofPattern(format));
  }
}

目前只能通过CustomFunction去间接处理,特别不方便,而且这样函数定义不够简洁。比如现在只能这样去定义

/**
 * date()
 * date(string)
 * date(string, format)
 *
 * @author zxuanhong
 * @date 2025-11-11 10:22
 * @since
 */
public class DateFunction implements CustomFunction {
  @Override
  public Object call(final QContext qContext, final Parameters parameters) throws Throwable {
    return switch (parameters.size()) {
      case 0 -> LocalDate.now();
      case 1 -> format(parameters.getValue(0), null);
      case 2 -> format(parameters.getValue(0), parameters.getValue(1));
      default -> null;
    };
  }


  private LocalDate format(final Object value, final Object format) {
    if (format == null) {
      return null;
    }
    final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format.toString());
    return format(value, formatter);
  }


  private LocalDate format(final Object value, final DateTimeFormatter formatter) {
    if (value == null) {
      return null;
    }
    if (formatter == null) {
      return LocalDate.parse(value.toString());
    }
    return LocalDate.parse(value.toString(), formatter);
  }
}

Contributor guide