summaryrefslogtreecommitdiff
path: root/core/src/main
diff options
context:
space:
mode:
authorByteHamster <ByteHamster@users.noreply.github.com>2020-10-24 20:03:38 +0200
committerGitHub <noreply@github.com>2020-10-24 20:03:38 +0200
commit3e4e6381bd39a40b210e5b6ab054e3adee371330 (patch)
tree367b2d5ca4bc7bebc996b766f8069d0ac341098b /core/src/main
parent69a3c56d247e0f32c156c49a396c989d746ba96e (diff)
parentcd100aae15538415dbc896d59732e4b9710c89d1 (diff)
downloadAntennaPod-3e4e6381bd39a40b210e5b6ab054e3adee371330.zip
Merge pull request #4588 from ByteHamster/recent-pubdate-performance
Improve performance and memory usage of 'recent pubdate' feed sort option
Diffstat (limited to 'core/src/main')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java21
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java21
2 files changed, 25 insertions, 17 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
index fd8ca116d..892254507 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
@@ -852,24 +852,11 @@ public final class DBReader {
}
};
} else {
+ final Map<Long, Long> recentPubDates = adapter.getMostRecentItemDates();
comparator = (lhs, rhs) -> {
- if (lhs.getItems() == null || lhs.getItems().size() == 0) {
- List<FeedItem> items = DBReader.getFeedItemList(lhs);
- lhs.setItems(items);
- }
- if (rhs.getItems() == null || rhs.getItems().size() == 0) {
- List<FeedItem> items = DBReader.getFeedItemList(rhs);
- rhs.setItems(items);
- }
- if (lhs.getMostRecentItem() == null) {
- return 1;
- } else if (rhs.getMostRecentItem() == null) {
- return -1;
- } else {
- Date d1 = lhs.getMostRecentItem().getPubDate();
- Date d2 = rhs.getMostRecentItem().getPubDate();
- return d2.compareTo(d1);
- }
+ long dateLhs = recentPubDates.containsKey(lhs.getId()) ? recentPubDates.get(lhs.getId()) : 0;
+ long dateRhs = recentPubDates.containsKey(rhs.getId()) ? recentPubDates.get(rhs.getId()) : 0;
+ return Long.compare(dateRhs, dateLhs);
};
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
index e552cc180..775485880 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
@@ -21,8 +21,10 @@ import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
import java.util.Set;
import de.danoeh.antennapod.core.feed.Chapter;
@@ -1189,6 +1191,25 @@ public class PodDBAdapter {
return conditionalFeedCounterRead(whereRead, feedIds);
}
+ public final Map<Long, Long> getMostRecentItemDates() {
+ final String query = "SELECT " + KEY_FEED + ","
+ + " MAX(" + TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE + ") AS most_recent_pubdate"
+ + " FROM " + TABLE_NAME_FEED_ITEMS
+ + " GROUP BY " + KEY_FEED;
+
+ Cursor c = db.rawQuery(query, null);
+ Map<Long, Long> result = new HashMap<>();
+ if (c.moveToFirst()) {
+ do {
+ long feedId = c.getLong(0);
+ long date = c.getLong(1);
+ result.put(feedId, date);
+ } while (c.moveToNext());
+ }
+ c.close();
+ return result;
+ }
+
public final int getNumberOfDownloadedEpisodes() {
final String query = "SELECT COUNT(DISTINCT " + KEY_ID + ") AS count FROM " + TABLE_NAME_FEED_MEDIA +
" WHERE " + KEY_DOWNLOADED + " > 0";