From feda8ca8345547a44cd26494dc155ed7086d6f28 Mon Sep 17 00:00:00 2001 From: Athou Date: Sat, 8 Jun 2013 14:09:46 +0200 Subject: [PATCH] optional query parameter to filter out old entries from results --- .../backend/dao/FeedEntryStatusDAO.java | 45 ++++++++++++++----- .../com/commafeed/frontend/model/Entries.java | 13 +++++- .../com/commafeed/frontend/model/Entry.java | 12 +++++ .../pages/NextUnreadRedirectPage.java | 4 +- .../frontend/rest/resources/CategoryREST.java | 23 +++++++--- .../frontend/rest/resources/FeedREST.java | 17 +++++-- src/main/resources/log4j.properties | 1 + src/main/webapp/js/controllers.js | 2 +- 8 files changed, 94 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index e7c36be3..64300b29 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -96,11 +96,11 @@ public class FeedEntryStatusDAO extends GenericDAO { public List findStarred(User user, ReadingOrder order, boolean includeContent) { - return findStarred(user, -1, -1, order, includeContent); + return findStarred(user, null, -1, -1, order, includeContent); } - public List findStarred(User user, int offset, int limit, - ReadingOrder order, boolean includeContent) { + public List findStarred(User user, Date newerThan, + int offset, int limit, ReadingOrder order, boolean includeContent) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); @@ -118,6 +118,11 @@ public class FeedEntryStatusDAO extends GenericDAO { predicates.add(builder.equal(root.get(FeedEntryStatus_.starred), true)); query.where(predicates.toArray(new Predicate[0])); + if (newerThan != null) { + predicates.add(builder.greaterThanOrEqualTo( + entryJoin.get(FeedEntry_.inserted), newerThan)); + } + orderBy(query, entryJoin, order); TypedQuery q = em.createQuery(query); @@ -127,11 +132,12 @@ public class FeedEntryStatusDAO extends GenericDAO { public List findAll(User user, boolean unreadOnly, ReadingOrder order, boolean includeContent) { - return findAll(user, unreadOnly, -1, -1, order, includeContent); + return findAll(user, unreadOnly, null, -1, -1, order, includeContent); } public List findAll(User user, boolean unreadOnly, - int offset, int limit, ReadingOrder order, boolean includeContent) { + Date newerThan, int offset, int limit, ReadingOrder order, + boolean includeContent) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); @@ -148,6 +154,11 @@ public class FeedEntryStatusDAO extends GenericDAO { predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); } + if (newerThan != null) { + predicates.add(builder.greaterThanOrEqualTo( + entryJoin.get(FeedEntry_.inserted), newerThan)); + } + query.where(predicates.toArray(new Predicate[0])); orderBy(query, entryJoin, order); @@ -158,12 +169,13 @@ public class FeedEntryStatusDAO extends GenericDAO { public List findByFeed(Feed feed, User user, boolean unreadOnly, ReadingOrder order, boolean includeContent) { - return findByFeed(feed, user, unreadOnly, -1, -1, order, includeContent); + return findByFeed(feed, user, unreadOnly, null, -1, -1, order, + includeContent); } public List findByFeed(Feed feed, User user, - boolean unreadOnly, int offset, int limit, ReadingOrder order, - boolean includeContent) { + boolean unreadOnly, Date newerThan, int offset, int limit, + ReadingOrder order, boolean includeContent) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); @@ -183,6 +195,11 @@ public class FeedEntryStatusDAO extends GenericDAO { predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); } + if (newerThan != null) { + predicates.add(builder.greaterThanOrEqualTo( + entryJoin.get(FeedEntry_.inserted), newerThan)); + } + query.where(predicates.toArray(new Predicate[0])); orderBy(query, entryJoin, order); @@ -195,13 +212,14 @@ public class FeedEntryStatusDAO extends GenericDAO { public List findByCategories( List categories, User user, boolean unreadOnly, ReadingOrder order, boolean includeContent) { - return findByCategories(categories, user, unreadOnly, -1, -1, order, - includeContent); + return findByCategories(categories, user, unreadOnly, null, -1, -1, + order, includeContent); } public List findByCategories( List categories, User user, boolean unreadOnly, - int offset, int limit, ReadingOrder order, boolean includeContent) { + Date newerThan, int offset, int limit, ReadingOrder order, + boolean includeContent) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); @@ -220,6 +238,11 @@ public class FeedEntryStatusDAO extends GenericDAO { predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); } + if (newerThan != null) { + predicates.add(builder.greaterThanOrEqualTo( + entryJoin.get(FeedEntry_.inserted), newerThan)); + } + query.where(predicates.toArray(new Predicate[0])); orderBy(query, entryJoin, order); diff --git a/src/main/java/com/commafeed/frontend/model/Entries.java b/src/main/java/com/commafeed/frontend/model/Entries.java index 709e25d1..83820925 100644 --- a/src/main/java/com/commafeed/frontend/model/Entries.java +++ b/src/main/java/com/commafeed/frontend/model/Entries.java @@ -26,9 +26,12 @@ public class Entries implements Serializable { @ApiProperty("times the server tried to refresh the feed and failed") private int errorCount; - @ApiProperty("list generation Timestamp") + @ApiProperty("list generation timestamp") private long timestamp; + @ApiProperty("if the query has more elements") + private boolean hasMore; + @ApiProperty("list of entries") private List entries = Lists.newArrayList(); @@ -72,4 +75,12 @@ public class Entries implements Serializable { this.timestamp = timestamp; } + public boolean isHasMore() { + return hasMore; + } + + public void setHasMore(boolean hasMore) { + this.hasMore = hasMore; + } + } diff --git a/src/main/java/com/commafeed/frontend/model/Entry.java b/src/main/java/com/commafeed/frontend/model/Entry.java index 9a5598bf..d83d1ddd 100644 --- a/src/main/java/com/commafeed/frontend/model/Entry.java +++ b/src/main/java/com/commafeed/frontend/model/Entry.java @@ -37,6 +37,7 @@ public class Entry implements Serializable { entry.setEnclosureType(status.getEntry().getContent() .getEnclosureType()); entry.setDate(feedEntry.getUpdated()); + entry.setInsertedDate(feedEntry.getInserted()); entry.setUrl(feedEntry.getUrl()); entry.setRead(status.isRead()); @@ -93,6 +94,9 @@ public class Entry implements Serializable { @ApiProperty("entry publication date") private Date date; + @ApiProperty("entry insertion date in the database") + private Date insertedDate; + @ApiProperty("feed id") private String feedId; @@ -253,4 +257,12 @@ public class Entry implements Serializable { this.rtl = rtl; } + public Date getInsertedDate() { + return insertedDate; + } + + public void setInsertedDate(Date insertedDate) { + this.insertedDate = insertedDate; + } + } diff --git a/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java b/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java index aa2b9846..473a7e71 100644 --- a/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java +++ b/src/main/java/com/commafeed/frontend/pages/NextUnreadRedirectPage.java @@ -41,7 +41,7 @@ public class NextUnreadRedirectPage extends WebPage { List statuses = null; if (StringUtils.isBlank(categoryId) || CategoryREST.ALL.equals(categoryId)) { - statuses = feedEntryStatusDAO.findAll(user, true, 0, 1, + statuses = feedEntryStatusDAO.findAll(user, true, null, 0, 1, ReadingOrder.desc, true); } else { FeedCategory category = feedCategoryDAO.findById(user, @@ -50,7 +50,7 @@ public class NextUnreadRedirectPage extends WebPage { List children = feedCategoryDAO .findAllChildrenCategories(user, category); statuses = feedEntryStatusDAO.findByCategories(children, user, - true, 0, 1, ReadingOrder.desc, false); + true, null, 0, 1, ReadingOrder.desc, false); } } diff --git a/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java b/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java index d30340b0..c268611d 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/CategoryREST.java @@ -65,6 +65,7 @@ public class CategoryREST extends AbstractResourceREST { public Response getCategoryEntries( @ApiParam(value = "id of the category, 'all' or 'starred'", required = true) @QueryParam("id") String id, @ApiParam(value = "all entries or only unread ones", allowableValues = "all,unread", required = true) @QueryParam("readType") ReadType readType, + @ApiParam(value = "only entries newer than this") @QueryParam("newerThan") Long newerThan, @ApiParam(value = "offset for paging") @DefaultValue("0") @QueryParam("offset") int offset, @ApiParam(value = "limit for paging, default 20, maximum 50") @DefaultValue("20") @QueryParam("limit") int limit, @ApiParam(value = "date ordering", allowableValues = "asc,desc") @QueryParam("order") @DefaultValue("desc") ReadingOrder order) { @@ -78,11 +79,15 @@ public class CategoryREST extends AbstractResourceREST { if (StringUtils.isBlank(id)) { id = ALL; } + + Date newerThanDate = newerThan == null ? null : new Date( + Long.valueOf(newerThan)); if (ALL.equals(id)) { entries.setName("All"); List unreadEntries = feedEntryStatusDAO.findAll( - getUser(), unreadOnly, offset, limit, order, true); + getUser(), unreadOnly, newerThanDate, offset, limit + 1, order, + true); for (FeedEntryStatus status : unreadEntries) { entries.getEntries().add( Entry.build(status, applicationSettingsService.get() @@ -92,7 +97,7 @@ public class CategoryREST extends AbstractResourceREST { } else if (STARRED.equals(id)) { entries.setName("Starred"); List starred = feedEntryStatusDAO.findStarred( - getUser(), offset, limit, order, true); + getUser(), newerThanDate, offset, limit + 1, order, true); for (FeedEntryStatus status : starred) { entries.getEntries().add( Entry.build(status, applicationSettingsService.get() @@ -106,7 +111,8 @@ public class CategoryREST extends AbstractResourceREST { .findAllChildrenCategories(getUser(), feedCategory); List unreadEntries = feedEntryStatusDAO .findByCategories(childrenCategories, getUser(), - unreadOnly, offset, limit, order, true); + unreadOnly, newerThanDate, offset, limit + 1, + order, true); for (FeedEntryStatus status : unreadEntries) { entries.getEntries().add( Entry.build(status, applicationSettingsService @@ -116,6 +122,13 @@ public class CategoryREST extends AbstractResourceREST { } } + + boolean hasMore = entries.getEntries().size() > limit; + if (hasMore) { + entries.setHasMore(true); + entries.getEntries().remove(entries.getEntries().size() - 1); + } + entries.setTimestamp(Calendar.getInstance().getTimeInMillis()); return Response.ok(entries).build(); } @@ -135,8 +148,8 @@ public class CategoryREST extends AbstractResourceREST { int offset = 0; int limit = 20; - Entries entries = (Entries) getCategoryEntries(id, readType, offset, - limit, order).getEntity(); + Entries entries = (Entries) getCategoryEntries(id, readType, null, + offset, limit, order).getEntity(); SyndFeed feed = new SyndFeedImpl(); feed.setFeedType("rss_2.0"); diff --git a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java index 28fc8030..58d932ea 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java @@ -72,6 +72,7 @@ public class FeedREST extends AbstractResourceREST { public Response getFeedEntries( @ApiParam(value = "id of the feed", required = true) @QueryParam("id") String id, @ApiParam(value = "all entries or only unread ones", allowableValues = "all,unread", required = true) @QueryParam("readType") ReadType readType, + @ApiParam(value = "only entries newer than this") @QueryParam("newerThan") Long newerThan, @ApiParam(value = "offset for paging") @DefaultValue("0") @QueryParam("offset") int offset, @ApiParam(value = "limit for paging, default 20, maximum 50") @DefaultValue("20") @QueryParam("limit") int limit, @ApiParam(value = "date ordering", allowableValues = "asc,desc") @QueryParam("order") @DefaultValue("desc") ReadingOrder order) { @@ -85,6 +86,10 @@ public class FeedREST extends AbstractResourceREST { Entries entries = new Entries(); boolean unreadOnly = readType == ReadType.unread; + Date newerThanDate = newerThan == null ? null : new Date( + Long.valueOf(newerThan)); + System.out.println(newerThanDate); + FeedSubscription subscription = feedSubscriptionDAO.findById(getUser(), Long.valueOf(id)); if (subscription != null) { @@ -94,12 +99,18 @@ public class FeedREST extends AbstractResourceREST { List unreadEntries = feedEntryStatusDAO .findByFeed(subscription.getFeed(), getUser(), unreadOnly, - offset, limit, order, true); + newerThanDate, offset, limit + 1, order, true); for (FeedEntryStatus status : unreadEntries) { entries.getEntries().add( Entry.build(status, applicationSettingsService.get() .getPublicUrl())); } + + boolean hasMore = entries.getEntries().size() > limit; + if (hasMore) { + entries.setHasMore(true); + entries.getEntries().remove(entries.getEntries().size() - 1); + } } entries.setTimestamp(Calendar.getInstance().getTimeInMillis()); @@ -121,8 +132,8 @@ public class FeedREST extends AbstractResourceREST { int offset = 0; int limit = 20; - Entries entries = (Entries) getFeedEntries(id, readType, offset, limit, - order).getEntity(); + Entries entries = (Entries) getFeedEntries(id, readType, null, offset, + limit, order).getEntity(); SyndFeed feed = new SyndFeedImpl(); feed.setFeedType("rss_2.0"); diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties index 800d73b4..f54e01c5 100644 --- a/src/main/resources/log4j.properties +++ b/src/main/resources/log4j.properties @@ -1,5 +1,6 @@ log4j.logger.com.commafeed=INFO, CONSOLE log4j.logger.org=WARN, CONSOLE +log4j.logger.com=WARN, CONSOLE log4j.logger.ro=WARN, CONSOLE log4j.logger.net.sf.ehcache=ALL, CONSOLE log4j.logger.org.hibernate.cache=ALL, CONSOLE diff --git a/src/main/webapp/js/controllers.js b/src/main/webapp/js/controllers.js index 35c63419..94968ec8 100644 --- a/src/main/webapp/js/controllers.js +++ b/src/main/webapp/js/controllers.js @@ -707,7 +707,7 @@ function($scope, $stateParams, $http, $route, $window, EntryService, SettingsSer $scope.errorCount = data.errorCount; $scope.timestamp = data.timestamp; $scope.busy = false; - $scope.hasMore = data.entries.length == limit; + $scope.hasMore = data.hasMore; }; if (!$scope.keywords) { var service = $scope.selectedType == 'feed' ? FeedService