package crmdna.calling; import crmdna.interaction.InteractionScoreProp; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Created by sathya on 24/7/15. */ public class CallAssignmentHelper { public static CallAssignmentResult assignMembersBasedOnScore(List<InteractionScoreProp> scores, Map<Long, Integer> userIdVsMaxMembers) { if (userIdVsMaxMembers == null) { userIdVsMaxMembers = new HashMap<>(); } //sort list in descending order of scores Collections.sort(scores, new Comparator<InteractionScoreProp>() { @Override public int compare(InteractionScoreProp o1, InteractionScoreProp o2) { return new Integer(o2.interactionScore).compareTo(new Integer(o1.interactionScore)); } }); //iterate through scores and get set of memberIds and userIds Set<Long> memberIds = new HashSet<>(); Set<Long> userIds = new HashSet<>(); for (InteractionScoreProp p : scores) { memberIds.add(p.memberId); userIds.add(p.userId); } Map<Long, Set<Long>> userIdVsMemberIds = new HashMap<>(); for (InteractionScoreProp p : scores) { if (! memberIds.contains(p.memberId)) { //member is already assigned continue; } //member is not assigned. if user has space then assign if (userHasSpace(userIdVsMemberIds, p.userId, userIdVsMaxMembers)) { assignMemberToUser(userIdVsMemberIds, p.memberId, p.userId); memberIds.remove(p.memberId); if (memberIds.isEmpty()) { break; } } } CallAssignmentResult result = new CallAssignmentResult(); result.userIdVsMemberIds = userIdVsMemberIds; result.unassignedMembers = memberIds; return result; } static int getNumMembers(Map<Long, Set<Long>> userIdVsMembers, long userId) { Set<Long> set = userIdVsMembers.get(userId); return (set == null) ? 0 : set.size(); } static void assignMemberToUser(Map<Long, Set<Long>> userIdVsMemberIds, long memberId, long userId) { Set<Long> existing = userIdVsMemberIds.get(userId); if (existing == null) { existing = new HashSet<>(); userIdVsMemberIds.put(userId, existing); } existing.add(memberId); } static boolean userHasSpace(Map<Long, Set<Long>> userIdVsMembers, long userId, Map<Long, Integer> userIdVsMaxMembers) { Integer maxMembers = userIdVsMaxMembers.get(userId); return (maxMembers == null) || (getNumMembers(userIdVsMembers, userId) < maxMembers); } }