From 2db9224ffcb0183c0bcde50dad685a24660d4b74 Mon Sep 17 00:00:00 2001 From: Athou Date: Fri, 21 Mar 2014 11:28:51 +0100 Subject: [PATCH] first clean entries then clean feeds --- .../com/commafeed/backend/ScheduledTasks.java | 1 + .../commafeed/backend/dao/FeedEntryDAO.java | 18 +++++++++++ .../services/DatabaseCleaningService.java | 31 ++++++++++--------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/commafeed/backend/ScheduledTasks.java b/src/main/java/com/commafeed/backend/ScheduledTasks.java index 072709f1..d784585b 100644 --- a/src/main/java/com/commafeed/backend/ScheduledTasks.java +++ b/src/main/java/com/commafeed/backend/ScheduledTasks.java @@ -41,6 +41,7 @@ public class ScheduledTasks { */ @Schedule(hour = "*", persistent = false) private void cleanFeedsAndContents() { + cleaner.cleanEntriesWithoutSubscriptions(); cleaner.cleanFeedsWithoutSubscriptions(); cleaner.cleanContentsWithoutEntries(); } diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java index 1411ab8e..e457e962 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java @@ -6,14 +6,19 @@ import java.util.List; import javax.ejb.Stateless; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import javax.persistence.criteria.SetJoin; import org.apache.commons.codec.digest.DigestUtils; import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.FeedEntry_; +import com.commafeed.backend.model.FeedSubscription; +import com.commafeed.backend.model.FeedSubscription_; import com.commafeed.backend.model.Feed_; import com.google.common.collect.Iterables; @@ -37,6 +42,19 @@ public class FeedEntryDAO extends GenericDAO { return Iterables.getFirst(list, null); } + public List findWithoutSubscriptions(int max) { + CriteriaQuery query = builder.createQuery(getType()); + Root root = query.from(getType()); + + Join feedJoin = root.join(FeedEntry_.feed); + SetJoin subJoin = feedJoin.join(Feed_.subscriptions, JoinType.LEFT); + query.where(builder.isNull(subJoin.get(FeedSubscription_.id))); + TypedQuery q = em.createQuery(query); + q.setMaxResults(max); + + return q.getResultList(); + } + public int delete(Feed feed, int max) { CriteriaQuery query = builder.createQuery(getType()); diff --git a/src/main/java/com/commafeed/backend/services/DatabaseCleaningService.java b/src/main/java/com/commafeed/backend/services/DatabaseCleaningService.java index 3186a7ca..21239b8f 100644 --- a/src/main/java/com/commafeed/backend/services/DatabaseCleaningService.java +++ b/src/main/java/com/commafeed/backend/services/DatabaseCleaningService.java @@ -16,6 +16,7 @@ import com.commafeed.backend.dao.FeedEntryDAO; import com.commafeed.backend.dao.FeedEntryStatusDAO; import com.commafeed.backend.dao.FeedSubscriptionDAO; import com.commafeed.backend.model.Feed; +import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.FeedEntryStatus; import com.commafeed.backend.model.FeedSubscription; @@ -45,14 +46,27 @@ public class DatabaseCleaningService { @Inject ApplicationSettingsService applicationSettingsService; + + public long cleanEntriesWithoutSubscriptions() { + log.info("cleaning entries without subscriptions"); + long total = 0; + int deleted = 0; + do { + List entries = feedEntryDAO.findWithoutSubscriptions(BATCH_SIZE); + deleted = feedEntryDAO.delete(entries); + total += deleted; + log.info("removed {} entries without subscriptions", total); + } while (deleted != 0); + log.info("cleanup done: {} entries without subscriptions deleted", total); + return total; + } public long cleanFeedsWithoutSubscriptions() { log.info("cleaning feeds without subscriptions"); long total = 0; int deleted = 0; do { - List feeds = feedDAO.findWithoutSubscriptions(1); - cleanEntriesForFeedsWithoutSubscriptions(feeds); + List feeds = feedDAO.findWithoutSubscriptions(BATCH_SIZE); deleted = feedDAO.delete(feeds); total += deleted; log.info("removed {} feeds without subscriptions", total); @@ -61,19 +75,6 @@ public class DatabaseCleaningService { return total; } - private long cleanEntriesForFeedsWithoutSubscriptions(List feeds) { - long total = 0; - for (Feed feed : feeds) { - int deleted = 0; - do { - deleted = feedEntryDAO.delete(feed, BATCH_SIZE); - total += deleted; - log.info("removed {} entries for feed {}", total, feed.getId()); - } while (deleted != 0); - } - return total; - } - public long cleanContentsWithoutEntries() { log.info("cleaning contents without entries"); long total = 0;