Form a dynamic and flexible request POJO for AG Grid server side filtering

Viewed 275

I'm trying to implement AG Grid server-side filter and sort using Spring Boot by following the steps given in AG Grid Documentation.

Currently, I have the filter request POJO as given below:

FilterRequest.java
-------------------
@Getter
@Setter
public class FilterRequest implements Serializable {    
    private static final long serialVersionUID = 1L;    
    private int startRow;    
    private int endRow;    
    private Map<String, ColumnFilter> filterModel;    
    private List<SortModel> sortModel;

    public FilterRequest() {
        this.filterModel = emptyMap();
        this.sortModel = emptyList();
    }
}

ColumnFilter.java
------------------
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "filterType")
@JsonSubTypes({
    @JsonSubTypes.Type(value = NumberColumnFilter.class, name = "number")
})
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
public abstract class ColumnFilter implements Serializable {    
    private static final long serialVersionUID = 1L;    
    String filterType;
}

NumberColumnFilter.java
------------------------
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
public class NumberColumnFilter extends ColumnFilter {    
    private static final long serialVersionUID = 1L;    
    private String type;    
    private Integer filter;    
    private Integer filterTo;    
}

The request JSON looks as below:

{
    "startRow": 0,
    "endRow": 10,
    "filterModel": {
        "age": {
            "filterType": "number",
            "type": "greaterThan",
            "filter": "23",
            "filterTo": ""
        },
        "year": {
            "filterType": "number",
            "type": "equals",
            "filter": "2008",
            "filterTo": ""
        }
    },
    "sortModel": [
        {
            "colId": "year",
            "sort": "asc"
        }
    ]
}

This works fine!

But now I want to add one more filter on column age. And the request JSON should be as below:

{
  "startRow": 0,
  "endRow": 10,
  "filterModel": {
    "age": {
      "condition1": {
        "type": "greaterThan",
        "filter": 23,
        "filterTo": null,
        "filterType": "number"
      },
      "condition2": {
        "type": "inRange",
        "filter": 25,
        "filterTo": 30,
        "filterType": "number"
      },
      "operator": "OR"
    },
    "year": {
      "type": "equals",
      "filter": 2020,
      "filterTo": null,
      "filterType": "number"
    },
    "column3": {
      "type": "equals",
      "filter": 17,
      "filterTo": null,
      "filterType": "number"
    },
    "column4": {
      "condition1": {
        "type": "lessThan",
        "filter": 30,
        "filterTo": null,
        "filterType": "number"
      },
      "condition2": {
        "type": "greaterThan",
        "filter": 25,
        "filterTo": null,
        "filterType": "number"
      },
      "operator": "AND"
    }
  }
  "sortModel": []
}

As we can see here, the column filter is quite dynamic and flexible.

I tried modifying the FilterRequest.java and writing a wrapper on top of ColumnFilter to support this dynamic and flexible column filter, but it doesn't work.

Here is the updated request object:

FilterRequest.java
-------------------
@Getter
@Setter
public class FilterRequest implements Serializable {
    private static final long serialVersionUID = 1L;
    private int startRow;
    private int endRow;
    private Map<String, FilterModel> filterModel;
    private List<SortModel> sortModel;

    public FilterRequest() {
        this.filterModel = emptyMap();
        this.sortModel = emptyList();
    }
}

FilterModel.java
-----------------
@NoArgsConstructor
public abstract class FilterModel implements Serializable {
    private static final long serialVersionUID = 1L;
}

PartialFilterModel.java
------------------------
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
public class PartialFilterModel extends FilterModel {
    private static final long serialVersionUID = 1L;
    private ColumnFilter columnFilter;
}

CompleteFilterModel.java
-------------------------
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
public class CompleteFilterModel extends FilterModel {
    private static final long serialVersionUID = 1L;
    private ColumnFilter condition1;
    private ColumnFilter condition2;
    private String operator;
}

ColumnFilter.java
------------------
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "filterType")
@JsonSubTypes({
    @JsonSubTypes.Type(value = NumberColumnFilter.class, name = "number")
})
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
public abstract class ColumnFilter implements Serializable {
    private static final long serialVersionUID = 1L;
    String filterType;
}

NumberColumnFilter.java
------------------------
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
public class NumberColumnFilter extends ColumnFilter {
    private static final long serialVersionUID = 1L;
    private String type;
    private Integer filter;
    private Integer filterTo;
}

Can anyone let me know what's the best way to support two different column filters?

0 Answers
Related