public static Criteria applyDemorgan(Criteria input) { if (input instanceof NotCriteria) { NotCriteria not = (NotCriteria) input; return not.getCriteria(); } if (!(input instanceof CompoundCriteria)) { return new NotCriteria(input); } CompoundCriteria compCrit = (CompoundCriteria) input; int operator = (compCrit.getOperator() == CompoundCriteria.OR) ? CompoundCriteria.AND : CompoundCriteria.OR; List<Criteria> criteria = new ArrayList<Criteria>(compCrit.getCriteria().size()); for (Criteria crit : compCrit.getCriteria()) { crit = new NotCriteria(crit); criteria.add(crit); } return new CompoundCriteria(operator, criteria); }
/** * Helper method for {@link #separateCriteriaByAnd(Criteria)} that can be called recursively to * collect parts. * * @param crit Crit to break apart * @param parts Collection to add parts to */ private static void separateCriteria(Criteria crit, Collection<Criteria> parts) { if (crit instanceof CompoundCriteria) { CompoundCriteria compCrit = (CompoundCriteria) crit; if (compCrit.getOperator() == CompoundCriteria.AND) { for (Criteria conjunct : compCrit.getCriteria()) { separateCriteria(conjunct, parts); } } else { parts.add(crit); } } else { parts.add(crit); } }
public static Criteria combineCriteria( Criteria primaryCrit, Criteria additionalCrit, boolean disjunctively) { if (primaryCrit == null) { return additionalCrit; } if (additionalCrit == null) { return primaryCrit; } CompoundCriteria compCrit = new CompoundCriteria(); compCrit.setOperator((disjunctively ? CompoundCriteria.OR : CompoundCriteria.AND)); if ((primaryCrit instanceof CompoundCriteria) && ((CompoundCriteria) primaryCrit).getOperator() == (disjunctively ? CompoundCriteria.OR : CompoundCriteria.AND)) { compCrit.getCriteria().addAll(((CompoundCriteria) primaryCrit).getCriteria()); } else { compCrit.addCriteria(primaryCrit); } if ((additionalCrit instanceof CompoundCriteria) && ((CompoundCriteria) additionalCrit).getOperator() == (disjunctively ? CompoundCriteria.OR : CompoundCriteria.AND)) { compCrit.getCriteria().addAll(((CompoundCriteria) additionalCrit).getCriteria()); } else { compCrit.addCriteria(additionalCrit); } return compCrit; }