darrachequesne / spring-data-jpa-datatables

Spring Data JPA extension to work with the great jQuery plugin DataTables (https://datatables.net/)
Apache License 2.0
440 stars 174 forks source link

Add support for the SearchBuilder extension #134

Open darrachequesne opened 2 years ago

darrachequesne commented 2 years ago

Reference: https://datatables.net/extensions/searchbuilder/

We will need to handle the additional query parameters (which can be nested):

searchBuilder.criteria[0].condition             =
searchBuilder.criteria[0].data              Firstname
searchBuilder.criteria[0].origData              firstName
searchBuilder.criteria[0].type              string
searchBuilder.criteria[0].value[]           john
searchBuilder.criteria[0].value1            john
searchBuilder.criteria[1].criteria[0].condition     starts
searchBuilder.criteria[1].criteria[0].data          Lastname
searchBuilder.criteria[1].criteria[0].origData      lastName
searchBuilder.criteria[1].criteria[0].type          string
searchBuilder.criteria[1].criteria[0].value[]       do
searchBuilder.criteria[1].criteria[0].value1        do
searchBuilder.criteria[1].criteria[1].condition     null
searchBuilder.criteria[1].criteria[1].data          Lastname
searchBuilder.criteria[1].criteria[1].origData      lastName
searchBuilder.criteria[1].criteria[1].type          string
searchBuilder.criteria[1].logic             OR
searchBuilder.logic                 AND

Contribution is welcome!

Praytic commented 2 years ago

Hi @darrachequesne , I have read the documentation for the SearchBuilder, but I'm still not completely sure how it should be applied on the server-side. Could you give some hints?

Praytic commented 2 years ago

I have an idea of creating multiple enums which are mapped to specific CriteriaBuilder methods. Do you think it will be a good design decision?

Praytic commented 2 years ago

For example:

@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Criteria {
    private Condition condition;
    private String data;
    private String origData;
    private String type;
    private List<String> value;
    private String logic;
    private List<Criteria> criteria;

    public <T> Predicate notEmpty(Root<T> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
        return criteriaBuilder.equal(criteriaBuilder.length(root.get(origData)), 0);
    }
}

And condition enum will look like that:

public enum Condition {
  NOT_EMPTY("!null", (builder) -> builder::notEmpty);

  private String key;
  private Function<Criteria, Specification> predicate;

  Condition(String key, Function<Criteria, Specification> predicate) {
      this.key = key;
      this.predicate = predicate;
  }
}
KrunchMuffin commented 1 year ago

I would be willing to throw in $100 to get this working