package tc.oc.pgm.filters.operator; import java.util.Optional; import tc.oc.pgm.filters.matcher.TypedFilter; import tc.oc.pgm.filters.matcher.party.CompetitorFilter; import tc.oc.pgm.filters.query.IMatchQuery; import tc.oc.pgm.teams.TeamFactory; import tc.oc.pgm.teams.TeamMatchModule; /** * Adapts a {@link CompetitorFilter}, which depends on the party in the query, * into a filter with an explicit {@link TeamFactory} that can respond to any * {@link IMatchQuery}. * * The team can also be omitted, in which case this delegates to * {@link CompetitorFilter#matchesAny(IMatchQuery)}. * * Note that this is not a {@link SingleFilterFunction}, because it is (currently) * entirely transparent to the user. That is, it cannot be created directly * through XML, it is only used to implement other filters. * * As a future enhancement, we could potentially allow it to be created directly, * which might look something like this: * * <team team="red-team"> * <score>5</score> * </team> */ public class TeamFilterAdapter extends TypedFilter.Impl<IMatchQuery> { private final @Inspect Optional<TeamFactory> team; private final @Inspect CompetitorFilter filter; public TeamFilterAdapter(Optional<TeamFactory> team, CompetitorFilter filter) { this.team = team; this.filter = filter; } @Override public String toString() { return inspect(); } @Override public boolean isDynamic() { return filter.isDynamic(); } @Override public boolean matches(IMatchQuery query) { return team.isPresent() ? query.module(TeamMatchModule.class) .map(tmm -> filter.matches(query, tmm.team(team.get()))) .orElse(false) : filter.matchesAny(query); } }