rewrote query engine

This commit is contained in:
Athou
2013-03-25 23:15:52 +01:00
parent 6d3d03ef53
commit ef209ea321
4 changed files with 62 additions and 61 deletions

View File

@@ -5,6 +5,8 @@ import java.util.List;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.NoResultException; import javax.persistence.NoResultException;
import org.apache.commons.lang.ObjectUtils;
import com.commafeed.backend.model.FeedCategory; import com.commafeed.backend.model.FeedCategory;
import com.commafeed.backend.model.User; import com.commafeed.backend.model.User;
import com.commafeed.frontend.utils.ModelFactory.MF; import com.commafeed.frontend.utils.ModelFactory.MF;
@@ -44,4 +46,19 @@ public class FeedCategoryService extends GenericDAO<FeedCategory, Long> {
} }
return category; 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;
}
} }

View File

@@ -39,39 +39,28 @@ public class FeedEntryService extends GenericDAO<FeedEntry, Long> {
em.merge(feed); em.merge(feed);
} }
private TypedQuery<FeedEntry> unreadQuery(Feed feed, User user) { public List<FeedEntry> getEntries(Feed feed, User user, boolean read) {
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)"; return getEntries(feed, user, read, -1, -1);
TypedQuery<FeedEntry> typedQuery = em.createQuery(query, }
public List<FeedEntry> getEntries(Feed feed, User user, boolean read,
int offset, int limit) {
String queryName = null;
if (read) {
queryName = "Entry.readByFeed";
} else {
queryName = "Entry.unreadByFeed";
}
TypedQuery<FeedEntry> query = em.createNamedQuery(queryName,
FeedEntry.class); FeedEntry.class);
typedQuery.setParameter("feed", feed); query.setParameter("feed", feed);
typedQuery.setParameter("user", user); query.setParameter("user", user);
return typedQuery; if (offset > -1) {
} query.setFirstResult(offset);
}
public List<FeedEntry> getUnreadEntries(Feed feed, User user) { if (limit > -1) {
return unreadQuery(feed, user).getResultList(); query.setMaxResults(limit);
} }
return query.getResultList();
public List<FeedEntry> getUnreadEntries(Feed feed, User user, int offset,
int limit) {
return unreadQuery(feed, user).setFirstResult(offset)
.setMaxResults(limit).getResultList();
}
private TypedQuery<FeedEntry> allQuery(Feed feed) {
String query = "select e from FeedEntry e where e.feed=:feed";
TypedQuery<FeedEntry> typedQuery = em.createQuery(query,
FeedEntry.class);
typedQuery.setParameter("feed", feed);
return typedQuery;
}
public List<FeedEntry> getAllEntries(Feed feed) {
return allQuery(feed).getResultList();
}
public List<FeedEntry> getAllEntries(Feed feed, int offset, int limit) {
return allQuery(feed).setFirstResult(offset).setMaxResults(limit)
.getResultList();
} }
} }

View File

