diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index 368f27a9..4abff846 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -126,27 +126,29 @@ public class FeedEntryStatusDAO extends GenericDAO { public List findByKeywords(User user, String keywords, int offset, int limit) { - + String joinedKeywords = StringUtils.join( keywords.toLowerCase().split(" "), "%"); joinedKeywords = "%" + joinedKeywords + "%"; + + CriteriaQuery query = builder.createTupleQuery(); + Root root = query.from(FeedEntry.class); - CriteriaQuery query = builder.createQuery(getType()); - Root root = query.from(getType()); + SetJoin feedJoin = root.join(FeedEntry_.feeds); + SetJoin subJoin = feedJoin + .join(Feed_.subscriptions); + Join contentJoin = root + .join(FeedEntry_.content); + + Selection entryAlias = root.alias("entry"); + Selection subAlias = subJoin.alias("subscription"); + query.multiselect(entryAlias, subAlias); List predicates = Lists.newArrayList(); - Join entryJoin = root - .join(FeedEntryStatus_.entry); - Join subJoin = root - .join(FeedEntryStatus_.subscription); - - Join contentJoin = entryJoin - .join(FeedEntry_.content); - predicates .add(builder.equal(subJoin.get(FeedSubscription_.user), user)); - + Predicate content = builder.like( builder.lower(contentJoin.get(FeedEntryContent_.content)), joinedKeywords); @@ -156,13 +158,29 @@ public class FeedEntryStatusDAO extends GenericDAO { predicates.add(builder.or(content, title)); query.where(predicates.toArray(new Predicate[0])); + orderBy(query, root, ReadingOrder.desc); - orderBy(query, entryJoin, ReadingOrder.desc); - - TypedQuery q = em.createQuery(query); + TypedQuery q = em.createQuery(query); limit(q, offset, limit); setTimeout(q); - return lazyLoadContent(true, q.getResultList()); + + List list = q.getResultList(); + List results = Lists.newArrayList(); + for (Tuple tuple : list) { + FeedEntry entry = tuple.get(entryAlias); + FeedSubscription subscription = tuple.get(subAlias); + + FeedEntryStatus status = findByEntry(entry, subscription); + if (status == null) { + status = new FeedEntryStatus(); + status.setEntry(entry); + status.setRead(true); + status.setSubscription(subscription); + } + results.add(status); + } + + return lazyLoadContent(true, results); } public List findStarred(User user, ReadingOrder order,