package models.dao; import java.util.List; import java.util.concurrent.Callable; import javax.inject.Inject; import javax.inject.Singleton; import models.Category; import models.ContentStatus; import models.Post; import org.joda.time.DateTime; import play.utils.cache.InterimCache; import play.utils.dao.CachedDAO; import play.utils.dao.TimestampListener; import com.avaje.ebean.Expr; import com.avaje.ebean.Expression; import com.avaje.ebean.Page; @Singleton public class PostDAO extends CachedDAO<Long, Post> { private static final int TOP_10 = 10; protected InterimCache<Post> cache = new InterimCache<Post>(Post.class, 3600); @Inject public PostDAO(OwnerCacheCleaner<Long, Post> cacheCleaner) { super(Long.class, Post.class); addListener(new TimestampListener<Long, Post>()); addListener(cacheCleaner); } public Page<Post> page(int page, int pageSize) { String cacheKey = "page=" + page; Expression expr = Expr.ne("status", ContentStatus.REMOVED); return find.page(page, pageSize, "createdOn desc", cacheKey, expr); } public Page<Post> pageInCategory(Category category, int page, int pageSize) { String cacheKey = "category=" + category + ", page=" + page; Expression expr = Expr.and(Expr.eq("category", category), Expr.ne("status", ContentStatus.REMOVED)); return find.page(page, pageSize, "createdOn desc", cacheKey, expr); } public Page<Post> topDayPage() { return cache.page(".topDay", new Callable<Page<Post>>() { public Page<Post> call() throws Exception { DateTime now = new DateTime(); DateTime yesterday = now.minusDays(1); return find.where().gt("createdOn", yesterday.toDate()) .ne("status", ContentStatus.REMOVED) .ne("status", ContentStatus.EXPIRED) .orderBy("rating desc").findPagingList(TOP_10) .getPage(0); } }); } public Page<Post> topWeekPage() { return cache.page(".topWeek", new Callable<Page<Post>>() { public Page<Post> call() throws Exception { DateTime now = new DateTime(); DateTime lastWeek = now.minusDays(7); return find.where().gt("createdOn", lastWeek.toDate()) .ne("status", ContentStatus.REMOVED) .ne("status", ContentStatus.EXPIRED) .orderBy("rating desc").findPagingList(TOP_10) .getPage(0); } }); } public Page<Post> topAllPage() { return cache.page(".topAll", new Callable<Page<Post>>() { public Page<Post> call() throws Exception { return find.where() .ne("status", ContentStatus.REMOVED) .ne("status", ContentStatus.EXPIRED) .orderBy("rating desc").findPagingList(TOP_10) .getPage(0); } }); } public Page<Post> getPostsCreatedBy(List<String> usernames, int page, int pageSize) { return find.where().in("created_by", usernames) .orderBy("createdOn desc").findPagingList(pageSize) .getPage(page); } }