package models.dao; import java.util.Collection; import java.util.concurrent.Callable; import javax.inject.Singleton; import karma.model.Impact; import karma.model.Reputable; import karma.model.ReputationEntryStore; import models.Reputation; import play.utils.cache.InterimCache; import play.utils.dao.CachedDAO; import play.utils.dao.TimestampListener; import com.avaje.ebean.Expr; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @Singleton public class ReputationDAO extends CachedDAO<Long, Reputation> implements ReputationEntryStore<Long, Reputation> { protected InterimCache<Collection<Reputation>> reputationEntryCache = new InterimCache<Collection<Reputation>>( "ReputationEntryCache", 86400);// 24 hrs protected Multimap<String, String> userKeys = HashMultimap.create(); protected Multimap<String, String> reputationValueKeys = HashMultimap.create(); public ReputationDAO() { super(Long.class, Reputation.class); addListener(new TimestampListener<Long, Reputation>()); addListener(new ReputationDAOListener(this)); } public Collection<Reputation> findFor(Reputable subject, Impact impact) { final String subjectKey = subject.getKey(); final String impactKey = impact.getKey(); final String cacheKey = subjectKey + ":" + impactKey; return reputationEntryCache.get(cacheKey, new Callable<Collection<Reputation>>() { public Collection<Reputation> call() throws Exception { userKeys.put(subjectKey, cacheKey); reputationValueKeys.put(impactKey, cacheKey); return find.where().and(Expr.eq("owner_key", subjectKey), Expr.eq("reputation_value_key", impactKey)) .findList(); } }); } public void cleanUserCache(String userKey) { Collection<String> cacheKeys = userKeys.get(userKey); for (String cacheKey : cacheKeys) { reputationEntryCache.set(cacheKey, null); } } public void cleanReputationValueCache(String repuationValueKey) { Collection<String> cacheKeys = reputationValueKeys.get(repuationValueKey); for (String cacheKey : cacheKeys) { reputationEntryCache.set(cacheKey, null); } } }