package tc.oc.pgm.filters.operator;
import java.util.List;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import tc.oc.commons.core.IterableUtils;
import tc.oc.pgm.filters.Filter;
import tc.oc.pgm.filters.matcher.StaticFilter;
import tc.oc.pgm.filters.query.IQuery;
/**
* Returns the result of the first child filter that does not abstain
*/
public class ChainFilter extends MultiFilterFunction {
public ChainFilter(Iterable<? extends Filter> filters) {
super(filters);
}
public static Filter forward(List<? extends Filter> filters) {
return IterableUtils.<Filter>unify(filters, StaticFilter.ABSTAIN, ChainFilter::new);
}
/**
* Return a reversed chain, so later filters have priority over earlier ones
*/
public static Filter reverse(List<? extends Filter> filters) {
return IterableUtils.<Filter>unify(filters, StaticFilter.ABSTAIN, multi -> new ChainFilter(Lists.reverse(ImmutableList.copyOf(multi))));
}
@Override
public boolean respondsTo(Class<? extends IQuery> queryType) {
return false;
}
@Override
public QueryResponse query(IQuery query) {
for(Filter filter : filters) {
final QueryResponse response = filter.query(query);
if(response.isPresent()) return response;
}
return QueryResponse.ABSTAIN;
}
}