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?