diff --git a/pom.xml b/pom.xml index 103f54e9..4db521a4 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,7 @@ 1.6 1.6 + -proc:none @@ -89,6 +90,52 @@ + + org.bsc.maven + maven-processor-plugin + 2.2.1 + + + process + + process + + generate-sources + + + org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + + target/metamodel + + + + + + org.hibernate + hibernate-jpamodelgen + 1.2.0.Final + + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.8 + + + add-source + generate-sources + + add-source + + + + target/metamodel + + + + + diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java index 64a26898..b472312e 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java @@ -9,13 +9,19 @@ import javax.inject.Inject; import javax.persistence.NoResultException; import javax.persistence.Query; import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import org.apache.commons.lang.StringUtils; import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedCategory; import com.commafeed.backend.model.FeedEntryStatus; +import com.commafeed.backend.model.FeedEntryStatus_; +import com.commafeed.backend.model.FeedEntry_; import com.commafeed.backend.model.FeedSubscription; +import com.commafeed.backend.model.FeedSubscription_; import com.commafeed.backend.model.User; import com.commafeed.frontend.utils.ModelFactory.MF; import com.google.api.client.util.Lists; @@ -56,20 +62,38 @@ public class FeedEntryStatusService extends GenericDAO { public List getStatusesByKeywords(User user, String keywords, int offset, int limit) { - TypedQuery query = em.createNamedQuery( - "EntryStatus.allByKeywords", FeedEntryStatus.class); - query.setParameter("user", user); String joinedKeywords = StringUtils.join( keywords.toLowerCase().split(" "), "%"); - query.setParameter("keywords", "%" + joinedKeywords + "%"); + joinedKeywords = "%" + joinedKeywords + "%"; + + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + List predicates = Lists.newArrayList(); + predicates.add(builder.equal(root.get(FeedEntryStatus_.subscription) + .get(FeedSubscription_.user), user)); + + Predicate content = builder.like( + builder.lower(root.get(FeedEntryStatus_.entry).get( + FeedEntry_.content)), joinedKeywords); + Predicate title = builder.like( + builder.lower(root.get(FeedEntryStatus_.entry).get( + FeedEntry_.title)), joinedKeywords); + predicates.add(builder.or(content, title)); + + query.where(predicates.toArray(new Predicate[0])); + query.orderBy(builder.desc(root.get(FeedEntryStatus_.entry).get( + FeedEntry_.updated))); + + TypedQuery q = em.createQuery(query); if (offset > -1) { - query.setFirstResult(offset); + q.setFirstResult(offset); } if (limit > -1) { - query.setMaxResults(limit); + q.setMaxResults(limit); } - return query.getResultList(); + return q.getResultList(); } public List getStatuses(User user, boolean unreadOnly) { @@ -78,18 +102,27 @@ public class FeedEntryStatusService extends GenericDAO { public List getStatuses(User user, boolean unreadOnly, int offset, int limit) { - String queryName = unreadOnly ? "EntryStatus.unread" - : "EntryStatus.all"; - TypedQuery query = em.createNamedQuery(queryName, - FeedEntryStatus.class); - query.setParameter("user", user); + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + List predicates = Lists.newArrayList(); + predicates.add(builder.equal(root.get(FeedEntryStatus_.subscription) + .get(FeedSubscription_.user), user)); + if (unreadOnly) { + predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); + } + query.where(predicates.toArray(new Predicate[0])); + query.orderBy(builder.desc(root.get(FeedEntryStatus_.entry).get( + FeedEntry_.updated))); + + TypedQuery q = em.createQuery(query); if (offset > -1) { - query.setFirstResult(offset); + q.setFirstResult(offset); } if (limit > -1) { - query.setMaxResults(limit); + q.setMaxResults(limit); } - return query.getResultList(); + return q.getResultList(); } /** @@ -115,20 +148,30 @@ public class FeedEntryStatusService extends GenericDAO { public List getStatuses(Feed feed, User user, boolean unreadOnly, int offset, int limit) { - String queryName = unreadOnly ? "EntryStatus.unreadByFeed" - : "EntryStatus.allByFeed"; - TypedQuery query = em.createNamedQuery(queryName, - FeedEntryStatus.class); - query.setParameter("feed", feed); - query.setParameter("user", user); + + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + List predicates = Lists.newArrayList(); + predicates.add(builder.equal(root.get(FeedEntryStatus_.subscription) + .get(FeedSubscription_.user), user)); + predicates.add(builder.equal(root.get(FeedEntryStatus_.subscription) + .get(FeedSubscription_.feed), feed)); + if (unreadOnly) { + predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); + } + query.where(predicates.toArray(new Predicate[0])); + query.orderBy(builder.desc(root.get(FeedEntryStatus_.entry).get( + FeedEntry_.updated))); + + TypedQuery q = em.createQuery(query); if (offset > -1) { - query.setFirstResult(offset); + q.setFirstResult(offset); } if (limit > -1) { - query.setMaxResults(limit); + q.setMaxResults(limit); } - - return query.getResultList(); + return q.getResultList(); } public List getStatuses(List categories, @@ -138,19 +181,30 @@ public class FeedEntryStatusService extends GenericDAO { public List getStatuses(List categories, User user, boolean unreadOnly, int offset, int limit) { - String queryName = unreadOnly ? "EntryStatus.unreadByCategories" - : "EntryStatus.allByCategories"; - TypedQuery query = em.createNamedQuery(queryName, - FeedEntryStatus.class); - query.setParameter("categories", categories); - query.setParameter("user", user); + + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + List predicates = Lists.newArrayList(); + predicates.add(builder.equal(root.get(FeedEntryStatus_.subscription) + .get(FeedSubscription_.user), user)); + predicates.add(root.get(FeedEntryStatus_.subscription) + .get(FeedSubscription_.category).in(categories)); + if (unreadOnly) { + predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); + } + query.where(predicates.toArray(new Predicate[0])); + query.orderBy(builder.desc(root.get(FeedEntryStatus_.entry).get( + FeedEntry_.updated))); + + TypedQuery q = em.createQuery(query); if (offset > -1) { - query.setFirstResult(offset); + q.setFirstResult(offset); } if (limit > -1) { - query.setMaxResults(limit); + q.setMaxResults(limit); } - return query.getResultList(); + return q.getResultList(); } public void markFeedEntries(User user, Feed feed, Date olderThan) { diff --git a/src/main/resources/META-INF/orm.xml b/src/main/resources/META-INF/orm.xml index 1a9c0353..be8f7306 100644 --- a/src/main/resources/META-INF/orm.xml +++ b/src/main/resources/META-INF/orm.xml @@ -8,37 +8,9 @@ select u FROM User u WHERE lower(u.name)=:name - - - select s from FeedEntryStatus s where s.subscription.user=:user and s.id=:id - - - select s from FeedEntryStatus s where s.subscription.user=:user and s.read=false order by s.entry.updated desc - - - select s from FeedEntryStatus s where s.subscription.user=:user order by s.entry.updated desc - - - - select s from FeedEntryStatus s where s.subscription.user=:user and s.subscription.feed=:feed and s.read=false order by s.entry.updated desc - select s.subscription.id, count(s) from FeedEntryStatus s where s.subscription.user=:user and s.read=false group by s.subscription.id - - select s from FeedEntryStatus s where s.subscription.user=:user and s.subscription.feed=:feed order by s.entry.updated desc - - - select s from FeedEntryStatus s where s.subscription.user=:user and s.subscription.category in (:categories) and s.read=false order by s.entry.updated desc - - - select s from FeedEntryStatus s where s.subscription.user=:user and s.subscription.category in (:categories) order by s.entry.updated desc - - - - select s from FeedEntryStatus s where s.subscription.user=:user and (lower(s.entry.content) like :keywords or lower(s.entry.title) like :keywords) order by s.entry.updated desc - - \ No newline at end of file