diff --git a/src/main/java/com/commafeed/backend/DatabaseCleaner.java b/src/main/java/com/commafeed/backend/DatabaseCleaner.java index f5dda910..fdb503c0 100644 --- a/src/main/java/com/commafeed/backend/DatabaseCleaner.java +++ b/src/main/java/com/commafeed/backend/DatabaseCleaner.java @@ -12,11 +12,16 @@ public class DatabaseCleaner { @Inject FeedEntryStatusDAO feedEntryStatusDAO; - public int cleanOlderThan(long value, TimeUnit unit) { + public long cleanOlderThan(long value, TimeUnit unit) { Calendar cal = Calendar.getInstance(); cal.add(Calendar.MINUTE, -1 * (int) unit.toMinutes(value)); - return feedEntryStatusDAO.delete(cal.getTime()); - + long total = 0; + int deleted = -1; + do { + deleted = feedEntryStatusDAO.delete(cal.getTime(), 100); + total += deleted; + } while (deleted != 0); + return total; } } diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index bbb1e769..21e2972f 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -307,10 +307,30 @@ public class FeedEntryStatusDAO extends GenericDAO { query.setHint("javax.persistence.query.timeout", 20000); } - public int delete(Date olderThan) { - Query query = em.createNamedQuery("EntryStatus.deleteOlderThan"); - query.setParameter("olderThan", olderThan); - int deleted = query.executeUpdate(); + public int delete(Date olderThan, int max) { + CriteriaQuery query = builder.createQuery(Long.class); + Root root = query.from(getType()); + query.select(root.get(FeedEntryStatus_.id)); + + Join entryJoin = root + .join(FeedEntryStatus_.entry); + + Predicate p1 = builder.lessThan(entryJoin.get(FeedEntry_.inserted), + olderThan); + Predicate p2 = builder.isFalse(root.get(FeedEntryStatus_.starred)); + + query.where(p1, p2); + + TypedQuery q = em.createQuery(query); + q.setMaxResults(max); + List ids = q.getResultList(); + + int deleted = 0; + if (ids.isEmpty() == false) { + Query deleteQuery = em.createNamedQuery("EntryStatus.deleteByIds"); + deleteQuery.setParameter("ids", ids); + deleted = deleteQuery.executeUpdate(); + } return deleted; } diff --git a/src/main/java/com/commafeed/frontend/rest/resources/AdminREST.java b/src/main/java/com/commafeed/frontend/rest/resources/AdminREST.java index 7bbe1768..ca8cc00c 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/AdminREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/AdminREST.java @@ -194,7 +194,7 @@ public class AdminREST extends AbstractResourceREST { @Path("/cleanup") @GET public Response cleanup() { - int deleted = cleaner.cleanOlderThan(30, TimeUnit.DAYS); + long deleted = cleaner.cleanOlderThan(30, TimeUnit.DAYS); return Response.ok("ok: " + deleted).build(); } diff --git a/src/main/resources/META-INF/orm.xml b/src/main/resources/META-INF/orm.xml index 6d0781b3..e89099b9 100644 --- a/src/main/resources/META-INF/orm.xml +++ b/src/main/resources/META-INF/orm.xml @@ -9,8 +9,8 @@ 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 - - delete from FeedEntryStatus s where s.id in (select s2.id from FeedEntryStatus s2 where s2.starred = false and s2.entry.inserted < :olderThan) + + delete from FeedEntryStatus s where s.id in :ids \ No newline at end of file