001package com.hammurapi.extract; 002 003import java.util.Collection; 004 005 006/** 007 * Predicate which is a composition of other predicates, e.g. AND or OR operations. 008 * @author Pavel Vlasov. 009 * 010 * @param <T> 011 * @param <PC> Parts collection type. 012 * @param <C> Context type. 013 */ 014public interface CompositePredicate<T, PC extends Collection<Predicate<T, C>>, C, S extends CompositePredicate<T,PC,C,S>> extends Predicate<T, C>, FacadeExtractor<T,Boolean,C>, Mappable<T, Boolean, C>, Cloneable { 015 016 /** 017 * @return Sub-predicates. 018 */ 019 PC getParts(); 020 021 /** 022 * @param part 023 * @return Returns composite predicate of the same type without given part. 024 * If there is one remaining part then this part is returned. 025 */ 026 Predicate<T, C> remove(Predicate<T, C> part); 027 028 /** 029 * Normalizes predicate by removing less restrictive parts in AND or more restrictive parts in OR, 030 * and analyzing if predicate is always TRUE or always FALSE. 031 * @return Normalized predicate, True if predicate always evaluates to true, False if predicate always 032 * evaluates to false. 033 */ 034 Predicate<T, C> normalize(); 035 036 S add(Predicate<T, C> part); 037 038}