forked from Archives/Athou_commafeed
faster existing entry detection
This commit is contained in:
@@ -6,54 +6,41 @@ import java.util.List;
|
|||||||
import javax.ejb.Stateless;
|
import javax.ejb.Stateless;
|
||||||
import javax.persistence.TypedQuery;
|
import javax.persistence.TypedQuery;
|
||||||
import javax.persistence.criteria.CriteriaQuery;
|
import javax.persistence.criteria.CriteriaQuery;
|
||||||
import javax.persistence.criteria.JoinType;
|
|
||||||
import javax.persistence.criteria.Root;
|
import javax.persistence.criteria.Root;
|
||||||
import javax.persistence.criteria.SetJoin;
|
import javax.persistence.criteria.SetJoin;
|
||||||
|
|
||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
import org.hibernate.Hibernate;
|
|
||||||
|
|
||||||
import com.commafeed.backend.model.Feed;
|
import com.commafeed.backend.model.Feed;
|
||||||
import com.commafeed.backend.model.FeedEntry;
|
import com.commafeed.backend.model.FeedEntry;
|
||||||
import com.commafeed.backend.model.FeedEntry_;
|
import com.commafeed.backend.model.FeedEntry_;
|
||||||
import com.commafeed.backend.model.Feed_;
|
import com.commafeed.backend.model.Feed_;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
@Stateless
|
@Stateless
|
||||||
public class FeedEntryDAO extends GenericDAO<FeedEntry> {
|
public class FeedEntryDAO extends GenericDAO<FeedEntry> {
|
||||||
|
|
||||||
public List<FeedEntry> findByGuid(String guid) {
|
public static class EntryWithFeed {
|
||||||
String hash = DigestUtils.sha1Hex(guid);
|
public FeedEntry entry;
|
||||||
|
public Feed feed;
|
||||||
|
|
||||||
CriteriaQuery<FeedEntry> query = builder.createQuery(getType());
|
public EntryWithFeed(FeedEntry entry, Feed feed) {
|
||||||
Root<FeedEntry> root = query.from(getType());
|
this.entry = entry;
|
||||||
|
this.feed = feed;
|
||||||
query.where(builder.equal(root.get(FeedEntry_.guidHash), hash));
|
}
|
||||||
|
|
||||||
TypedQuery<FeedEntry> q = em.createQuery(query);
|
|
||||||
List<FeedEntry> list = q.getResultList();
|
|
||||||
return list;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<FeedEntry> findByGuids(List<String> guids) {
|
public EntryWithFeed findExisting(String guid, String url, Long feedId) {
|
||||||
List<String> hashes = Lists.newArrayList();
|
|
||||||
for (String guid : guids) {
|
|
||||||
hashes.add(DigestUtils.sha1Hex(guid));
|
|
||||||
}
|
|
||||||
|
|
||||||
CriteriaQuery<FeedEntry> query = builder.createQuery(getType());
|
TypedQuery<EntryWithFeed> q = em.createNamedQuery(
|
||||||
Root<FeedEntry> root = query.from(getType());
|
"EntryStatus.existing", EntryWithFeed.class);
|
||||||
|
q.setParameter("guidHash", DigestUtils.sha1Hex(guid));
|
||||||
|
q.setParameter("url", url);
|
||||||
|
q.setParameter("feedId", feedId);
|
||||||
|
|
||||||
query.distinct(true);
|
List<EntryWithFeed> resultList = q.getResultList();
|
||||||
query.where(root.get(FeedEntry_.guidHash).in(hashes));
|
EntryWithFeed ewf = Iterables.getFirst(resultList, null);
|
||||||
root.fetch(FeedEntry_.feeds, JoinType.LEFT);
|
return ewf;
|
||||||
|
|
||||||
TypedQuery<FeedEntry> q = em.createQuery(query);
|
|
||||||
List<FeedEntry> list = q.getResultList();
|
|
||||||
for (FeedEntry entry : list) {
|
|
||||||
Hibernate.initialize(entry.getFeeds());
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<FeedEntry> findByFeed(Feed feed, int offset, int limit) {
|
public List<FeedEntry> findByFeed(Feed feed, int offset, int limit) {
|
||||||
|
|||||||
@@ -6,10 +6,9 @@ import java.util.List;
|
|||||||
import javax.ejb.Stateless;
|
import javax.ejb.Stateless;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.hibernate.Hibernate;
|
|
||||||
|
|
||||||
import com.commafeed.backend.MetricsBean;
|
import com.commafeed.backend.MetricsBean;
|
||||||
import com.commafeed.backend.dao.FeedEntryDAO;
|
import com.commafeed.backend.dao.FeedEntryDAO;
|
||||||
|
import com.commafeed.backend.dao.FeedEntryDAO.EntryWithFeed;
|
||||||
import com.commafeed.backend.dao.FeedEntryStatusDAO;
|
import com.commafeed.backend.dao.FeedEntryStatusDAO;
|
||||||
import com.commafeed.backend.dao.FeedSubscriptionDAO;
|
import com.commafeed.backend.dao.FeedSubscriptionDAO;
|
||||||
import com.commafeed.backend.feeds.FeedUtils;
|
import com.commafeed.backend.feeds.FeedUtils;
|
||||||
@@ -38,11 +37,11 @@ public class FeedUpdateService {
|
|||||||
public void updateEntry(Feed feed, FeedEntry entry,
|
public void updateEntry(Feed feed, FeedEntry entry,
|
||||||
List<FeedSubscription> subscriptions) {
|
List<FeedSubscription> subscriptions) {
|
||||||
|
|
||||||
FeedEntry foundEntry = FeedUtils.findEntry(
|
EntryWithFeed existing = feedEntryDAO.findExisting(entry.getGuid(),
|
||||||
feedEntryDAO.findByGuid(entry.getGuid()), entry);
|
entry.getUrl(), feed.getId());
|
||||||
|
|
||||||
FeedEntry update = null;
|
FeedEntry update = null;
|
||||||
if (foundEntry == null) {
|
if (existing == null) {
|
||||||
FeedEntryContent content = entry.getContent();
|
FeedEntryContent content = entry.getContent();
|
||||||
content.setTitle(FeedUtils.truncate(
|
content.setTitle(FeedUtils.truncate(
|
||||||
FeedUtils.handleContent(content.getTitle(), feed.getLink()),
|
FeedUtils.handleContent(content.getTitle(), feed.getLink()),
|
||||||
@@ -54,12 +53,9 @@ public class FeedUpdateService {
|
|||||||
entry.getFeeds().add(feed);
|
entry.getFeeds().add(feed);
|
||||||
|
|
||||||
update = entry;
|
update = entry;
|
||||||
} else {
|
} else if (existing.feed == null) {
|
||||||
Hibernate.initialize(foundEntry.getFeeds());
|
existing.entry.getFeeds().add(feed);
|
||||||
if (FeedUtils.findFeed(foundEntry.getFeeds(), feed) == null) {
|
update = existing.entry;
|
||||||
foundEntry.getFeeds().add(feed);
|
|
||||||
update = foundEntry;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update != null) {
|
if (update != null) {
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
<query>select sub.id, count(s) from FeedEntryStatus s LEFT JOIN s.subscription sub where sub.user=:user and s.read=false group by sub.id</query>
|
<query>select sub.id, count(s) from FeedEntryStatus s LEFT JOIN s.subscription sub where sub.user=:user and s.read=false group by sub.id</query>
|
||||||
</named-query>
|
</named-query>
|
||||||
|
|
||||||
|
<named-query name="EntryStatus.existing">
|
||||||
|
<query>select new com.commafeed.backend.dao.FeedEntryDAO$EntryWithFeed(e, f) FROM FeedEntry e LEFT JOIN e.feeds f WITH f.id = :feedId where e.guidHash = :guidHash and e.url = :url</query>
|
||||||
|
</named-query>
|
||||||
|
|
||||||
<named-query name="EntryStatus.deleteByIds">
|
<named-query name="EntryStatus.deleteByIds">
|
||||||
<query>delete from FeedEntryStatus s where s.id in :ids</query>
|
<query>delete from FeedEntryStatus s where s.id in :ids</query>
|
||||||
</named-query>
|
</named-query>
|
||||||
|
|||||||
Reference in New Issue
Block a user