package crmdna.interaction; import com.googlecode.objectify.Key; import com.googlecode.objectify.cmd.Query; import crmdna.client.Client; import crmdna.common.api.APIException; import crmdna.common.api.APIResponse; import crmdna.member.MemberLoader; import crmdna.user.User; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import static crmdna.common.OfyService.ofy; /** * Created by sathya on 16/8/15. */ public class InteractionScore { static InteractionScoreProp incrementBy1(String client, String userEmail, long memberId) { Client.ensureValid(client); //this is automatically called when a subinteraction is added. //hence no privilege check long userId = User.safeGet(client, userEmail).toProp(client).userId; MemberLoader.safeGet(client, memberId, User.SUPER_USER); String key = getKey(userId, memberId); InteractionScoreEntity entity = ofy(client).load().type(InteractionScoreEntity.class).id(key).now(); if (entity == null) { entity = new InteractionScoreEntity(); entity.interactionScore = 0; entity.memberId = memberId; entity.userId = userId; entity.userIdMemberId = key; } entity.interactionScore++; ofy(client).save().entity(entity).now(); return toProp(entity); } static String getKey(long userId, long memberId) { return userId + "_" + memberId; } static InteractionScoreProp toProp(InteractionScoreEntity entity) { InteractionScoreProp prop = new InteractionScoreProp(); prop.interactionScore = entity.interactionScore; prop.memberId = entity.memberId; prop.userId = entity.userId; return prop; } public static List<InteractionScoreProp> get(String client, List<UserMemberProp> userMemberProps) { Client.ensureValid(client); List<String> keys = new ArrayList<>(userMemberProps.size()); for (UserMemberProp ump : userMemberProps) { String key = getKey(ump.userId, ump.memberId); keys.add(key); } Map<String, InteractionScoreEntity> map = ofy(client).load().type(InteractionScoreEntity.class).ids(keys); List<InteractionScoreProp> result = new ArrayList<>(); for (Map.Entry<String, InteractionScoreEntity> e : map.entrySet()) { result.add(toProp(e.getValue())); } //interaction score is 0 when there is no entry for member, user for (String key : keys) { if (! map.containsKey(key)) { InteractionScoreProp prop = new InteractionScoreProp(); prop.interactionScore = 0; String split[] = key.split(Pattern.quote("_")); prop.userId = Integer.parseInt(split[0]); prop.memberId = Integer.parseInt(split[1]); result.add(prop); } } sortByDescScores(result); return result; } static void sortByDescScores(List<InteractionScoreProp> props) { Collections.sort(props, new Comparator<InteractionScoreProp>() { @Override public int compare(InteractionScoreProp o1, InteractionScoreProp o2) { return new Integer(o2.interactionScore).compareTo(new Integer(o1.interactionScore)); } }); } static List<InteractionScoreProp> query(String client, InteractionScoreQueryCondition qc, int maxResults) { Client.ensureValid(client); Query<InteractionScoreEntity> q = ofy(client).load().type(InteractionScoreEntity.class); if (qc.userIds != null && !qc.userIds.isEmpty()) { q.filter("userId in", qc.userIds); } if (qc.memberIds != null && !qc.memberIds.isEmpty()) { q.filter("memberId in", qc.memberIds); } List<Key<InteractionScoreEntity>> keys = q.keys().list(); if (keys.size() > maxResults) { throw new APIException().status(APIResponse.Status.ERROR_OVERFLOW) .message("Query result has " + keys.size() + " entries. Max allowed is " + maxResults); } Map<Key<InteractionScoreEntity>, InteractionScoreEntity> map = ofy(client).load().keys(keys); List<InteractionScoreProp> props = new ArrayList<>(); for (Map.Entry<Key<InteractionScoreEntity>, InteractionScoreEntity> e : map.entrySet()) { props.add(toProp(e.getValue())); } sortByDescScores(props); return props; } }