package de.jpaw.bonaparte.api; import java.util.List; import de.jpaw.bonaparte.pojos.api.AndFilter; import de.jpaw.bonaparte.pojos.api.FalseFilter; import de.jpaw.bonaparte.pojos.api.IntFilter; import de.jpaw.bonaparte.pojos.api.LongFilter; import de.jpaw.bonaparte.pojos.api.NotFilter; import de.jpaw.bonaparte.pojos.api.OrFilter; import de.jpaw.bonaparte.pojos.api.SearchFilter; import de.jpaw.bonaparte.pojos.api.TrueFilter; import de.jpaw.bonaparte.pojos.api.UnicodeFilter; /** Methods to combine search filters. All methods in this class immediately evaluate logical operations on true or false. */ public class SearchFilters { /** Static instance of true and false. */ public static final SearchFilter TRUE = new TrueFilter(); public static final SearchFilter FALSE = new FalseFilter(); /** Combines two optional filters by AND condition. */ public static SearchFilter and(SearchFilter filter1, SearchFilter filter2) { if (filter1 == null || filter1 instanceof TrueFilter) return filter2; if (filter2 == null || filter2 instanceof TrueFilter) return filter1; if (filter1 instanceof FalseFilter || filter2 instanceof FalseFilter) return FALSE; return new AndFilter(filter1, filter2); } /** Combines two optional filters by OR condition. */ public static SearchFilter or(SearchFilter filter1, SearchFilter filter2) { if (filter1 == null || filter1 instanceof FalseFilter) return filter2; if (filter2 == null || filter2 instanceof FalseFilter) return filter1; if (filter1 instanceof TrueFilter || filter2 instanceof TrueFilter) return TRUE; return new OrFilter(filter1, filter2); } /** Negates a filter. */ public static SearchFilter not(SearchFilter filter) { if (filter == null) return null; if (filter instanceof FalseFilter) return TRUE; if (filter instanceof TrueFilter) return FALSE; return new NotFilter(filter); } /** Combines any number of optional filters by AND condition. */ public static SearchFilter and(List<SearchFilter> filters) { SearchFilter current = null; for (SearchFilter f : filters) current = and(current, f); return current; } /** Combines any number of optional filters by OR condition. */ public static SearchFilter or(List<SearchFilter> filters) { SearchFilter current = null; for (SearchFilter f : filters) current = or(current, f); return current; } // some useful shortcuts (as xtend extension methods) to work around missing default parameters in Java public static IntFilter equalsFilter(String fieldName, Integer value) { IntFilter f = new IntFilter(fieldName); f.setEqualsValue(value); return f; } public static LongFilter equalsFilter(String fieldName, Long value) { LongFilter f = new LongFilter(fieldName); f.setEqualsValue(value); return f; } public static UnicodeFilter equalsFilter(String fieldName, String value) { UnicodeFilter f = new UnicodeFilter(fieldName); f.setEqualsValue(value); return f; } }