package org.karmaexchange.task; import static org.karmaexchange.util.OfyService.ofy; import java.io.Serializable; import java.util.Date; import org.karmaexchange.dao.Event; import org.karmaexchange.dao.Event.EventParticipant; import org.karmaexchange.dao.AssociatedOrganization; import org.karmaexchange.dao.KeyWrapper; import org.karmaexchange.dao.Organization; import org.karmaexchange.dao.User; import org.karmaexchange.dao.Event.Status; import org.karmaexchange.task.LeaderboardMapper.UserKarmaRecord; import org.karmaexchange.util.AdminUtil; import org.karmaexchange.util.AdminUtil.AdminTaskType; import org.karmaexchange.util.UserService; import lombok.Data; import com.google.appengine.api.datastore.Entity; import com.google.appengine.tools.mapreduce.Mapper; import com.googlecode.objectify.Key; public class LeaderboardMapper extends Mapper<Entity, Key<Organization>, UserKarmaRecord> { private static final long serialVersionUID = 1L; @Override public void map(Entity dsEvent) { AdminUtil.setCurrentUser(AdminTaskType.MAP_REDUCE); try { mapAsAdmin(dsEvent); } finally { UserService.clearCurrentUser(); } } private void mapAsAdmin(Entity dsEvent) { Event event = ofy().load().fromEntity(dsEvent); // Bug: fromEntity() is not invoking @OnLoad annotation if (event.getKey() == null) { event.processLoad(); } if (event.getStatus() != Status.COMPLETED) { return; } for (AssociatedOrganization assocOrg : event.getAssociatedOrganizations()) { for (EventParticipant participant : event.getParticipants()) { if (participant.getType().countAsAttended()) { Key<Organization> assocOrgKey = KeyWrapper.toKey(assocOrg); if (assocOrgKey != null) { getContext().emit( assocOrgKey, new UserKarmaRecord(KeyWrapper.toKey(participant.getUser()), event.getKarmaPoints(), event.getEndTime())); } } } } } @Data public static class UserKarmaRecord implements Serializable { private static final long serialVersionUID = 1L; private final Key<User> userKey; private final int eventKarmaPoints; private final Date eventEndTime; } }