From 604343c3ceb74203ad7f17ce874e085dab9ca1c5 Mon Sep 17 00:00:00 2001 From: Athou Date: Fri, 21 Jun 2013 09:38:49 +0200 Subject: [PATCH] batch fetch for all subscription query --- .../backend/dao/FeedEntryStatusDAO.java | 60 ++++++++++++++----- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index 9466caf1..52da2304 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -17,6 +17,7 @@ import javax.persistence.criteria.Root; import javax.persistence.criteria.Selection; import javax.persistence.criteria.SetJoin; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.hibernate.Hibernate; import org.slf4j.Logger; @@ -35,9 +36,10 @@ import com.commafeed.backend.model.FeedSubscription_; import com.commafeed.backend.model.Feed_; import com.commafeed.backend.model.User; import com.commafeed.backend.model.UserSettings.ReadingOrder; -import com.google.api.client.util.Lists; -import com.google.api.client.util.Maps; +import com.google.common.base.Function; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; @Stateless public class FeedEntryStatusDAO extends GenericDAO { @@ -83,6 +85,45 @@ public class FeedEntryStatusDAO extends GenericDAO { return Iterables.getFirst(statuses, null); } + public List findByEntries(List entries, + FeedSubscription sub) { + List results = Lists.newArrayList(); + + if (CollectionUtils.isEmpty(entries)) { + return results; + } + + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + Predicate p1 = root.get(FeedEntryStatus_.entry).in(entries); + Predicate p2 = builder.equal(root.get(FeedEntryStatus_.subscription), + sub); + + query.where(p1, p2); + + Map existing = Maps.uniqueIndex( + em.createQuery(query).getResultList(), + new Function() { + @Override + public Long apply(FeedEntryStatus input) { + return input.getEntry().getId(); + } + }); + + for (FeedEntry entry : entries) { + FeedEntryStatus s = existing.get(entry.getId()); + if (s == null) { + s = new FeedEntryStatus(); + s.setEntry(entry); + s.setSubscription(sub); + s.setRead(true); + } + results.add(s); + } + return results; + } + public List findByKeywords(User user, String keywords, int offset, int limit) { @@ -275,19 +316,8 @@ public class FeedEntryStatusDAO extends GenericDAO { setTimeout(q); List list = q.getResultList(); - List results = Lists.newArrayList(); - for (FeedEntry entry : list) { - FeedEntryStatus status = findByEntry(entry, subscription); - if (status == null) { - status = new FeedEntryStatus(); - status.setEntry(entry); - status.setSubscription(subscription); - status.setRead(true); - } - results.add(status); - } - - return lazyLoadContent(includeContent, results); + return lazyLoadContent(includeContent, + findByEntries(list, subscription)); } public List findUnreadBySubscription(