From 074ab9f7077f6018e84cb3a1a8c25bd3f6e951ff Mon Sep 17 00:00:00 2001 From: Athou Date: Fri, 19 Jul 2013 12:18:10 +0200 Subject: [PATCH] use faster query for 'all unread' --- .../backend/dao/FeedEntryStatusDAO.java | 32 +++++++++++++++++++ .../pages/NextUnreadRedirectPage.java | 6 ++-- .../frontend/rest/resources/CategoryREST.java | 10 ++---- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index 6c77740e..393239c1 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -265,6 +265,32 @@ public class FeedEntryStatusDAO extends GenericDAO { return lazyLoadContent(includeContent, entries); } + public List findAllUnread(User user, Date newerThan, + int offset, int limit, ReadingOrder order, boolean includeContent) { + + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + List predicates = Lists.newArrayList(); + + predicates.add(builder.equal(root.get(FeedEntryStatus_.user), user)); + predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); + + if (newerThan != null) { + predicates.add(builder.greaterThanOrEqualTo( + root.get(FeedEntryStatus_.entryInserted), newerThan)); + } + + query.where(predicates.toArray(new Predicate[0])); + orderStatusesBy(query, root, order); + + TypedQuery q = em.createQuery(query); + limit(q, offset, limit); + setTimeout(q); + + return lazyLoadContent(includeContent, q.getResultList()); + } + /** * Map between subscriptionId and unread count */ @@ -318,6 +344,12 @@ public class FeedEntryStatusDAO extends GenericDAO { setTimeout(query, applicationSettingsService.get().getQueryTimeout()); } + public void markAllEntries(User user, Date olderThan) { + List statuses = findAllUnread(user, null, -1, -1, + null, false); + markList(statuses, olderThan); + } + public void markSubscriptionEntries(List subscriptions, Date olderThan) { List statuses = findUnreadBySubscriptions( diff --git a/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java b/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java index b03b5331..5235e9bd 100755 --- a/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java +++ b/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java @@ -54,10 +54,8 @@ public class NextUnreadRedirectPage extends WebPage { List statuses = null; if (StringUtils.isBlank(categoryId) || CategoryREST.ALL.equals(categoryId)) { - List subscriptions = feedSubscriptionDAO - .findAll(user); - statuses = feedEntryStatusDAO.findBySubscriptions(subscriptions, - null, null, 0, 1, order, true); + statuses = feedEntryStatusDAO.findAllUnread(user, null, 0, 1, + order, true); } else { FeedCategory category = feedCategoryDAO.findById(user, Long.valueOf(categoryId)); diff --git a/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java b/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java index 345f2f5f..aece8099 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java @@ -110,9 +110,8 @@ public class CategoryREST extends AbstractResourceREST { List subscriptions = feedSubscriptionDAO .findAll(getUser()); if (unreadOnly) { - list = feedEntryStatusDAO.findUnreadBySubscriptions( - subscriptions, newerThanDate, offset, limit + 1, order, - true); + list = feedEntryStatusDAO.findAllUnread(getUser(), + newerThanDate, offset, limit + 1, order, true); } else { list = feedEntryStatusDAO.findBySubscriptions(subscriptions, null, newerThanDate, offset, limit + 1, order, true); @@ -226,10 +225,7 @@ public class CategoryREST extends AbstractResourceREST { req.getOlderThan()); if (ALL.equals(req.getId())) { - List subscriptions = feedSubscriptionDAO - .findAll(getUser()); - feedEntryStatusDAO - .markSubscriptionEntries(subscriptions, olderThan); + feedEntryStatusDAO.markAllEntries(getUser(), olderThan); } else if (STARRED.equals(req.getId())) { feedEntryStatusDAO.markStarredEntries(getUser(), olderThan); } else {