diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java index f58a4d62..c2ae7867 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java @@ -41,11 +41,14 @@ public class FeedEntryDAO extends GenericDAO { return tuples.stream().map(t -> new FeedCapacity(t.get(entry.feed.id), t.get(count))).collect(Collectors.toList()); } + public int delete(Long feedId, long max) { + List list = newQuery().from(entry).where(entry.feed.id.eq(feedId)).limit(max).list(entry); + return delete(list); + } + public int deleteOldEntries(Long feedId, long max) { List list = newQuery().from(entry).where(entry.feed.id.eq(feedId)).orderBy(entry.updated.asc()).limit(max).list(entry); - int deleted = list.size(); - delete(list); - return deleted; + return delete(list); } @AllArgsConstructor diff --git a/src/main/java/com/commafeed/backend/service/DatabaseCleaningService.java b/src/main/java/com/commafeed/backend/service/DatabaseCleaningService.java index 55805b59..48d0936f 100644 --- a/src/main/java/com/commafeed/backend/service/DatabaseCleaningService.java +++ b/src/main/java/com/commafeed/backend/service/DatabaseCleaningService.java @@ -17,6 +17,7 @@ import com.commafeed.backend.dao.FeedEntryDAO; import com.commafeed.backend.dao.FeedEntryDAO.FeedCapacity; import com.commafeed.backend.dao.FeedEntryStatusDAO; import com.commafeed.backend.dao.UnitOfWork; +import com.commafeed.backend.model.Feed; /** * Contains utility methods for cleaning the database @@ -40,7 +41,14 @@ public class DatabaseCleaningService { long total = 0; int deleted = 0; do { - deleted = UnitOfWork.run(sessionFactory, () -> feedDAO.delete(feedDAO.findWithoutSubscriptions(1))); + List feeds = UnitOfWork.run(sessionFactory, () -> feedDAO.findWithoutSubscriptions(1)); + for (Feed feed : feeds) { + int entriesDeleted = 0; + do { + entriesDeleted = UnitOfWork.run(sessionFactory, () -> feedEntryDAO.delete(feed.getId(), BATCH_SIZE)); + } while (entriesDeleted == BATCH_SIZE); + } + deleted = UnitOfWork.run(sessionFactory, () -> feedDAO.delete(feeds)); total += deleted; log.info("removed {} feeds without subscriptions", total); } while (deleted != 0);