spring-data-jpa-datatables icon indicating copy to clipboard operation
spring-data-jpa-datatables copied to clipboard

Add support for the SearchBuilder extension

Open darrachequesne opened this issue 3 years ago • 4 comments

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!

darrachequesne avatar Oct 03 '21 21:10 darrachequesne

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 avatar Oct 07 '21 10:10 Praytic

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 avatar Oct 07 '21 11:10 Praytic

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

Praytic avatar Oct 07 '21 12:10 Praytic

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

KrunchMuffin avatar Nov 11 '22 12:11 KrunchMuffin