diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index b844e9fc..20e5e3f5 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 org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.time.DateUtils; import org.hibernate.Criteria; +import org.hibernate.criterion.CriteriaSpecification; import org.hibernate.criterion.Disjunction; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Order; @@ -50,17 +51,23 @@ public class FeedEntryStatusDAO extends GenericDAO { protected static Logger log = LoggerFactory .getLogger(FeedEntryStatusDAO.class); - private static final Comparator ENTRY_COMPARATOR_DESC = new Comparator() { + private static final String ALIAS_STATUS = "status"; + private static final String ALIAS_ENTRY = "entry"; + private static final String ALIAS_FFE = "ffe"; + + private static final Comparator STATUS_COMPARATOR_DESC = new Comparator() { @Override - public int compare(FeedEntry o1, FeedEntry o2) { - return ObjectUtils.compare(o2.getUpdated(), o1.getUpdated()); + public int compare(FeedEntryStatus o1, FeedEntryStatus o2) { + return ObjectUtils.compare(o2.getEntryUpdated(), + o1.getEntryUpdated()); }; }; - private static final Comparator ENTRY_COMPARATOR_ASC = new Comparator() { + private static final Comparator STATUS_COMPARATOR_ASC = new Comparator() { @Override - public int compare(FeedEntry o1, FeedEntry o2) { - return ObjectUtils.compare(o1.getUpdated(), o2.getUpdated()); + public int compare(FeedEntryStatus o1, FeedEntryStatus o2) { + return ObjectUtils.compare(o1.getEntryUpdated(), + o2.getEntryUpdated()); }; }; @@ -80,6 +87,12 @@ public class FeedEntryStatusDAO extends GenericDAO { List statuses = em.createQuery(query).getResultList(); FeedEntryStatus status = Iterables.getFirst(statuses, null); + + return handleStatus(status, sub, entry); + } + + private FeedEntryStatus handleStatus(FeedEntryStatus status, + FeedSubscription sub, FeedEntry entry) { if (status == null) { Date unreadThreshold = getUnreadThreshold(); boolean read = unreadThreshold == null ? false : entry @@ -120,13 +133,12 @@ public class FeedEntryStatusDAO extends GenericDAO { private Criteria buildSearchCriteria(FeedSubscription sub, boolean unreadOnly, String keywords, Date newerThan, int offset, - int limit, ReadingOrder order, boolean includeContent, - FeedEntry last) { + int limit, ReadingOrder order, boolean includeContent, Date last) { Criteria criteria = getSession().createCriteria(FeedEntry.class, - "entry"); + ALIAS_ENTRY); Criteria ffeJoin = criteria.createCriteria( - FeedEntry_.feedRelationships.getName(), "ffe", + FeedEntry_.feedRelationships.getName(), ALIAS_FFE, JoinType.INNER_JOIN); ffeJoin.add(Restrictions.eq(FeedFeedEntry_.feed.getName(), sub.getFeed())); @@ -153,7 +165,7 @@ public class FeedEntryStatusDAO extends GenericDAO { if (unreadOnly) { Criteria statusJoin = criteria.createCriteria(FeedEntry_.statuses - .getName(), "status", JoinType.LEFT_OUTER_JOIN, + .getName(), ALIAS_STATUS, JoinType.LEFT_OUTER_JOIN, Restrictions.eq(FeedEntryStatus_.subscription.getName(), sub)); @@ -173,12 +185,10 @@ public class FeedEntryStatusDAO extends GenericDAO { if (last != null) { if (order == ReadingOrder.desc) { ffeJoin.add(Restrictions.gt( - FeedFeedEntry_.entryUpdated.getName(), - last.getUpdated())); + FeedFeedEntry_.entryUpdated.getName(), last)); } else { ffeJoin.add(Restrictions.lt( - FeedFeedEntry_.entryUpdated.getName(), - last.getUpdated())); + FeedFeedEntry_.entryUpdated.getName(), last)); } } @@ -211,38 +221,38 @@ public class FeedEntryStatusDAO extends GenericDAO { ReadingOrder order, boolean includeContent) { int capacity = offset + limit; - Comparator comparator = order == ReadingOrder.desc ? ENTRY_COMPARATOR_DESC - : ENTRY_COMPARATOR_ASC; - FixedSizeSortedSet set = new FixedSizeSortedSet( + Comparator comparator = order == ReadingOrder.desc ? STATUS_COMPARATOR_DESC + : STATUS_COMPARATOR_ASC; + FixedSizeSortedSet set = new FixedSizeSortedSet( capacity < 0 ? Integer.MAX_VALUE : capacity, comparator); for (FeedSubscription sub : subscriptions) { - FeedEntry last = (order != null && set.isFull()) ? set.last() - : null; + Date last = (order != null && set.isFull()) ? set.last() + .getEntryUpdated() : null; Criteria criteria = buildSearchCriteria(sub, unreadOnly, keywords, newerThan, -1, limit, order, includeContent, last); - - List list = criteria.list(); - for (FeedEntry entry : list) { + criteria.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP); + List> list = criteria.list(); + for (Map map : list) { + FeedEntryStatus status = (FeedEntryStatus) map + .get(ALIAS_STATUS); + FeedEntry entry = (FeedEntry) map.get(ALIAS_ENTRY); entry.setSubscription(sub); + + status = handleStatus(status, sub, entry); + + status.setEntry(entry); + set.add(status); } - set.addAll(list); } - List entries = set.asList(); - int size = entries.size(); + List statuses = set.asList(); + int size = statuses.size(); if (size < offset) { return Lists.newArrayList(); } - entries = entries.subList(Math.max(offset, 0), size); - - List results = Lists.newArrayList(); - for (FeedEntry entry : entries) { - FeedSubscription subscription = entry.getSubscription(); - results.add(getStatus(subscription, entry)); - } - - return lazyLoadContent(includeContent, results); + statuses = statuses.subList(Math.max(offset, 0), size); + return lazyLoadContent(includeContent, statuses); } private Date getUnreadThreshold() { diff --git a/src/main/java/com/commafeed/backend/services/FeedEntryService.java b/src/main/java/com/commafeed/backend/services/FeedEntryService.java index 5c12660c..406ec161 100644 --- a/src/main/java/com/commafeed/backend/services/FeedEntryService.java +++ b/src/main/java/com/commafeed/backend/services/FeedEntryService.java @@ -37,7 +37,6 @@ public class FeedEntryService { } FeedEntryStatus status = feedEntryStatusDAO.getStatus(sub, entry); - status.setRead(read); feedEntryStatusDAO.saveOrUpdate(status); } @@ -57,7 +56,6 @@ public class FeedEntryService { } FeedEntryStatus status = feedEntryStatusDAO.getStatus(sub, entry); - status.setStarred(starred); feedEntryStatusDAO.saveOrUpdate(status); diff --git a/src/main/resources/META-INF/orm.xml b/src/main/resources/META-INF/orm.xml index c66e91a3..aa541a9c 100644 --- a/src/main/resources/META-INF/orm.xml +++ b/src/main/resources/META-INF/orm.xml @@ -4,9 +4,13 @@ xsi:schemaLocation=" http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"> - + delete from FeedEntryStatus s where s.entryInserted < :date and s.starred = false - + + + select new com.commafeed.backend.dao.FeedEntryDAO$EntryWithFeed(e, f) FROM FeedEntry e LEFT JOIN e.feedRelationships f WITH f.feed.id = :feedId where e.guidHash = :guidHash and e.url = :url + + \ No newline at end of file