package gov.nysenate.openleg.model.entity; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.TreeMultimap; import gov.nysenate.openleg.model.base.SessionYear; import java.util.Collection; import java.util.NavigableSet; import java.util.Optional; import java.util.TreeSet; /** * A member with session members for each session the member was active */ public class FullMember extends Member { /** Map of session year to this member's session member aliases for the given year */ protected final TreeMultimap<SessionYear, SessionMember> sessionMemberMap = TreeMultimap.create(); public FullMember(Collection<SessionMember> sessionMembers) { super(sessionMembers.stream().max(SessionMember::compareTo).orElse(null)); sessionMembers.stream() .peek(sm -> { if (sm.memberId != this.memberId) { throw new IllegalArgumentException("All supplied session members must have the same member id"); } }) .forEach(sm -> sessionMemberMap.put(sm.getSessionYear(), sm)); } /** --- Functional Getters / Setters --- */ /** * @return Optional<SessionMember> this session member's most recent, primary session member */ public Optional<SessionMember> getLatestSessionMember() { return sessionMemberMap.keySet().stream() .max(SessionYear::compareTo) .flatMap(this::getSessionMemberForYear); } /** * @param year SessionYear * @return This member's primary session member for the given year */ public Optional<SessionMember> getSessionMemberForYear(SessionYear year) { return getSessionMembersForYear(year).stream().max(SessionMember::compareTo); } /** * @param year SessionYear * @return NavigableSet<SessionMember> - all of this member's session aliases for the given year * returns an empty set if this member was not active on the given year */ public NavigableSet<SessionMember> getSessionMembersForYear(SessionYear year) { return Optional.ofNullable(sessionMemberMap.get(year)) .orElse(new TreeSet<>()); } /** * @return ImmutableMultimap<SessionYear, SessionMember> * an immutable copy of the session member map */ public ImmutableMultimap<SessionYear, SessionMember> getSessionMemberMap() { return ImmutableMultimap.copyOf(sessionMemberMap); } }