forked from Archives/Athou_commafeed
rewrote query engine
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user