diff --git a/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedDAO.java b/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedDAO.java index 0917732f..bd32824d 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedDAO.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedDAO.java @@ -15,23 +15,30 @@ import com.commafeed.backend.model.QFeed; import com.commafeed.backend.model.QFeedSubscription; import com.google.common.collect.Iterables; import com.querydsl.jpa.JPAExpressions; +import com.querydsl.jpa.impl.JPAQuery; @Singleton public class FeedDAO extends GenericDAO { private final QFeed feed = QFeed.feed; + private final QFeedSubscription subscription = QFeedSubscription.feedSubscription; @Inject public FeedDAO(SessionFactory sessionFactory) { super(sessionFactory); } - public List findNextUpdatable(int count) { - return query().selectFrom(feed) - .where(feed.disabledUntil.isNull().or(feed.disabledUntil.lt(new Date()))) - .orderBy(feed.disabledUntil.asc()) - .limit(count) - .fetch(); + public List findNextUpdatable(int count, Date lastLoginThreshold) { + JPAQuery query = query().selectFrom(feed).where(feed.disabledUntil.isNull().or(feed.disabledUntil.lt(new Date()))); + if (lastLoginThreshold != null) { + query.where(JPAExpressions.selectOne() + .from(subscription) + .join(subscription.user) + .where(subscription.feed.id.eq(feed.id), subscription.user.lastLogin.gt(lastLoginThreshold)) + .exists()); + } + + return query.orderBy(feed.disabledUntil.asc()).limit(count).fetch(); } public void setDisabledUntil(List feedIds, Date date) { diff --git a/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java b/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java index 9e6fc044..65a86746 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/feed/FeedRefreshEngine.java @@ -168,7 +168,10 @@ public class FeedRefreshEngine implements Managed { private List getNextUpdatableFeeds(int max) { return unitOfWork.call(() -> { - List feeds = feedDAO.findNextUpdatable(max); + Date lastLoginThreshold = Boolean.TRUE.equals(config.getApplicationSettings().getHeavyLoad()) + ? DateUtils.addDays(new Date(), -30) + : null; + List feeds = feedDAO.findNextUpdatable(max, lastLoginThreshold); // update disabledUntil to prevent feeds from being returned again by feedDAO.findNextUpdatable() Date nextUpdateDate = DateUtils.addMinutes(new Date(), config.getApplicationSettings().getRefreshIntervalMinutes()); feedDAO.setDisabledUntil(feeds.stream().map(AbstractModel::getId).collect(Collectors.toList()), nextUpdateDate);