diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index bf8a4f7e..7a5cd801 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -125,7 +125,7 @@ public class FeedEntryStatusDAO extends GenericDAO { } private Criteria buildSearchCriteria(FeedSubscription sub, boolean unreadOnly, String keywords, Date newerThan, int offset, int limit, - ReadingOrder order, boolean includeContent, Date last) { + ReadingOrder order, Date last) { Criteria criteria = getSession().createCriteria(FeedEntry.class, ALIAS_ENTRY); criteria.add(Restrictions.eq(FeedEntry_.feed.getName(), sub.getFeed())); @@ -192,15 +192,14 @@ public class FeedEntryStatusDAO extends GenericDAO { } @SuppressWarnings("unchecked") - public List findBySubscriptions(List subscriptions, boolean unreadOnly, String keywords, - Date newerThan, int offset, int limit, ReadingOrder order, boolean includeContent) { - + public List findBySubscriptions(List subs, boolean unreadOnly, String keywords, Date newerThan, + int offset, int limit, ReadingOrder order, boolean includeContent, boolean onlyIds) { int capacity = offset + limit; Comparator comparator = order == ReadingOrder.desc ? STATUS_COMPARATOR_DESC : STATUS_COMPARATOR_ASC; FixedSizeSortedSet set = new FixedSizeSortedSet(capacity, comparator); - for (FeedSubscription sub : subscriptions) { + for (FeedSubscription sub : subs) { Date last = (order != null && set.isFull()) ? set.last().getEntryUpdated() : null; - Criteria criteria = buildSearchCriteria(sub, unreadOnly, keywords, newerThan, -1, capacity, order, includeContent, last); + Criteria criteria = buildSearchCriteria(sub, unreadOnly, keywords, newerThan, -1, capacity, order, last); ProjectionList projection = Projections.projectionList(); projection.add(Projections.property("id"), "id"); projection.add(Projections.property("updated"), "updated"); @@ -232,18 +231,21 @@ public class FeedEntryStatusDAO extends GenericDAO { statusPlaceholders = statusPlaceholders.subList(Math.max(offset, 0), size); - List statuses = Lists.newArrayList(); - for (FeedEntryStatus status : statusPlaceholders) { - FeedEntry entry = em.find(FeedEntry.class, status.getEntry().getId()); - statuses.add(getStatus(status.getSubscription(), entry)); + if (!onlyIds) { + List statuses = Lists.newArrayList(); + for (FeedEntryStatus status : statusPlaceholders) { + FeedEntry entry = em.find(FeedEntry.class, status.getEntry().getId()); + statuses.add(getStatus(status.getSubscription(), entry)); + } + statusPlaceholders = lazyLoadContent(includeContent, statuses); } - return lazyLoadContent(includeContent, statuses); + return statusPlaceholders; } @SuppressWarnings("unchecked") public UnreadCount getUnreadCount(FeedSubscription subscription) { UnreadCount uc = null; - Criteria criteria = buildSearchCriteria(subscription, true, null, null, -1, -1, null, false, null); + Criteria criteria = buildSearchCriteria(subscription, true, null, null, -1, -1, null, null); ProjectionList projection = Projections.projectionList(); projection.add(Projections.rowCount(), "count"); projection.add(Projections.max(FeedEntry_.updated.getName()), "updated"); diff --git a/src/main/java/com/commafeed/backend/services/FeedEntryService.java b/src/main/java/com/commafeed/backend/services/FeedEntryService.java index a47ace05..531cd1d6 100644 --- a/src/main/java/com/commafeed/backend/services/FeedEntryService.java +++ b/src/main/java/com/commafeed/backend/services/FeedEntryService.java @@ -69,7 +69,7 @@ public class FeedEntryService { } public void markSubscriptionEntries(User user, List subscriptions, Date olderThan) { - List statuses = feedEntryStatusDAO.findBySubscriptions(subscriptions, true, null, null, -1, -1, null, false); + List statuses = feedEntryStatusDAO.findBySubscriptions(subscriptions, true, null, null, -1, -1, null, false, false); markList(statuses, olderThan); cache.invalidateUnreadCount(subscriptions.toArray(new FeedSubscription[0])); cache.invalidateUserRootCategory(user); diff --git a/src/main/java/com/commafeed/frontend/model/Entry.java b/src/main/java/com/commafeed/frontend/model/Entry.java index b6125d26..d9a214bf 100644 --- a/src/main/java/com/commafeed/frontend/model/Entry.java +++ b/src/main/java/com/commafeed/frontend/model/Entry.java @@ -10,6 +10,7 @@ import javax.xml.bind.annotation.XmlRootElement; import com.commafeed.backend.feeds.FeedUtils; import com.commafeed.backend.model.FeedEntry; +import com.commafeed.backend.model.FeedEntryContent; import com.commafeed.backend.model.FeedEntryStatus; import com.commafeed.backend.model.FeedSubscription; import com.sun.syndication.feed.synd.SyndContentImpl; @@ -29,29 +30,31 @@ public class Entry implements Serializable { FeedEntry feedEntry = status.getEntry(); FeedSubscription sub = status.getSubscription(); - - entry.setRead(status.isRead()); - entry.setStarred(status.isStarred()); - entry.setMarkable(status.isMarkable()); + FeedEntryContent content = feedEntry.getContent(); entry.setId(String.valueOf(feedEntry.getId())); entry.setGuid(feedEntry.getGuid()); - entry.setTitle(feedEntry.getContent().getTitle()); - entry.setContent(FeedUtils.proxyImages(feedEntry.getContent().getContent(), publicUrl, proxyImages)); - entry.setRtl(FeedUtils.isRTL(feedEntry)); - entry.setAuthor(feedEntry.getContent().getAuthor()); - entry.setEnclosureUrl(feedEntry.getContent().getEnclosureUrl()); - entry.setEnclosureType(feedEntry.getContent().getEnclosureType()); + entry.setRead(status.isRead()); + entry.setStarred(status.isStarred()); + entry.setMarkable(status.isMarkable()); entry.setDate(feedEntry.getUpdated()); entry.setInsertedDate(feedEntry.getInserted()); entry.setUrl(feedEntry.getUrl()); - entry.setFeedName(sub.getTitle()); entry.setFeedId(String.valueOf(sub.getId())); entry.setFeedUrl(sub.getFeed().getUrl()); entry.setFeedLink(sub.getFeed().getLink()); entry.setIconUrl(FeedUtils.getFaviconUrl(sub, publicUrl)); + if (content != null) { + entry.setRtl(FeedUtils.isRTL(feedEntry)); + entry.setTitle(content.getTitle()); + entry.setContent(FeedUtils.proxyImages(content.getContent(), publicUrl, proxyImages)); + entry.setAuthor(content.getAuthor()); + entry.setEnclosureUrl(content.getEnclosureUrl()); + entry.setEnclosureType(content.getEnclosureType()); + } + return entry; } diff --git a/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java b/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java index 80f90e18..f205dc2b 100755 --- a/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java +++ b/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java @@ -54,13 +54,13 @@ public class NextUnreadRedirectPage extends WebPage { List statuses = null; if (StringUtils.isBlank(categoryId) || CategoryREST.ALL.equals(categoryId)) { List subs = feedSubscriptionDAO.findAll(user); - statuses = feedEntryStatusDAO.findBySubscriptions(subs, true, null, null, 0, 1, order, true); + statuses = feedEntryStatusDAO.findBySubscriptions(subs, true, null, null, 0, 1, order, true, false); } else { FeedCategory category = feedCategoryDAO.findById(user, Long.valueOf(categoryId)); if (category != null) { List children = feedCategoryDAO.findAllChildrenCategories(user, category); List subscriptions = feedSubscriptionDAO.findByCategories(user, children); - statuses = feedEntryStatusDAO.findBySubscriptions(subscriptions, true, null, null, 0, 1, order, true); + statuses = feedEntryStatusDAO.findBySubscriptions(subscriptions, true, null, null, 0, 1, order, true, false); } } 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 ff1bf2f4..940e2f95 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java @@ -106,7 +106,8 @@ public class CategoryREST extends AbstractREST { value = "date ordering", allowableValues = "asc,desc") @QueryParam("order") @DefaultValue("desc") ReadingOrder order, @ApiParam( value = "keywords separated by spaces, 3 characters minimum", - required = true) @QueryParam("keywords") String keywords) { + required = true) @QueryParam("keywords") String keywords, + @ApiParam(value = "return only entry ids") @DefaultValue("false") @QueryParam("onlyIds") boolean onlyIds) { Preconditions.checkNotNull(readType); @@ -130,7 +131,8 @@ public class CategoryREST extends AbstractREST { entries.setName("All"); List subscriptions = feedSubscriptionDAO.findAll(getUser()); List list = feedEntryStatusDAO.findBySubscriptions(subscriptions, unreadOnly, keywords, newerThanDate, offset, - limit + 1, order, true); + limit + 1, order, true, onlyIds); + for (FeedEntryStatus status : list) { entries.getEntries().add( Entry.build(status, applicationSettingsService.get().getPublicUrl(), applicationSettingsService.get() @@ -139,7 +141,7 @@ public class CategoryREST extends AbstractREST { } else if (STARRED.equals(id)) { entries.setName("Starred"); - List starred = feedEntryStatusDAO.findStarred(getUser(), newerThanDate, offset, limit + 1, order, true); + List starred = feedEntryStatusDAO.findStarred(getUser(), newerThanDate, offset, limit + 1, order, !onlyIds); for (FeedEntryStatus status : starred) { entries.getEntries().add( Entry.build(status, applicationSettingsService.get().getPublicUrl(), applicationSettingsService.get() @@ -150,8 +152,10 @@ public class CategoryREST extends AbstractREST { if (parent != null) { List categories = feedCategoryDAO.findAllChildrenCategories(getUser(), parent); List subs = feedSubscriptionDAO.findByCategories(getUser(), categories); + List list = feedEntryStatusDAO.findBySubscriptions(subs, unreadOnly, keywords, newerThanDate, offset, - limit + 1, order, true); + limit + 1, order, true, onlyIds); + for (FeedEntryStatus status : list) { entries.getEntries().add( Entry.build(status, applicationSettingsService.get().getPublicUrl(), applicationSettingsService.get() @@ -188,7 +192,7 @@ public class CategoryREST extends AbstractREST { int offset = 0; int limit = 20; - Entries entries = (Entries) getCategoryEntries(id, readType, null, offset, limit, order, null).getEntity(); + Entries entries = (Entries) getCategoryEntries(id, readType, null, offset, limit, order, null, false).getEntity(); SyndFeed feed = new SyndFeedImpl(); feed.setFeedType("rss_2.0"); diff --git a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java index 3ba54088..2c89306e 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java @@ -143,7 +143,8 @@ public class FeedREST extends AbstractREST { value = "date ordering", allowableValues = "asc,desc") @QueryParam("order") @DefaultValue("desc") ReadingOrder order, @ApiParam( value = "keywords separated by spaces, 3 characters minimum", - required = true) @QueryParam("keywords") String keywords) { + required = true) @QueryParam("keywords") String keywords, + @ApiParam(value = "return only entry ids") @DefaultValue("false") @QueryParam("onlyIds") boolean onlyIds) { Preconditions.checkNotNull(id); Preconditions.checkNotNull(readType); @@ -170,7 +171,7 @@ public class FeedREST extends AbstractREST { entries.setFeedLink(subscription.getFeed().getLink()); List list = feedEntryStatusDAO.findBySubscriptions(Arrays.asList(subscription), unreadOnly, keywords, - newerThanDate, offset, limit + 1, order, true); + newerThanDate, offset, limit + 1, order, true, onlyIds); for (FeedEntryStatus status : list) { entries.getEntries().add( @@ -204,7 +205,7 @@ public class FeedREST extends AbstractREST { int offset = 0; int limit = 20; - Entries entries = (Entries) getFeedEntries(id, readType, null, offset, limit, order, null).getEntity(); + Entries entries = (Entries) getFeedEntries(id, readType, null, offset, limit, order, null, false).getEntity(); SyndFeed feed = new SyndFeedImpl(); feed.setFeedType("rss_2.0");