diff --git a/src/main/java/com/commafeed/backend/dao/FeedCategoryService.java b/src/main/java/com/commafeed/backend/dao/FeedCategoryService.java index 9b256b37..b08a1314 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedCategoryService.java +++ b/src/main/java/com/commafeed/backend/dao/FeedCategoryService.java @@ -5,6 +5,8 @@ import java.util.List; import javax.ejb.Stateless; import javax.persistence.NoResultException; +import org.apache.commons.lang.ObjectUtils; + import com.commafeed.backend.model.FeedCategory; import com.commafeed.backend.model.User; import com.commafeed.frontend.utils.ModelFactory.MF; @@ -44,4 +46,19 @@ public class FeedCategoryService extends GenericDAO { } return category; } + + public boolean isChild(FeedCategory child, FeedCategory parent) { + if (parent == null) { + return true; + } + boolean isChild = false; + while (child != null) { + if (ObjectUtils.equals(child.getId(), parent.getId())) { + isChild = true; + break; + } + child = child.getParent(); + } + return isChild; + } } diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryService.java b/src/main/java/com/commafeed/backend/dao/FeedEntryService.java index a0d11868..2072a5e6 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryService.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryService.java @@ -39,39 +39,28 @@ public class FeedEntryService extends GenericDAO { em.merge(feed); } - private TypedQuery unreadQuery(Feed feed, User user) { - String query = "select e from FeedEntry e where e.feed =:feed and not exists (select s from FeedEntryStatus s where s.entry = e and s.user =:user and s.read = true)"; - TypedQuery typedQuery = em.createQuery(query, + public List getEntries(Feed feed, User user, boolean read) { + return getEntries(feed, user, read, -1, -1); + } + + public List getEntries(Feed feed, User user, boolean read, + int offset, int limit) { + String queryName = null; + if (read) { + queryName = "Entry.readByFeed"; + } else { + queryName = "Entry.unreadByFeed"; + } + TypedQuery query = em.createNamedQuery(queryName, FeedEntry.class); - typedQuery.setParameter("feed", feed); - typedQuery.setParameter("user", user); - return typedQuery; - } - - public List getUnreadEntries(Feed feed, User user) { - return unreadQuery(feed, user).getResultList(); - } - - public List getUnreadEntries(Feed feed, User user, int offset, - int limit) { - return unreadQuery(feed, user).setFirstResult(offset) - .setMaxResults(limit).getResultList(); - } - - private TypedQuery allQuery(Feed feed) { - String query = "select e from FeedEntry e where e.feed=:feed"; - TypedQuery typedQuery = em.createQuery(query, - FeedEntry.class); - typedQuery.setParameter("feed", feed); - return typedQuery; - } - - public List getAllEntries(Feed feed) { - return allQuery(feed).getResultList(); - } - - public List getAllEntries(Feed feed, int offset, int limit) { - return allQuery(feed).setFirstResult(offset).setMaxResults(limit) - .getResultList(); + query.setParameter("feed", feed); + query.setParameter("user", user); + if (offset > -1) { + query.setFirstResult(offset); + } + if (limit > -1) { + query.setMaxResults(limit); + } + return query.getResultList(); } } diff --git a/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java b/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java index b9107a77..ac851159 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java @@ -19,9 +19,7 @@ import com.commafeed.backend.model.FeedEntryStatus; import com.commafeed.backend.model.FeedSubscription; import com.commafeed.frontend.model.Entries; import com.commafeed.frontend.model.Entry; -import com.commafeed.frontend.utils.ModelFactory.MF; import com.google.common.base.Preconditions; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @Path("entries") @@ -92,30 +90,27 @@ public class EntriesREST extends AbstractREST { private List buildEntries(FeedSubscription subscription, int offset, int limit, boolean unreadOnly) { - List feedEntries = null; + List entries = Lists.newArrayList(); - if (unreadOnly) { - feedEntries = feedEntryService.getUnreadEntries( - subscription.getFeed(), getUser(), offset, limit); - } else { - feedEntries = feedEntryService.getAllEntries( - subscription.getFeed(), offset, limit); + if (!unreadOnly) { + List unreadEntries = feedEntryService.getEntries( + subscription.getFeed(), getUser(), true, offset, limit); + for (FeedEntry feedEntry : unreadEntries) { + Entry entry = buildEntry(feedEntry); + entry.setFeedName(subscription.getTitle()); + entry.setFeedId(String.valueOf(subscription.getId())); + entry.setRead(true); + entries.add(entry); + } } - List entries = Lists.newArrayList(); - for (FeedEntry feedEntry : feedEntries) { - - List feedEntryStatus = feedEntryStatusService - .findByField(MF.i(MF.p(FeedEntryStatus.class).getEntry()), - feedEntry); - + List readEntries = feedEntryService.getEntries( + subscription.getFeed(), getUser(), false, offset, limit); + for (FeedEntry feedEntry : readEntries) { Entry entry = buildEntry(feedEntry); entry.setFeedName(subscription.getTitle()); entry.setFeedId(String.valueOf(subscription.getId())); - entry.setRead(feedEntryStatus.isEmpty() ? false : Iterables - .getFirst(feedEntryStatus, null).isRead()); - entry.setStarred(feedEntryStatus.isEmpty() ? false : Iterables - .getFirst(feedEntryStatus, null).isStarred()); + entry.setRead(false); entries.add(entry); } return entries; @@ -144,14 +139,14 @@ public class EntriesREST extends AbstractREST { FeedEntry entry = feedEntryService.findById(Long.valueOf(id)); markEntry(entry, read); } else if (type == Type.feed) { - List entries = null; + List entries = Lists.newArrayList(); Feed feed = feedSubscriptionService.findById(Long.valueOf(id)) .getFeed(); if (read) { - entries = feedEntryService.getUnreadEntries(feed, getUser()); - } else { - entries = feedEntryService.getAllEntries(feed); + entries.addAll(feedEntryService.getEntries(feed, getUser(), + false)); } + entries.addAll(feedEntryService.getEntries(feed, getUser(), true)); for (FeedEntry entry : entries) { markEntry(entry, read); } diff --git a/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java b/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java index 325877d8..070c2e82 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java @@ -94,8 +94,8 @@ public class SubscriptionsREST extends AbstractREST { sub.setId(subscription.getId()); sub.setName(subscription.getTitle()); sub.setMessage(subscription.getFeed().getMessage()); - int size = feedEntryService.getUnreadEntries( - subscription.getFeed(), getUser()).size(); + int size = feedEntryService.getEntries(subscription.getFeed(), + getUser(), false).size(); sub.setUnread(size); root.getFeeds().add(sub); } @@ -118,8 +118,8 @@ public class SubscriptionsREST extends AbstractREST { sub.setId(subscription.getId()); sub.setName(subscription.getTitle()); sub.setMessage(subscription.getFeed().getMessage()); - int size = feedEntryService.getUnreadEntries( - subscription.getFeed(), getUser()).size(); + int size = feedEntryService.getEntries( + subscription.getFeed(), getUser(), false).size(); sub.setUnread(size); child.getFeeds().add(sub); }