@@ -19,9 +19,7 @@ import com.commafeed.backend.model.FeedEntryStatus;
import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.FeedSubscription;
import com.commafeed.frontend.model.Entries; import com.commafeed.frontend.model.Entries;
import com.commafeed.frontend.model.Entry; import com.commafeed.frontend.model.Entry;
import com.commafeed.frontend.utils.ModelFactory.MF;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@Path("entries") @Path("entries")
@@ -92,30 +90,27 @@ public class EntriesREST extends AbstractREST {
private List<Entry> buildEntries(FeedSubscription subscription, int offset, private List<Entry> buildEntries(FeedSubscription subscription, int offset,
int limit, boolean unreadOnly) { int limit, boolean unreadOnly) {
List<FeedEntry> feedEntries = null; List<Entry> entries = Lists.newArrayList();
if (unreadOnly) { if (!unreadOnly) {
feedEntries = feedEntryService.getUnreadEntries( List<FeedEntry> unreadEntries = feedEntryService.getEntries(
subscription.getFeed(), getUser(), offset, limit); subscription.getFeed(), getUser(), true, offset, limit);
} else { for (FeedEntry feedEntry : unreadEntries) {
feedEntries = feedEntryService.getAllEntries( Entry entry = buildEntry(feedEntry);
subscription.getFeed(), offset, limit); entry.setFeedName(subscription.getTitle());
entry.setFeedId(String.valueOf(subscription.getId()));
entry.setRead(true);
entries.add(entry);
}
} }
List<Entry> entries = Lists.newArrayList(); List<FeedEntry> readEntries = feedEntryService.getEntries(
for (FeedEntry feedEntry : feedEntries) { subscription.getFeed(), getUser(), false, offset, limit);
for (FeedEntry feedEntry : readEntries) {
List<FeedEntryStatus> feedEntryStatus = feedEntryStatusService
.findByField(MF.i(MF.p(FeedEntryStatus.class).getEntry()),
feedEntry);
Entry entry = buildEntry(feedEntry); Entry entry = buildEntry(feedEntry);
entry.setFeedName(subscription.getTitle()); entry.setFeedName(subscription.getTitle());
entry.setFeedId(String.valueOf(subscription.getId())); entry.setFeedId(String.valueOf(subscription.getId()));
entry.setRead(feedEntryStatus.isEmpty() ? false : Iterables entry.setRead(false);
.getFirst(feedEntryStatus, null).isRead());
entry.setStarred(feedEntryStatus.isEmpty() ? false : Iterables
.getFirst(feedEntryStatus, null).isStarred());
entries.add(entry); entries.add(entry);
} }
return entries; return entries;
@@ -144,14 +139,14 @@ public class EntriesREST extends AbstractREST {
FeedEntry entry = feedEntryService.findById(Long.valueOf(id)); FeedEntry entry = feedEntryService.findById(Long.valueOf(id));
markEntry(entry, read); markEntry(entry, read);
} else if (type == Type.feed) { } else if (type == Type.feed) {
List<FeedEntry> entries = null; List<FeedEntry> entries = Lists.newArrayList();
Feed feed = feedSubscriptionService.findById(Long.valueOf(id)) Feed feed = feedSubscriptionService.findById(Long.valueOf(id))
.getFeed(); .getFeed();
if (read) { if (read) {
entries = feedEntryService.getUnreadEntries(feed, getUser()); entries.addAll(feedEntryService.getEntries(feed, getUser(),
} else { false));
entries = feedEntryService.getAllEntries(feed);
} }
entries.addAll(feedEntryService.getEntries(feed, getUser(), true));
for (FeedEntry entry : entries) { for (FeedEntry entry : entries) {
markEntry(entry, read); markEntry(entry, read);
} }

View File

@@ -94,8 +94,8 @@ public class SubscriptionsREST extends AbstractREST {
sub.setId(subscription.getId()); sub.setId(subscription.getId());
sub.setName(subscription.getTitle()); sub.setName(subscription.getTitle());
sub.setMessage(subscription.getFeed().getMessage()); sub.setMessage(subscription.getFeed().getMessage());
int size = feedEntryService.getUnreadEntries( int size = feedEntryService.getEntries(subscription.getFeed(),
subscription.getFeed(), getUser()).size(); getUser(), false).size();
sub.setUnread(size); sub.setUnread(size);
root.getFeeds().add(sub); root.getFeeds().add(sub);
} }
@@ -118,8 +118,8 @@ public class SubscriptionsREST extends AbstractREST {
sub.setId(subscription.getId()); sub.setId(subscription.getId());
sub.setName(subscription.getTitle()); sub.setName(subscription.getTitle());
sub.setMessage(subscription.getFeed().getMessage()); sub.setMessage(subscription.getFeed().getMessage());
int size = feedEntryService.getUnreadEntries( int size = feedEntryService.getEntries(
subscription.getFeed(), getUser()).size(); subscription.getFeed(), getUser(), false).size();
sub.setUnread(size); sub.setUnread(size);
child.getFeeds().add(sub); child.getFeeds().add(sub);
} }