// 1. Define the Filter Model
public class CustomNumberFilterModel implements IFilterModel {
private String value; // e.g., "Even", "Odd", or "All"
// getters and setters
}
// 2. Define Filter Parameters
public class CustomNumberFilterParams implements IFilterParams {
private boolean includeNullValues;
// getters and setters
}
// 3. Implement the Filter Logic
public class CustomNumberFilter<T extends Number> extends IFilter<T, CustomNumberFilterModel, CustomNumberFilterParams> {
@Override
public CustomNumberFilterModel recognizeFilterModel(Map<String, Object> map) {
CustomNumberFilterModel model = new CustomNumberFilterModel();
model.setValue(map.get("value").toString());
return model;
}
@Override
public CustomNumberFilterParams getDefaultFilterParams() {
return new CustomNumberFilterParams();
}
@Override
public Predicate toPredicate(CriteriaBuilder cb, Expression<T> expression, CustomNumberFilterModel model) {
String value = model.getValue();
if (value == null || value.equalsIgnoreCase("All")) {
return cb.and(); // Always true
}
Expression<Integer> integerExpression = expression.as(Integer.class);
Predicate predicate;
if (value.equalsIgnoreCase("Even")) {
predicate = cb.equal(cb.mod(integerExpression, 2), 0);
} else {
predicate = cb.notEqual(cb.mod(integerExpression, 2), 0);
}
if (this.filterParams.isIncludeNullValues()) {
predicate = cb.or(predicate, cb.isNull(expression));
}
return predicate;
}
}