use faster query for 'all unread'

This commit is contained in:
Athou
2013-07-19 12:18:10 +02:00
parent 079a73c92e
commit 074ab9f707
3 changed files with 37 additions and 11 deletions

View File

@@ -265,6 +265,32 @@ public class FeedEntryStatusDAO extends GenericDAO<FeedEntryStatus> {
return lazyLoadContent(includeContent, entries);
}
public List<FeedEntryStatus> findAllUnread(User user, Date newerThan,
int offset, int limit, ReadingOrder order, boolean includeContent) {
CriteriaQuery<FeedEntryStatus> query = builder.createQuery(getType());
Root<FeedEntryStatus> root = query.from(getType());
List<Predicate> 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<FeedEntryStatus> 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<FeedEntryStatus> {
setTimeout(query, applicationSettingsService.get().getQueryTimeout());
}
public void markAllEntries(User user, Date olderThan) {
List<FeedEntryStatus> statuses = findAllUnread(user, null, -1, -1,
null, false);
markList(statuses, olderThan);
}
public void markSubscriptionEntries(List<FeedSubscription> subscriptions,
Date olderThan) {
List<FeedEntryStatus> statuses = findUnreadBySubscriptions(

View File

@@ -54,10 +54,8 @@ public class NextUnreadRedirectPage extends WebPage {
List<FeedEntryStatus> statuses = null;
if (StringUtils.isBlank(categoryId)
|| CategoryREST.ALL.equals(categoryId)) {
List<FeedSubscription> 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));

View File

@@ -110,9 +110,8 @@ public class CategoryREST extends AbstractResourceREST {
List<FeedSubscription> 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<FeedSubscription> subscriptions = feedSubscriptionDAO
.findAll(getUser());
feedEntryStatusDAO
.markSubscriptionEntries(subscriptions, olderThan);
feedEntryStatusDAO.markAllEntries(getUser(), olderThan);
} else if (STARRED.equals(req.getId())) {
feedEntryStatusDAO.markStarredEntries(getUser(), olderThan);
} else {