diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryService.java b/src/main/java/com/commafeed/backend/dao/FeedEntryService.java index 2072a5e6..03f41694 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryService.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryService.java @@ -8,11 +8,14 @@ import javax.ejb.Stateless; import javax.inject.Inject; import javax.persistence.TypedQuery; +import org.apache.commons.lang.StringUtils; + import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.User; import com.commafeed.frontend.utils.ModelFactory.MF; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; @Stateless @SuppressWarnings("serial") @@ -25,18 +28,37 @@ public class FeedEntryService extends GenericDAO { Feed feed = Iterables.getFirst( feedService.findByField(MF.i(MF.p(Feed.class).getUrl()), url), null); + List guids = Lists.newArrayList(); for (FeedEntry entry : entries) { - FeedEntry existing = Iterables.getFirst( - findByField(MF.i(MF.p(getType()).getGuid()), - entry.getGuid()), null); - if (existing == null) { + guids.add(entry.getGuid()); + } + + List existingEntries = getByGuids(guids); + for (FeedEntry entry : entries) { + boolean found = false; + for (FeedEntry existingEntry : existingEntries) { + if (StringUtils + .equals(entry.getGuid(), existingEntry.getGuid())) { + found = true; + break; + } + } + if (!found) { entry.setFeed(feed); save(entry); } } + feed.setLastUpdated(Calendar.getInstance().getTime()); feed.setMessage(null); - em.merge(feed); + feedService.update(feed); + } + + public List getByGuids(List guids) { + TypedQuery query = em.createNamedQuery("Entry.byGuids", + FeedEntry.class); + query.setParameter("guids", guids); + return query.getResultList(); } public List getEntries(Feed feed, User user, boolean read) { diff --git a/src/main/resources/META-INF/orm.xml b/src/main/resources/META-INF/orm.xml index e1c942cb..99df6e8a 100644 --- a/src/main/resources/META-INF/orm.xml +++ b/src/main/resources/META-INF/orm.xml @@ -1,10 +1,13 @@ - + + select e from FeedEntry e where e.guid in :guids + 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)