From ada53dba3bd2a4c41d3f644dac8be3348950c16b Mon Sep 17 00:00:00 2001 From: tyler Date: Fri, 2 Sep 2016 03:39:16 -0400 Subject: [PATCH 1/7] 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) { From ff78af2d56274e14aee7048534a4b6d37b353a49 Mon Sep 17 00:00:00 2001 From: tyler Date: Sun, 4 Sep 2016 21:37:04 -0400 Subject: [PATCH 2/7] fix lots of bugs with alphabetic sort by properly assigning FeedEntry.FeedEntryContent.title instead of trying to make FeedEntryStatus know about titles. --- .../backend/dao/FeedEntryStatusDAO.java | 47 +++++++++++-------- .../backend/model/FeedEntryStatus.java | 2 - 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index 650a4bf2..78660686 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -17,6 +17,7 @@ import com.commafeed.backend.FixedSizeSortedSet; import com.commafeed.backend.feed.FeedEntryKeyword; import com.commafeed.backend.feed.FeedEntryKeyword.Mode; import com.commafeed.backend.model.FeedEntry; +import com.commafeed.backend.model.FeedEntryContent; import com.commafeed.backend.model.FeedEntryStatus; import com.commafeed.backend.model.FeedEntryTag; import com.commafeed.backend.model.FeedSubscription; @@ -71,7 +72,7 @@ public class FeedEntryStatusDAO extends GenericDAO { @Override public int compare(FeedEntryStatus o1, FeedEntryStatus o2) { CompareToBuilder builder = new CompareToBuilder(); - builder.append(o2.getTitle(), o1.getTitle()); + builder.append(o2.getEntry().getContent().getTitle(), o1.getEntry().getContent().getTitle()); builder.append(o2.getId(), o1.getId()); return builder.toComparison(); } @@ -113,8 +114,12 @@ public class FeedEntryStatusDAO extends GenericDAO { if (order == ReadingOrder.asc) { query.orderBy(status.entryUpdated.asc(), status.id.asc()); - } else { + } else if (order == ReadingOrder.desc){ query.orderBy(status.entryUpdated.desc(), status.id.desc()); + } else if (order == ReadingOrder.abc) { + query.orderBy(status.entry.content.title.asc(), status.id.desc()); + } else { //order == ReadingOrder.xyz + query.orderBy(status.entry.content.title.desc(), status.id.desc()); } query.offset(offset).limit(limit); @@ -132,7 +137,7 @@ public class FeedEntryStatusDAO extends GenericDAO { } private HibernateQuery buildQuery(User user, FeedSubscription sub, boolean unreadOnly, List keywords, - Date newerThan, int offset, int limit, ReadingOrder order, Date last, String tag) { + Date newerThan, int offset, int limit, ReadingOrder order, FeedEntryStatus last, String tag) { HibernateQuery query = query().selectFrom(entry).where(entry.feed.eq(sub.getFeed())); @@ -176,22 +181,28 @@ public class FeedEntryStatusDAO extends GenericDAO { if (last != null) { if (order == ReadingOrder.desc) { - query.where(entry.updated.gt(last)); - } else { - query.where(entry.updated.lt(last)); + query.where(entry.updated.gt(last.getEntryUpdated())); + } else if (order == ReadingOrder.asc) { + query.where(entry.updated.lt(last.getEntryUpdated())); + } else if (order == ReadingOrder.abc) { + query.join(entry.content, content); + query.where(content.title.gt(last.getEntry().getContent().getTitle())); + } else { //order == ReadingOrder.zyx + query.join(entry.content, content); + query.where(content.title.lt(last.getEntry().getContent().getTitle())); } + } else if (order != null && (order == ReadingOrder.abc || order == ReadingOrder.zyx)) { + query.join(entry.content, content); } - + if (order != null) { if (order == ReadingOrder.asc) { query.orderBy(entry.updated.asc(), entry.id.asc()); } 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()); } } @@ -226,22 +237,23 @@ public class FeedEntryStatusDAO extends GenericDAO { FixedSizeSortedSet set = new FixedSizeSortedSet(capacity, comparator); for (FeedSubscription sub : subs) { - Date last = (order != null && set.isFull()) ? set.last().getEntryUpdated() : null; + FeedEntryStatus last = (order != null && set.isFull()) ? set.last() : null; HibernateQuery query = buildQuery(user, sub, unreadOnly, keywords, newerThan, -1, capacity, order, last, tag); 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(); - } + tuples = query.select(entry.id, entry.updated, status.id, entry.content.title).fetch(); + for (Tuple tuple : tuples) { Long id = tuple.get(entry.id); Date updated = tuple.get(entry.updated); Long statusId = tuple.get(status.id); + FeedEntryContent content = new FeedEntryContent(); + content.setTitle(tuple.get(entry.content.title)); + FeedEntry entry = new FeedEntry(); entry.setId(id); entry.setUpdated(updated); + entry.setContent(content); FeedEntryStatus status = new FeedEntryStatus(); status.setId(statusId); @@ -249,11 +261,6 @@ public class FeedEntryStatusDAO extends GenericDAO { 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 4a6c6e6c..a891d4a1 100644 --- a/src/main/java/com/commafeed/backend/model/FeedEntryStatus.java +++ b/src/main/java/com/commafeed/backend/model/FeedEntryStatus.java @@ -55,8 +55,6 @@ public class FeedEntryStatus extends AbstractModel { @Temporal(TemporalType.TIMESTAMP) private Date entryUpdated; - - private String title; public FeedEntryStatus() { From 8d2b6bdc12936700228516f4db3b9e6b0992393b Mon Sep 17 00:00:00 2001 From: tyler Date: Sun, 4 Sep 2016 22:39:03 -0400 Subject: [PATCH 3/7] Add translation placeholders for new hover text on alphabetic sort, make whatever button you sorted by "active" --- src/main/app/i18n/ar.js | 1 + src/main/app/i18n/ca.js | 1 + src/main/app/i18n/cs.js | 1 + src/main/app/i18n/cy.js | 1 + src/main/app/i18n/da.js | 1 + src/main/app/i18n/de.js | 1 + src/main/app/i18n/en.js | 1 + src/main/app/i18n/es.js | 1 + src/main/app/i18n/fa.js | 1 + src/main/app/i18n/fi.js | 1 + src/main/app/i18n/fr.js | 1 + src/main/app/i18n/gl.js | 1 + src/main/app/i18n/glk.js | 1 + src/main/app/i18n/hu.js | 1 + src/main/app/i18n/id.js | 1 + src/main/app/i18n/it.js | 1 + src/main/app/i18n/ja.js | 1 + src/main/app/i18n/ko.js | 1 + src/main/app/i18n/ms.js | 1 + src/main/app/i18n/nb.js | 1 + src/main/app/i18n/nl.js | 1 + src/main/app/i18n/nn.js | 1 + src/main/app/i18n/pl.js | 1 + src/main/app/i18n/pt.js | 1 + src/main/app/i18n/ru.js | 1 + src/main/app/i18n/sk.js | 1 + src/main/app/i18n/sv.js | 1 + src/main/app/i18n/tr.js | 1 + src/main/app/i18n/zh.js | 1 + src/main/app/templates/_toolbar.html | 6 +++--- 30 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/app/i18n/ar.js b/src/main/app/i18n/ar.js index 54a186a9..343cc4fe 100644 --- a/src/main/app/i18n/ar.js +++ b/src/main/app/i18n/ar.js @@ -41,6 +41,7 @@ "refresh" : "إعادة انعاش", "refresh_all" : "Force refresh all my feeds ", "sort_by_asc_desc" : "الترتيب حسب التاريخ تصاعدي / تنازلي", + "sort_by_abc_zyx" : "Sort alphabetically", "titles_only" : "العناوين فقط", "expanded_view" : "عرض موسع", "mark_all_as_read" : "اعتبر الكل مقروء", diff --git a/src/main/app/i18n/ca.js b/src/main/app/i18n/ca.js index 166ccb0f..7d97ffad 100644 --- a/src/main/app/i18n/ca.js +++ b/src/main/app/i18n/ca.js @@ -41,6 +41,7 @@ "refresh" : "Actualitzar", "refresh_all" : "Força l'actualització de tots els canals", "sort_by_asc_desc" : "Ordenar per data asc/desc", + "sort_by_abc_zyx" : "Sort alphabetically", "titles_only" : "Només títols", "expanded_view" : "Vista ampliada", "mark_all_as_read" : "Marcar tots llegits", diff --git a/src/main/app/i18n/cs.js b/src/main/app/i18n/cs.js index f35de896..92406480 100644 --- a/src/main/app/i18n/cs.js +++ b/src/main/app/i18n/cs.js @@ -41,6 +41,7 @@ "refresh " : " Obnovit", "refresh_all" : "Force refresh all my feeds ", "sort_by_asc_desc " : " Seřadit podle nejnovějšího/nejstaršího", + "sort_by_abc_zyx" : "Sort alphabetically", "titles_only " : " Zobrazit jenom titulky", "expanded_view " : " Rozšířený náhled", "mark_all_as_read " : " Označit vše jako přečtené", diff --git a/src/main/app/i18n/cy.js b/src/main/app/i18n/cy.js index cfcbe5bb..2948840d 100644 --- a/src/main/app/i18n/cy.js +++ b/src/main/app/i18n/cy.js @@ -41,6 +41,7 @@ "refresh" : "Adnewyddu", "refresh_all" : "Gorfodi ail-lwytho pob ffrwd", "sort_by_asc_desc" : "Trefnu yn ôl dyddiad", + "sort_by_abc_zyx" : "Sort alphabetically", "titles_only" : "Teitlau yn unig", "expanded_view" : "Golwg estynedig", "mark_all_as_read" : "Nodi'r cyfan fel wedi ei ddarllen", diff --git a/src/main/app/i18n/da.js b/src/main/app/i18n/da.js index 72a857ee..dec7dc16 100644 --- a/src/main/app/i18n/da.js +++ b/src/main/app/i18n/da.js @@ -41,6 +41,7 @@ "refresh" : "Opdater", "refresh_all" : "Force refresh all my feeds ", "sort_by_asc_desc" : "Sorter efter dato ny/gammel", + "sort_by_abc_zyx" : "Sort alphabetically", "titles_only" : "Kun titler", "expanded_view" : "Udvidet visning", "mark_all_as_read" : "Marker alle som læst", diff --git a/src/main/app/i18n/de.js b/src/main/app/i18n/de.js index 14e4390b..31b89a7a 100644 --- a/src/main/app/i18n/de.js +++ b/src/main/app/i18n/de.js @@ -41,6 +41,7 @@ "refresh" : "Aktualisieren", "refresh_all" : "Erzwinge Aktualisierung aller Feeds", "sort_by_asc_desc" : "Nach Datum sortieren (auf-/absteigend)", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Nur Überschriften", "expanded_view" : "Ausgedehnte Ansicht", "mark_all_as_read" : "Alle Artikel als gelesen markieren", diff --git a/src/main/app/i18n/en.js b/src/main/app/i18n/en.js index f6fa7c8b..55fa8a8f 100644 --- a/src/main/app/i18n/en.js +++ b/src/main/app/i18n/en.js @@ -41,6 +41,7 @@ "refresh" : "Refresh", "refresh_all" : "Force refresh all my feeds", "sort_by_asc_desc" : "Sort by date asc/desc", + "sort_by_abc_zyx" : "Sort alphabetically", "titles_only" : "Titles only", "expanded_view" : "Expanded view", "mark_all_as_read" : "Mark all as read", diff --git a/src/main/app/i18n/es.js b/src/main/app/i18n/es.js index 993c9a11..da330e76 100644 --- a/src/main/app/i18n/es.js +++ b/src/main/app/i18n/es.js @@ -43,6 +43,7 @@ "refresh" : "Atualizar", "refresh_all" : "Forzar la actualización de todos mis canales.", "sort_by_asc_desc" : "Ordenar por fecha asc/desc.", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Sólo títulos", "expanded_view" : "Vista expandida", "mark_all_as_read" : "Marcar todos como leído", diff --git a/src/main/app/i18n/fa.js b/src/main/app/i18n/fa.js index e315660c..d86988c1 100644 --- a/src/main/app/i18n/fa.js +++ b/src/main/app/i18n/fa.js @@ -41,6 +41,7 @@ "refresh" : "تازه‌سازی", "refresh_all" : "مجبورکردن تازه‌سازی همهٔ خوراک‌ها", "sort_by_asc_desc" : "مرتب‌کردن بر اساس تاریخ به‌صورت صعودی/نزولی", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "فقط عنوان‌ها", "expanded_view" : "نمای گسترش‌یافته", "mark_all_as_read" : "علامت‌گذاری تمامی مطالب به‌عنوان خوانده‌شده", diff --git a/src/main/app/i18n/fi.js b/src/main/app/i18n/fi.js index 1bc2ebea..2245b3b6 100644 --- a/src/main/app/i18n/fi.js +++ b/src/main/app/i18n/fi.js @@ -41,6 +41,7 @@ "refresh" : "Päivitä", "refresh_all" : "Pakota kaikkien syötteiden päivitys", "sort_by_asc_desc" : "Järjestä päivämäärän mukaan nousevasti/laskevasti", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Näytä vain otsikot", "expanded_view" : "Laajennettu näkymä", "mark_all_as_read" : "Merkitse kaikki luetuiksi", diff --git a/src/main/app/i18n/fr.js b/src/main/app/i18n/fr.js index 3e9174e7..eed7f8bc 100644 --- a/src/main/app/i18n/fr.js +++ b/src/main/app/i18n/fr.js @@ -41,6 +41,7 @@ "refresh" : "Rafraîchir", "refresh_all" : "Rafraîchir tous les flux", "sort_by_asc_desc" : "Trier par date croissante/décroissante", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Titres uniquement", "expanded_view" : "Vue étendue", "mark_all_as_read" : "Tout marquer comme lu", diff --git a/src/main/app/i18n/gl.js b/src/main/app/i18n/gl.js index ab3a7e0f..35919129 100644 --- a/src/main/app/i18n/gl.js +++ b/src/main/app/i18n/gl.js @@ -41,6 +41,7 @@ "refresh" : "Actualizar", "refresh_all" : "Forzar a actualización de todas as fontes ", "sort_by_asc_desc" : "Ordenar por data asc/desc", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Só títulos", "expanded_view" : "Vista expandida", "mark_all_as_read" : "Marcar todos como lidos", diff --git a/src/main/app/i18n/glk.js b/src/main/app/i18n/glk.js index fb2067e8..40175ebd 100644 --- a/src/main/app/i18n/glk.js +++ b/src/main/app/i18n/glk.js @@ -41,6 +41,7 @@ "refresh" : "واج‌أری", "refresh_all" : "Force refresh all my feeds ", "sort_by_asc_desc" : "تاریخˇ سر دچئن", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "خالی تیتران", "expanded_view" : "واشاده نما", "mark_all_as_read" : "همه‌ته مطالبه چاکون بخانده", diff --git a/src/main/app/i18n/hu.js b/src/main/app/i18n/hu.js index 4a30bd4b..2442b14a 100644 --- a/src/main/app/i18n/hu.js +++ b/src/main/app/i18n/hu.js @@ -41,6 +41,7 @@ "refresh" : "Frissítés", "refresh_all" : "Force refresh all my feeds ", "sort_by_asc_desc" : "Rendezés időrend szerint", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Csak cím", "expanded_view" : "Részletes nézet", "mark_all_as_read" : "Az összes megjelölése olvasottként", diff --git a/src/main/app/i18n/id.js b/src/main/app/i18n/id.js index 6c48f96b..430df1bd 100644 --- a/src/main/app/i18n/id.js +++ b/src/main/app/i18n/id.js @@ -41,6 +41,7 @@ "refresh" : "Segarkan", "refresh_all" : "Memaksa menyegarkan semua umpan saya", "sort_by_asc_desc" : "Urutkan menurut tanggal asc/desc", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Hanya Judul", "expanded_view" : "Penglihatan diperluas", "mark_all_as_read" : "Tandai semua sebagai telah dibaca", diff --git a/src/main/app/i18n/it.js b/src/main/app/i18n/it.js index f2ce64f1..ba1f2b4e 100644 --- a/src/main/app/i18n/it.js +++ b/src/main/app/i18n/it.js @@ -41,6 +41,7 @@ "refresh" : "Aggiorna", "refresh_all" : "Forza l'aggiornamento di tutti i feed", "sort_by_asc_desc" : "Ordina per data crescente/decrescente", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Solo i titoli", "expanded_view" : "Espandi", "mark_all_as_read" : "Segna tutti come già letti", diff --git a/src/main/app/i18n/ja.js b/src/main/app/i18n/ja.js index 424f95f5..a49356c8 100644 --- a/src/main/app/i18n/ja.js +++ b/src/main/app/i18n/ja.js @@ -41,6 +41,7 @@ "refresh" : "更新", "refresh_all" : "全てのフィードを更新", "sort_by_asc_desc" : "昇順/降順にソート", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "タイトルのみ", "expanded_view" : "拡張ビュー", "mark_all_as_read" : "全て既読にする", diff --git a/src/main/app/i18n/ko.js b/src/main/app/i18n/ko.js index 1de13ade..0ce7dbb0 100644 --- a/src/main/app/i18n/ko.js +++ b/src/main/app/i18n/ko.js @@ -41,6 +41,7 @@ "refresh" : "새로고침", "refresh_all" : "모든 피드를 강제로 새로고침", "sort_by_asc_desc" : "날짜별 오름차/내림차순 정렬", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "제목만 표시하기", "expanded_view" : "Expanded View", "mark_all_as_read" : "읽음으로 표시", diff --git a/src/main/app/i18n/ms.js b/src/main/app/i18n/ms.js index ff66ee1b..643cd890 100644 --- a/src/main/app/i18n/ms.js +++ b/src/main/app/i18n/ms.js @@ -41,6 +41,7 @@ "refresh" : "Refresh", "refresh_all" : "Force refresh all my feeds ", "sort_by_asc_desc" : "Aturkan mengikut tarikh (baru/lama)", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Tajuk sahaja", "expanded_view" : "Wide view", "mark_all_as_read" : "Tanda kesemuanya telah dibaca", diff --git a/src/main/app/i18n/nb.js b/src/main/app/i18n/nb.js index 2d03b6a4..603ded97 100644 --- a/src/main/app/i18n/nb.js +++ b/src/main/app/i18n/nb.js @@ -41,6 +41,7 @@ "refresh" : "Oppdater", "refresh_all" : "Force refresh all my feeds ", "sort_by_asc_desc" : "Sorter etter dato ny/gammel", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Kun titler", "expanded_view" : "Utvidet visning", "mark_all_as_read" : "Merk alle som lest", diff --git a/src/main/app/i18n/nl.js b/src/main/app/i18n/nl.js index cf12a391..f320b946 100644 --- a/src/main/app/i18n/nl.js +++ b/src/main/app/i18n/nl.js @@ -41,6 +41,7 @@ "refresh" : "Vernieuwen", "refresh_all" : "Force refresh all my feeds ", "sort_by_asc_desc" : "Sorteer op datum opl/afl", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Alleen titels", "expanded_view" : "Uitgebreide weergave", "mark_all_as_read" : "Markeer alles als gelezen", diff --git a/src/main/app/i18n/nn.js b/src/main/app/i18n/nn.js index 351ed38f..206d5a04 100644 --- a/src/main/app/i18n/nn.js +++ b/src/main/app/i18n/nn.js @@ -41,6 +41,7 @@ "refresh" : "Oppdater", "refresh_all" : "Force refresh all my feeds ", "sort_by_asc_desc" : "Sorter etter dato ny/gamal", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Berre titlar", "expanded_view" : "Utvida visning", "mark_all_as_read" : "Merk alle som lesne", diff --git a/src/main/app/i18n/pl.js b/src/main/app/i18n/pl.js index cc575734..945ab96a 100644 --- a/src/main/app/i18n/pl.js +++ b/src/main/app/i18n/pl.js @@ -41,6 +41,7 @@ "refresh" : "Odswież", "refresh_all" : "Force refresh all my feeds ", "sort_by_asc_desc" : "Sortuj od najnowszego/najstarszego", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Widok listy", "expanded_view" : "Widok rozwinięty", "mark_all_as_read" : "Oznacz wszystko jako przeczytane", diff --git a/src/main/app/i18n/pt.js b/src/main/app/i18n/pt.js index 91922550..e03718ed 100644 --- a/src/main/app/i18n/pt.js +++ b/src/main/app/i18n/pt.js @@ -41,6 +41,7 @@ "refresh" : "Atualizar", "refresh_all" : "Forçar atualização de todos os meus feeds", "sort_by_asc_desc" : "Ordenar por data cresc/decres", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Somente títulos", "expanded_view" : "Modo Expandido", "mark_all_as_read" : "Marcar tudo como lido", diff --git a/src/main/app/i18n/ru.js b/src/main/app/i18n/ru.js index 35262b3d..69457ddb 100644 --- a/src/main/app/i18n/ru.js +++ b/src/main/app/i18n/ru.js @@ -41,6 +41,7 @@ "refresh" : "Обновить", "refresh_all" : "Обновить все подписки вручную", "sort_by_asc_desc" : "Сначала новые/старые", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Только заголовки", "expanded_view" : "Развёрнутый вид", "mark_all_as_read" : "Отметить всё как прочитанное", diff --git a/src/main/app/i18n/sk.js b/src/main/app/i18n/sk.js index 6ccb8bf1..a56b566d 100644 --- a/src/main/app/i18n/sk.js +++ b/src/main/app/i18n/sk.js @@ -41,6 +41,7 @@ "refresh" : "Obnoviť", "refresh_all" : "Vynútené obnovenie všetkých položiek", "sort_by_asc_desc" : "Zoradiť podľa najnovšieho/najstaršieho", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Náhľad titulkov", "expanded_view" : "Rozšírený náhľad", "mark_all_as_read" : "Označiť všetky ako prečítané", diff --git a/src/main/app/i18n/sv.js b/src/main/app/i18n/sv.js index 8fd2329b..d7acf6ff 100644 --- a/src/main/app/i18n/sv.js +++ b/src/main/app/i18n/sv.js @@ -41,6 +41,7 @@ "refresh" : "Uppdatera", "refresh_all" : "Tvinga uppdatering av alla prenumerationer", "sort_by_asc_desc" : "Sortera efter datum stigande/fallande", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Endast titlar", "expanded_view" : "Expanderad vy", "mark_all_as_read" : "Markera alla som lästa", diff --git a/src/main/app/i18n/tr.js b/src/main/app/i18n/tr.js index bf4a91ac..9dd82875 100644 --- a/src/main/app/i18n/tr.js +++ b/src/main/app/i18n/tr.js @@ -41,6 +41,7 @@ "refresh" : "Yenile", "refresh_all" : "Tüm yayınları yenilemek için zorla", "sort_by_asc_desc" : "Tarihe göre sırala artan/azalan", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "Sadece başlıklar", "expanded_view" : "Genişletilmiş görünüm", "mark_all_as_read" : "Tümünü okundu işaretle", diff --git a/src/main/app/i18n/zh.js b/src/main/app/i18n/zh.js index 799e2d27..47a1789c 100644 --- a/src/main/app/i18n/zh.js +++ b/src/main/app/i18n/zh.js @@ -41,6 +41,7 @@ "refresh" : "刷新", "refresh_all" : "刷新所有订阅", "sort_by_asc_desc" : "按日期升序/降序排序", + "sort_by_abc_zyx" : "Sort Alphabetically", "titles_only" : "仅显示标题", "expanded_view" : "显示内容", "mark_all_as_read" : "标记所有为已读", diff --git a/src/main/app/templates/_toolbar.html b/src/main/app/templates/_toolbar.html index 617f14e5..5cf5246d 100644 --- a/src/main/app/templates/_toolbar.html +++ b/src/main/app/templates/_toolbar.html @@ -69,11 +69,11 @@ From d709d119ac2b01bf9238f03d56f440989b60986e Mon Sep 17 00:00:00 2001 From: tyler Date: Sun, 4 Sep 2016 23:57:12 -0400 Subject: [PATCH 4/7] change button for Alphabetic sort to have different "icon". also ABC and ZYX sorting were switched. --- src/main/app/templates/_toolbar.html | 12 ++++++------ .../commafeed/backend/dao/FeedEntryStatusDAO.java | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/app/templates/_toolbar.html b/src/main/app/templates/_toolbar.html index 5cf5246d..e316c269 100644 --- a/src/main/app/templates/_toolbar.html +++ b/src/main/app/templates/_toolbar.html @@ -67,14 +67,14 @@
- + - - - + 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 78660686..528aae58 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -72,7 +72,7 @@ public class FeedEntryStatusDAO extends GenericDAO { @Override public int compare(FeedEntryStatus o1, FeedEntryStatus o2) { CompareToBuilder builder = new CompareToBuilder(); - builder.append(o2.getEntry().getContent().getTitle(), o1.getEntry().getContent().getTitle()); + builder.append(o1.getEntry().getContent().getTitle(), o2.getEntry().getContent().getTitle()); builder.append(o2.getId(), o1.getId()); return builder.toComparison(); } From b40349805fe81c58e3fcda1a41e7f3c71eb35fa3 Mon Sep 17 00:00:00 2001 From: tyler Date: Mon, 5 Sep 2016 00:41:17 -0400 Subject: [PATCH 5/7] switch abc & zyx --- .../com/commafeed/backend/dao/FeedEntryStatusDAO.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index 528aae58..ae05c008 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -73,7 +73,7 @@ public class FeedEntryStatusDAO extends GenericDAO { public int compare(FeedEntryStatus o1, FeedEntryStatus o2) { CompareToBuilder builder = new CompareToBuilder(); builder.append(o1.getEntry().getContent().getTitle(), o2.getEntry().getContent().getTitle()); - builder.append(o2.getId(), o1.getId()); + builder.append(o1.getId(), o2.getId()); return builder.toComparison(); } }; @@ -186,10 +186,10 @@ public class FeedEntryStatusDAO extends GenericDAO { query.where(entry.updated.lt(last.getEntryUpdated())); } else if (order == ReadingOrder.abc) { query.join(entry.content, content); - query.where(content.title.gt(last.getEntry().getContent().getTitle())); + query.where(content.title.lt(last.getEntry().getContent().getTitle())); } else { //order == ReadingOrder.zyx query.join(entry.content, content); - query.where(content.title.lt(last.getEntry().getContent().getTitle())); + query.where(content.title.gt(last.getEntry().getContent().getTitle())); } } else if (order != null && (order == ReadingOrder.abc || order == ReadingOrder.zyx)) { query.join(entry.content, content); @@ -201,9 +201,9 @@ public class FeedEntryStatusDAO extends GenericDAO { } else if (order == ReadingOrder.desc) { query.orderBy(entry.updated.desc(), entry.id.desc()); } else if (order == ReadingOrder.abc) { - query.orderBy(content.title.desc(), entry.id.desc()); - } else { //order == ReadingOrder.zyx query.orderBy(content.title.asc(), entry.id.asc()); + } else { //order == ReadingOrder.zyx + query.orderBy(content.title.desc(), entry.id.desc()); } } if (offset > -1) { From 039ff4ee41b1e2b8990588a22a2498d636a75dfc Mon Sep 17 00:00:00 2001 From: tyler Date: Mon, 5 Sep 2016 04:56:30 -0400 Subject: [PATCH 6/7] decided to do ctrl-f for " order " and found this piece. Don't know what bug this will fix but probably best to update to reflect additional sorting options. Sorry for ternary operator abuse --- .../frontend/servlet/NextUnreadServlet.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/commafeed/frontend/servlet/NextUnreadServlet.java b/src/main/java/com/commafeed/frontend/servlet/NextUnreadServlet.java index 4ea60674..c0bacd78 100644 --- a/src/main/java/com/commafeed/frontend/servlet/NextUnreadServlet.java +++ b/src/main/java/com/commafeed/frontend/servlet/NextUnreadServlet.java @@ -61,7 +61,18 @@ public class NextUnreadServlet extends HttpServlet { return; } - final ReadingOrder order = StringUtils.equals(orderParam, "asc") ? ReadingOrder.asc : ReadingOrder.desc; + final ReadingOrder order = (StringUtils.equals(orderParam, "asc") ? + ReadingOrder.asc : + ( + StringUtils.equals(orderParam, "desc") ? + ReadingOrder.desc : + ( + StringUtils.equals(orderParam, "abc") ? + ReadingOrder.abc : + (ReadingOrder.zyx) + ) + ) + ); FeedEntryStatus status = UnitOfWork.call(sessionFactory, () -> { FeedEntryStatus s = null; From 61039dcd7eb7322b85d1df6263a4deedbcf9b325 Mon Sep 17 00:00:00 2001 From: tyler Date: Mon, 5 Sep 2016 05:09:57 -0400 Subject: [PATCH 7/7] remove some whitespace, put tuples assignment back on one line --- .../commafeed/backend/dao/FeedEntryStatusDAO.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index ae05c008..2973393f 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -234,22 +234,21 @@ public class FeedEntryStatusDAO extends GenericDAO { } else { comparator = STATUS_COMPARATOR_ASC; } - + FixedSizeSortedSet set = new FixedSizeSortedSet(capacity, comparator); for (FeedSubscription sub : subs) { FeedEntryStatus last = (order != null && set.isFull()) ? set.last() : null; HibernateQuery query = buildQuery(user, sub, unreadOnly, keywords, newerThan, -1, capacity, order, last, tag); - List tuples; - tuples = query.select(entry.id, entry.updated, status.id, entry.content.title).fetch(); - + List tuples = query.select(entry.id, entry.updated, status.id, entry.content.title).fetch(); + for (Tuple tuple : tuples) { Long id = tuple.get(entry.id); Date updated = tuple.get(entry.updated); Long statusId = tuple.get(status.id); - + FeedEntryContent content = new FeedEntryContent(); content.setTitle(tuple.get(entry.content.title)); - + FeedEntry entry = new FeedEntry(); entry.setId(id); entry.setUpdated(updated); @@ -260,7 +259,7 @@ public class FeedEntryStatusDAO extends GenericDAO { status.setEntryUpdated(updated); status.setEntry(entry); status.setSubscription(sub); - + set.add(status); } }