package tc.oc.pgm.filters.operator;
import tc.oc.pgm.filters.Filter;
import tc.oc.pgm.filters.FilterTypeException;
import tc.oc.pgm.filters.query.IQuery;
import static tc.oc.commons.core.exception.LambdaExceptionUtils.rethrowConsumer;
/**
* A {@link MultiFilterFunction} supporting dynamics.
*
* Filters extending this class have the extra constraint that
* they must respond to any query type that all of their child
* filters respond to, unless there are no child filters, in
* which case {@link #respondsTo(Class)} and {@link #isDynamic()}
* always return false.
*
* TODO: It would be better if the exception for empty children was
* not necessary, but for backwards compatibility, the logical
* filter operators abstain if they are empty.
*/
public abstract class AggregateFilter extends MultiFilterFunction {
public AggregateFilter(Iterable<? extends Filter> filters) {
super(filters);
}
@Override
public boolean respondsTo(Class<? extends IQuery> queryType) {
return !filters.isEmpty() &&
filters.stream().allMatch(f -> f.respondsTo(queryType));
}
@Override
public void assertRespondsTo(Class<? extends IQuery> queryType) throws FilterTypeException {
if(filters.isEmpty()) {
throw new FilterTypeException(this, queryType);
}
filters.forEach(rethrowConsumer(f -> f.assertRespondsTo(queryType)));
}
@Override
public boolean isDynamic() {
return !filters.isEmpty();
}
}