From ada53dba3bd2a4c41d3f644dac8be3348950c16b Mon Sep 17 00:00:00 2001 From: tyler Date: Fri, 2 Sep 2016 03:39:16 -0400 Subject: [PATCH] Add Alphabetical sorting First "working" version of Alphabetical sorting in Commafeed. Needs better front end interface, translations, and probably the API is buggy surrounding "order" now b/c there is probably some code still that assumes there are only two possible ways to sort (date asc, date desc). --- src/main/app/js/controllers.js | 6 ++- src/main/app/templates/_toolbar.html | 6 ++- .../backend/dao/FeedEntryStatusDAO.java | 48 +++++++++++++++++-- .../backend/model/FeedEntryStatus.java | 2 + .../commafeed/backend/model/UserSettings.java | 2 +- .../frontend/resource/CategoryREST.java | 2 +- .../commafeed/frontend/resource/FeedREST.java | 2 +- 7 files changed, 59 insertions(+), 9 deletions(-) diff --git a/src/main/app/js/controllers.js b/src/main/app/js/controllers.js index aa360db3..6e7c16c8 100644 --- a/src/main/app/js/controllers.js +++ b/src/main/app/js/controllers.js @@ -531,7 +531,11 @@ module.controller('ToolbarCtrl', [ $scope.toggleOrder = function() { var settings = $scope.settingsService.settings; - settings.readingOrder = settings.readingOrder == 'asc' ? 'desc' : 'asc'; + settings.readingOrder = settings.readingOrder == 'desc' ? 'asc' : 'desc'; + }; + $scope.toggleAbcOrder = function() { + var settings = $scope.settingsService.settings; + settings.readingOrder = settings.readingOrder == 'abc' ? 'zyx' : 'abc'; }; $scope.toAdmin = function() { diff --git a/src/main/app/templates/_toolbar.html b/src/main/app/templates/_toolbar.html index aadf5800..617f14e5 100644 --- a/src/main/app/templates/_toolbar.html +++ b/src/main/app/templates/_toolbar.html @@ -69,7 +69,11 @@
+ ng-class="{'icon-arrow-up' : settingsService.settings.readingOrder == 'asc', 'icon-arrow-down': settingsService.settings.readingOrder != 'asc'}"> + + +
diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index 2f1ea425..650a4bf2 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -66,6 +66,19 @@ public class FeedEntryStatusDAO extends GenericDAO { }; private static final Comparator STATUS_COMPARATOR_ASC = Ordering.from(STATUS_COMPARATOR_DESC).reverse(); + + private static final Comparator STATUS_COMPARATOR_ABC = new Comparator() { + @Override + public int compare(FeedEntryStatus o1, FeedEntryStatus o2) { + CompareToBuilder builder = new CompareToBuilder(); + builder.append(o2.getTitle(), o1.getTitle()); + builder.append(o2.getId(), o1.getId()); + return builder.toComparison(); + } + }; + + private static final Comparator STATUS_COMPARATOR_ZYX = Ordering.from(STATUS_COMPARATOR_ABC).reverse(); + public FeedEntryStatus getStatus(User user, FeedSubscription sub, FeedEntry entry) { List statuses = query().selectFrom(status).where(status.entry.eq(entry), status.subscription.eq(sub)).fetch(); @@ -172,8 +185,14 @@ public class FeedEntryStatusDAO extends GenericDAO { if (order != null) { if (order == ReadingOrder.asc) { query.orderBy(entry.updated.asc(), entry.id.asc()); - } else { + } else if (order == ReadingOrder.desc) { query.orderBy(entry.updated.desc(), entry.id.desc()); + } else if (order == ReadingOrder.abc) { + query.join(entry.content, content); + query.orderBy(content.title.desc(), entry.id.desc()); + } else { //order == ReadingOrder.zyx + query.join(entry.content, content); + query.orderBy(content.title.asc(), entry.id.asc()); } } if (offset > -1) { @@ -193,17 +212,33 @@ public class FeedEntryStatusDAO extends GenericDAO { List keywords, Date newerThan, int offset, int limit, ReadingOrder order, boolean includeContent, boolean onlyIds, String tag) { int capacity = offset + limit; - Comparator comparator = order == ReadingOrder.desc ? STATUS_COMPARATOR_DESC : STATUS_COMPARATOR_ASC; + + Comparator comparator; + if (order == ReadingOrder.desc) { + comparator = STATUS_COMPARATOR_DESC; + } else if (order == ReadingOrder.abc) { + comparator = STATUS_COMPARATOR_ABC; + } else if (order == ReadingOrder.zyx) { + comparator = STATUS_COMPARATOR_ZYX; + } else { + comparator = STATUS_COMPARATOR_ASC; + } + FixedSizeSortedSet set = new FixedSizeSortedSet(capacity, comparator); for (FeedSubscription sub : subs) { Date last = (order != null && set.isFull()) ? set.last().getEntryUpdated() : null; HibernateQuery query = buildQuery(user, sub, unreadOnly, keywords, newerThan, -1, capacity, order, last, tag); - List tuples = query.select(entry.id, entry.updated, status.id).fetch(); + List tuples; + if (order == ReadingOrder.abc || order == ReadingOrder.zyx) { + tuples = query.select(entry.id, entry.updated, status.id, content.title).fetch(); + } else { + tuples = query.select(entry.id, entry.updated, status.id).fetch(); + } for (Tuple tuple : tuples) { Long id = tuple.get(entry.id); Date updated = tuple.get(entry.updated); Long statusId = tuple.get(status.id); - + FeedEntry entry = new FeedEntry(); entry.setId(id); entry.setUpdated(updated); @@ -213,6 +248,11 @@ public class FeedEntryStatusDAO extends GenericDAO { status.setEntryUpdated(updated); status.setEntry(entry); status.setSubscription(sub); + + if (order == ReadingOrder.abc || order == ReadingOrder.zyx) { + String title = tuple.get(content.title); + status.setTitle(title); + } set.add(status); } diff --git a/src/main/java/com/commafeed/backend/model/FeedEntryStatus.java b/src/main/java/com/commafeed/backend/model/FeedEntryStatus.java index a891d4a1..4a6c6e6c 100644 --- a/src/main/java/com/commafeed/backend/model/FeedEntryStatus.java +++ b/src/main/java/com/commafeed/backend/model/FeedEntryStatus.java @@ -55,6 +55,8 @@ public class FeedEntryStatus extends AbstractModel { @Temporal(TemporalType.TIMESTAMP) private Date entryUpdated; + + private String title; public FeedEntryStatus() { diff --git a/src/main/java/com/commafeed/backend/model/UserSettings.java b/src/main/java/com/commafeed/backend/model/UserSettings.java index 4928ac2b..48a8b653 100644 --- a/src/main/java/com/commafeed/backend/model/UserSettings.java +++ b/src/main/java/com/commafeed/backend/model/UserSettings.java @@ -27,7 +27,7 @@ public class UserSettings extends AbstractModel { } public enum ReadingOrder { - asc, desc + asc, desc, abc, zyx } public enum ViewMode { diff --git a/src/main/java/com/commafeed/frontend/resource/CategoryREST.java b/src/main/java/com/commafeed/frontend/resource/CategoryREST.java index 67db7707..af28313c 100644 --- a/src/main/java/com/commafeed/frontend/resource/CategoryREST.java +++ b/src/main/java/com/commafeed/frontend/resource/CategoryREST.java @@ -103,7 +103,7 @@ public class CategoryREST { @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 1000") @DefaultValue("20") @QueryParam("limit") int limit, - @ApiParam(value = "date ordering", allowableValues = "asc,desc") @QueryParam("order") @DefaultValue("desc") ReadingOrder order, + @ApiParam(value = "ordering", allowableValues = "asc,desc,abc,zyx") @QueryParam("order") @DefaultValue("desc") ReadingOrder order, @ApiParam( value = "search for keywords in either the title or the content of the entries, separated by spaces, 3 characters minimum") @QueryParam("keywords") String keywords, @ApiParam(value = "return only entry ids") @DefaultValue("false") @QueryParam("onlyIds") boolean onlyIds, diff --git a/src/main/java/com/commafeed/frontend/resource/FeedREST.java b/src/main/java/com/commafeed/frontend/resource/FeedREST.java index 58e25581..3a61e331 100644 --- a/src/main/java/com/commafeed/frontend/resource/FeedREST.java +++ b/src/main/java/com/commafeed/frontend/resource/FeedREST.java @@ -141,7 +141,7 @@ public class FeedREST { @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 1000") @DefaultValue("20") @QueryParam("limit") int limit, - @ApiParam(value = "date ordering", allowableValues = "asc,desc") @QueryParam("order") @DefaultValue("desc") ReadingOrder order, + @ApiParam(value = "ordering", allowableValues = "asc,desc,abc,zyx") @QueryParam("order") @DefaultValue("desc") ReadingOrder order, @ApiParam( value = "search for keywords in either the title or the content of the entries, separated by spaces, 3 characters minimum") @QueryParam("keywords") String keywords, @ApiParam(value = "return only entry ids") @DefaultValue("false") @QueryParam("onlyIds") boolean onlyIds) {