From a5f84a3f6d63ba4c902879f49017606a8588e217 Mon Sep 17 00:00:00 2001 From: Athou Date: Sat, 4 Jul 2026 17:56:52 +0200 Subject: [PATCH] search now also works for starred entries (#2217) --- .../backend/dao/FeedEntryStatusDAO.java | 35 ++++++++++++------- .../backend/service/FeedEntryService.java | 2 +- .../frontend/resource/CategoryREST.java | 3 +- .../frontend/resource/fever/FeverREST.java | 3 +- 4 files changed, 27 insertions(+), 16 deletions(-) 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 c709c1f9..6a816e93 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 @@ -83,12 +83,16 @@ public class FeedEntryStatusDAO extends GenericDAO { } } - public List findStarred(User user, Instant newerThan, int offset, int limit, ReadingOrder order, - boolean includeContent) { + public List findStarred(User user, List keywords, Instant newerThan, int offset, int limit, + ReadingOrder order, boolean includeContent) { JPAQuery query = query().selectFrom(STATUS).where(STATUS.user.eq(user), STATUS.starred.isTrue()); - if (includeContent) { + if (includeContent || CollectionUtils.isNotEmpty(keywords)) { query.join(STATUS.entry).fetchJoin(); - query.join(STATUS.entry.content).fetchJoin(); + query.join(STATUS.entry.content, CONTENT).fetchJoin(); + } + + if (CollectionUtils.isNotEmpty(keywords)) { + applyKeywordsFilter(query, keywords); } if (newerThan != null) { @@ -132,16 +136,9 @@ public class FeedEntryStatusDAO extends GenericDAO { if (includeContent || CollectionUtils.isNotEmpty(keywords)) { query.join(ENTRY.content, CONTENT).fetchJoin(); } + if (CollectionUtils.isNotEmpty(keywords)) { - for (FeedEntryKeyword keyword : keywords) { - BooleanBuilder or = new BooleanBuilder(); - or.or(CONTENT.content.containsIgnoreCase(keyword.keyword())); - or.or(CONTENT.title.containsIgnoreCase(keyword.keyword())); - if (keyword.mode() == Mode.EXCLUDE) { - or.not(); - } - query.where(or); - } + applyKeywordsFilter(query, keywords); } if (unreadOnly && tag == null) { @@ -202,6 +199,18 @@ public class FeedEntryStatusDAO extends GenericDAO { return statuses; } + private void applyKeywordsFilter(JPAQuery query, List keywords) { + for (FeedEntryKeyword keyword : keywords) { + BooleanBuilder or = new BooleanBuilder(); + or.or(CONTENT.content.containsIgnoreCase(keyword.keyword())); + or.or(CONTENT.title.containsIgnoreCase(keyword.keyword())); + if (keyword.mode() == Mode.EXCLUDE) { + or.not(); + } + query.where(or); + } + } + public UnreadCount getUnreadCount(FeedSubscription sub) { JPAQuery query = query().select(ENTRY.count(), ENTRY.published.max()) .from(ENTRY) diff --git a/commafeed-server/src/main/java/com/commafeed/backend/service/FeedEntryService.java b/commafeed-server/src/main/java/com/commafeed/backend/service/FeedEntryService.java index a5f8ac8f..ac5b1d59 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/service/FeedEntryService.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/service/FeedEntryService.java @@ -120,7 +120,7 @@ public class FeedEntryService { } public void markStarredEntries(User user, Instant olderThan, Instant insertedBefore) { - List statuses = feedEntryStatusDAO.findStarred(user, null, -1, -1, null, false); + List statuses = feedEntryStatusDAO.findStarred(user, null, null, -1, -1, null, false); markList(statuses, olderThan, insertedBefore); } diff --git a/commafeed-server/src/main/java/com/commafeed/frontend/resource/CategoryREST.java b/commafeed-server/src/main/java/com/commafeed/frontend/resource/CategoryREST.java index ed855b09..b1e2fdb7 100644 --- a/commafeed-server/src/main/java/com/commafeed/frontend/resource/CategoryREST.java +++ b/commafeed-server/src/main/java/com/commafeed/frontend/resource/CategoryREST.java @@ -158,7 +158,8 @@ public class CategoryREST { } else if (STARRED.equals(id)) { entries.setName("Starred"); - List starred = feedEntryStatusDAO.findStarred(user, newerThanDate, offset, limit + 1, order, true); + List starred = feedEntryStatusDAO.findStarred(user, entryKeywords, newerThanDate, offset, limit + 1, order, + true); for (FeedEntryStatus status : starred) { entries.getEntries().add(Entry.build(status, config.imageProxyEnabled())); } diff --git a/commafeed-server/src/main/java/com/commafeed/frontend/resource/fever/FeverREST.java b/commafeed-server/src/main/java/com/commafeed/frontend/resource/fever/FeverREST.java index 3bd9c089..93e6a582 100644 --- a/commafeed-server/src/main/java/com/commafeed/frontend/resource/fever/FeverREST.java +++ b/commafeed-server/src/main/java/com/commafeed/frontend/resource/fever/FeverREST.java @@ -260,7 +260,8 @@ public class FeverREST { } private List buildSavedItemIds(User user) { - List statuses = feedEntryStatusDAO.findStarred(user, null, 0, SAVED_ITEM_IDS_BATCH_SIZE, ReadingOrder.DESC, false); + List statuses = feedEntryStatusDAO.findStarred(user, null, null, 0, SAVED_ITEM_IDS_BATCH_SIZE, ReadingOrder.DESC, + false); return statuses.stream().map(s -> s.getEntry().getId()).toList(); }