diff --git a/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index 70945fa2..4808716f 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -3,6 +3,7 @@ package com.commafeed.backend.dao; import java.time.Instant; import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.apache.commons.collections4.CollectionUtils; import org.hibernate.SessionFactory; @@ -73,10 +74,13 @@ public class FeedEntryStatusDAO extends GenericDAO { return status; } - private FeedEntryStatus fetchTags(User user, FeedEntryStatus status) { - List tags = feedEntryTagDAO.findByEntry(user, status.getEntry()); - status.setTags(tags); - return status; + private void fetchTags(User user, List statuses) { + Map> tagsByEntryIds = feedEntryTagDAO.findByEntries(user, + statuses.stream().map(FeedEntryStatus::getEntry).toList()); + for (FeedEntryStatus status : statuses) { + List tags = tagsByEntryIds.get(status.getEntry().getId()); + status.setTags(tags == null ? List.of() : tags); + } } public List findStarred(User user, Instant newerThan, int offset, int limit, ReadingOrder order, @@ -107,12 +111,9 @@ public class FeedEntryStatusDAO extends GenericDAO { setTimeout(query, config.getApplicationSettings().getQueryTimeout()); List statuses = query.fetch(); - for (FeedEntryStatus status : statuses) { - status.setMarkable(true); - - if (includeContent) { - fetchTags(user, status); - } + statuses.forEach(s -> s.setMarkable(true)); + if (includeContent) { + fetchTags(user, statuses); } return statuses; @@ -190,14 +191,13 @@ public class FeedEntryStatusDAO extends GenericDAO { FeedEntry e = tuple.get(entry); FeedSubscription sub = tuple.get(subscription); FeedEntryStatus s = handleStatus(user, tuple.get(status), sub, e); - - if (includeContent) { - fetchTags(user, s); - } - statuses.add(s); } + if (includeContent) { + fetchTags(user, statuses); + } + return statuses; } diff --git a/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedEntryTagDAO.java b/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedEntryTagDAO.java index 74cb093b..e60ff215 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedEntryTagDAO.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedEntryTagDAO.java @@ -1,6 +1,8 @@ package com.commafeed.backend.dao; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import org.hibernate.SessionFactory; @@ -29,4 +31,12 @@ public class FeedEntryTagDAO extends GenericDAO { public List findByEntry(User user, FeedEntry entry) { return query().selectFrom(tag).where(tag.user.eq(user), tag.entry.eq(entry)).fetch(); } + + public Map> findByEntries(User user, List entries) { + return query().selectFrom(tag) + .where(tag.user.eq(user), tag.entry.in(entries)) + .fetch() + .stream() + .collect(Collectors.groupingBy(t -> t.getEntry().getId())); + } }