Merge pull request #6053 from ByteHamster/database-optimizations
Database optimizations
This commit is contained in:
commit
45e625d988
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -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));
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user