/** * Take a criteria, which may be null, a single IPredicateCriteria or a * complex criteria built using ICompoundCriteria and breaks it apart * at ANDs such that a List of ICriteria conjuncts are returned. For * example, ((a=1 OR b=2) AND (c=3 AND d=4)) would return the list * (a=1 OR b=2), c=3, d=4. If criteria is null, an empty list is * returned. * @param criteria Criteria to break, may be null * @return List of ICriteria, never null */ public static final List<Condition> separateCriteriaByAnd(Condition criteria) { if(criteria == null) { return Collections.emptyList(); } List<Condition> parts = new ArrayList<Condition>(); separateCriteria(criteria, parts); return parts; }
/** * Helper method for {@link #separateCriteriaByAnd(Condition)} that * can be called recursively to collect parts. * @param crit Crit to break apart * @param parts List to add parts to */ private static void separateCriteria(Condition crit, List<Condition> parts) { if(crit instanceof AndOr) { AndOr compCrit = (AndOr) crit; if(compCrit.getOperator() == Operator.AND) { separateCriteria(compCrit.getLeftCondition(), parts); separateCriteria(compCrit.getRightCondition(), parts); } else { parts.add(crit); } } else { parts.add(crit); } }