public static ObjectFilter simplify(ObjectFilter filter) { if (filter == null) { return null; } if (filter instanceof AndFilter) { List<ObjectFilter> conditions = ((AndFilter) filter).getConditions(); AndFilter simplifiedFilter = ((AndFilter) filter).cloneEmpty(); for (ObjectFilter subfilter : conditions) { if (subfilter instanceof NoneFilter) { // AND with "false" return NoneFilter.createNone(); } else if (subfilter instanceof AllFilter) { // AND with "true", just skip it } else { ObjectFilter simplifiedSubfilter = simplify(subfilter); simplifiedFilter.addCondition(simplifiedSubfilter); } } if (simplifiedFilter.isEmpty()) { return AllFilter.createAll(); } return simplifiedFilter; } else if (filter instanceof OrFilter) { List<ObjectFilter> conditions = ((OrFilter) filter).getConditions(); OrFilter simplifiedFilter = ((OrFilter) filter).cloneEmpty(); for (ObjectFilter subfilter : conditions) { if (subfilter instanceof NoneFilter) { // OR with "false", just skip it } else if (subfilter instanceof AllFilter) { // OR with "true" return AllFilter.createAll(); } else { ObjectFilter simplifiedSubfilter = simplify(subfilter); simplifiedFilter.addCondition(simplifiedSubfilter); } } if (simplifiedFilter.isEmpty()) { return AllFilter.createAll(); } return simplifiedFilter; } else if (filter instanceof NotFilter) { ObjectFilter subfilter = ((NotFilter) filter).getFilter(); ObjectFilter simplifiedSubfilter = simplify(subfilter); if (subfilter instanceof NoneFilter) { return AllFilter.createAll(); } else if (subfilter instanceof AllFilter) { return NoneFilter.createNone(); } else { NotFilter simplifiedFilter = ((NotFilter) filter).cloneEmpty(); simplifiedFilter.setFilter(simplifiedSubfilter); return simplifiedFilter; } } else { // Cannot simplify return filter.clone(); } }