Merge pull request #6053 from ByteHamster/database-optimizations

Database optimizations
This commit is contained in:
ByteHamster 2022-09-02 19:43:22 +02:00 committed by GitHub
commit 45e625d988
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 61 deletions

View File

@ -3,13 +3,13 @@ package de.danoeh.antennapod.core.export.favorites;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
import de.danoeh.antennapod.model.feed.FeedItemFilter;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.Writer; import java.io.Writer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
@ -22,9 +22,6 @@ import de.danoeh.antennapod.core.storage.DBReader;
/** Writes saved favorites to file. */ /** Writes saved favorites to file. */
public class FavoritesWriter implements ExportWriter { public class FavoritesWriter implements ExportWriter {
private static final String TAG = "FavoritesWriter"; private static final String TAG = "FavoritesWriter";
private static final int PAGE_LIMIT = 100;
private static final String FAVORITE_TEMPLATE = "html-export-favorites-item-template.html"; private static final String FAVORITE_TEMPLATE = "html-export-favorites-item-template.html";
private static final String FEED_TEMPLATE = "html-export-feed-template.html"; private static final String FEED_TEMPLATE = "html-export-feed-template.html";
private static final String UTF_8 = "UTF-8"; private static final String UTF_8 = "UTF-8";
@ -45,7 +42,9 @@ public class FavoritesWriter implements ExportWriter {
InputStream feedTemplateStream = context.getAssets().open(FEED_TEMPLATE); InputStream feedTemplateStream = context.getAssets().open(FEED_TEMPLATE);
String feedTemplate = IOUtils.toString(feedTemplateStream, UTF_8); String feedTemplate = IOUtils.toString(feedTemplateStream, UTF_8);
Map<Long, List<FeedItem>> favoriteByFeed = getFeedMap(getFavorites()); List<FeedItem> allFavorites = DBReader.getRecentlyPublishedEpisodes(0, Integer.MAX_VALUE,
new FeedItemFilter(FeedItemFilter.IS_FAVORITE));
Map<Long, List<FeedItem>> favoriteByFeed = getFeedMap(allFavorites);
writer.append(templateParts[0]); writer.append(templateParts[0]);
@ -66,23 +65,6 @@ public class FavoritesWriter implements ExportWriter {
Log.d(TAG, "Finished writing document"); Log.d(TAG, "Finished writing document");
} }
private List<FeedItem> getFavorites() {
int page = 0;
List<FeedItem> favoritesList = new ArrayList<>();
List<FeedItem> favoritesPage;
do {
favoritesPage = DBReader.getFavoriteItemsList(page * PAGE_LIMIT, PAGE_LIMIT);
favoritesList.addAll(favoritesPage);
++page;
} while (!favoritesPage.isEmpty() && favoritesPage.size() == PAGE_LIMIT);
// sort in descending order
Collections.sort(favoritesList, (lhs, rhs) -> rhs.getPubDate().compareTo(lhs.getPubDate()));
return favoritesList;
}
/** /**
* Group favorite episodes by feed, sorting them by publishing date in descending order. * Group favorite episodes by feed, sorting them by publishing date in descending order.
* *

View File

@ -337,33 +337,12 @@ public final class DBReader {
} }
} }
/**
* Loads a list of favorite items.
*
* @param offset The first episode that should be loaded.
* @param limit The maximum number of episodes that should be loaded.
* @return A list of FeedItems that are marked as favorite.
*/
public static List<FeedItem> getFavoriteItemsList(int offset, int limit) {
Log.d(TAG, "getFavoriteItemsList() called");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
try (Cursor cursor = adapter.getFavoritesCursor(offset, limit)) {
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
loadAdditionalFeedItemListData(items);
return items;
} finally {
adapter.close();
}
}
private static LongList getFavoriteIDList() { private static LongList getFavoriteIDList() {
Log.d(TAG, "getFavoriteIDList() called"); Log.d(TAG, "getFavoriteIDList() called");
PodDBAdapter adapter = PodDBAdapter.getInstance(); PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open(); adapter.open();
try (Cursor cursor = adapter.getFavoritesCursor(0, Integer.MAX_VALUE)) { try (Cursor cursor = adapter.getFavoritesIdsCursor(0, Integer.MAX_VALUE)) {
LongList favoriteIDs = new LongList(cursor.getCount()); LongList favoriteIDs = new LongList(cursor.getCount());
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
favoriteIDs.add(cursor.getLong(0)); favoriteIDs.add(cursor.getLong(0));

View File

@ -971,9 +971,11 @@ public class PodDBAdapter {
* cursor uses the FEEDITEM_SEL_FI_SMALL selection. * cursor uses the FEEDITEM_SEL_FI_SMALL selection.
*/ */
public final Cursor getQueueCursor() { public final Cursor getQueueCursor() {
final String query = SELECT_FEED_ITEMS_AND_MEDIA final String query = "SELECT " + KEYS_FEED_ITEM_WITHOUT_DESCRIPTION + ", " + KEYS_FEED_MEDIA
+ " INNER JOIN " + TABLE_NAME_QUEUE + " FROM " + TABLE_NAME_QUEUE
+ " INNER JOIN " + TABLE_NAME_FEED_ITEMS
+ " ON " + SELECT_KEY_ITEM_ID + " = " + TABLE_NAME_QUEUE + "." + KEY_FEEDITEM + " ON " + SELECT_KEY_ITEM_ID + " = " + TABLE_NAME_QUEUE + "." + KEY_FEEDITEM
+ JOIN_FEED_ITEM_AND_MEDIA
+ " ORDER BY " + TABLE_NAME_QUEUE + "." + KEY_ID; + " ORDER BY " + TABLE_NAME_QUEUE + "." + KEY_ID;
return db.rawQuery(query, null); return db.rawQuery(query, null);
} }
@ -983,9 +985,11 @@ public class PodDBAdapter {
} }
public Cursor getNextInQueue(final FeedItem item) { public Cursor getNextInQueue(final FeedItem item) {
final String query = SELECT_FEED_ITEMS_AND_MEDIA final String query = "SELECT " + KEYS_FEED_ITEM_WITHOUT_DESCRIPTION + ", " + KEYS_FEED_MEDIA
+ "INNER JOIN " + TABLE_NAME_QUEUE + " FROM " + TABLE_NAME_QUEUE
+ " INNER JOIN " + TABLE_NAME_FEED_ITEMS
+ " ON " + SELECT_KEY_ITEM_ID + " = " + TABLE_NAME_QUEUE + "." + KEY_FEEDITEM + " ON " + SELECT_KEY_ITEM_ID + " = " + TABLE_NAME_QUEUE + "." + KEY_FEEDITEM
+ JOIN_FEED_ITEM_AND_MEDIA
+ " WHERE Queue.ID > (SELECT Queue.ID FROM Queue WHERE Queue.FeedItem = " + " WHERE Queue.ID > (SELECT Queue.ID FROM Queue WHERE Queue.FeedItem = "
+ item.getId() + item.getId()
+ ")" + ")"
@ -996,36 +1000,32 @@ public class PodDBAdapter {
public final Cursor getPausedQueueCursor(int limit) { public final Cursor getPausedQueueCursor(int limit) {
//playback position > 0 (paused), rank by last played, then rest of queue //playback position > 0 (paused), rank by last played, then rest of queue
final String query = SELECT_FEED_ITEMS_AND_MEDIA final String query = "SELECT " + KEYS_FEED_ITEM_WITHOUT_DESCRIPTION + ", " + KEYS_FEED_MEDIA
+ " INNER JOIN " + TABLE_NAME_QUEUE + " FROM " + TABLE_NAME_QUEUE
+ " INNER JOIN " + TABLE_NAME_FEED_ITEMS
+ " ON " + SELECT_KEY_ITEM_ID + " = " + TABLE_NAME_QUEUE + "." + KEY_FEEDITEM + " ON " + SELECT_KEY_ITEM_ID + " = " + TABLE_NAME_QUEUE + "." + KEY_FEEDITEM
+ JOIN_FEED_ITEM_AND_MEDIA
+ " ORDER BY " + TABLE_NAME_FEED_MEDIA + "." + KEY_POSITION + ">0 DESC , " + " ORDER BY " + TABLE_NAME_FEED_MEDIA + "." + KEY_POSITION + ">0 DESC , "
+ TABLE_NAME_FEED_MEDIA + "." + KEY_LAST_PLAYED_TIME + " DESC , " + TABLE_NAME_QUEUE + "." + KEY_ID + TABLE_NAME_FEED_MEDIA + "." + KEY_LAST_PLAYED_TIME + " DESC , " + TABLE_NAME_QUEUE + "." + KEY_ID
+ " LIMIT " + limit; + " LIMIT " + limit;
return db.rawQuery(query, null); return db.rawQuery(query, null);
} }
public final Cursor getFavoritesCursor(int offset, int limit) { public final Cursor getFavoritesIdsCursor(int offset, int limit) {
final String query = SELECT_FEED_ITEMS_AND_MEDIA // Way faster than selecting all columns
final String query = "SELECT " + TABLE_NAME_FEED_ITEMS + "." + KEY_ID
+ " FROM " + TABLE_NAME_FEED_ITEMS
+ " INNER JOIN " + TABLE_NAME_FAVORITES + " INNER JOIN " + TABLE_NAME_FAVORITES
+ " ON " + SELECT_KEY_ITEM_ID + " = " + TABLE_NAME_FAVORITES + "." + KEY_FEEDITEM + " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_ID + " = " + TABLE_NAME_FAVORITES + "." + KEY_FEEDITEM
+ " ORDER BY " + TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE + " DESC" + " ORDER BY " + TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE + " DESC"
+ " LIMIT " + offset + ", " + limit; + " LIMIT " + offset + ", " + limit;
return db.rawQuery(query, null); return db.rawQuery(query, null);
} }
public void setFeedItems(int state) {
setFeedItems(Integer.MIN_VALUE, state, 0);
}
public void setFeedItems(int oldState, int newState) { public void setFeedItems(int oldState, int newState) {
setFeedItems(oldState, newState, 0); setFeedItems(oldState, newState, 0);
} }
public void setFeedItems(int state, long feedId) {
setFeedItems(Integer.MIN_VALUE, state, feedId);
}
public void setFeedItems(int oldState, int newState, long feedId) { public void setFeedItems(int oldState, int newState, long feedId) {
String sql = "UPDATE " + TABLE_NAME_FEED_ITEMS + " SET " + KEY_READ + "=" + newState; String sql = "UPDATE " + TABLE_NAME_FEED_ITEMS + " SET " + KEY_READ + "=" + newState;
if (feedId > 0) { if (feedId > 0) {