Merge pull request #5577 from ByteHamster/fast-deletion
Make feed deletions 3 times faster
This commit is contained in:
commit
e8b712e5d3
@ -44,8 +44,6 @@ import de.danoeh.antennapod.model.feed.SortOrder;
|
|||||||
import static de.danoeh.antennapod.model.feed.FeedPreferences.SPEED_USE_GLOBAL;
|
import static de.danoeh.antennapod.model.feed.FeedPreferences.SPEED_USE_GLOBAL;
|
||||||
import static de.danoeh.antennapod.model.feed.SortOrder.toCodeString;
|
import static de.danoeh.antennapod.model.feed.SortOrder.toCodeString;
|
||||||
|
|
||||||
// TODO Remove media column from feeditem table
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements methods for accessing the database
|
* Implements methods for accessing the database
|
||||||
*/
|
*/
|
||||||
@ -842,43 +840,32 @@ public class PodDBAdapter {
|
|||||||
db.delete(TABLE_NAME_QUEUE, null, null);
|
db.delete(TABLE_NAME_QUEUE, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeFeedMedia(FeedMedia media) {
|
|
||||||
// delete download log entries for feed media
|
|
||||||
db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE + "=?",
|
|
||||||
new String[]{String.valueOf(media.getId()), String.valueOf(FeedMedia.FEEDFILETYPE_FEEDMEDIA)});
|
|
||||||
|
|
||||||
db.delete(TABLE_NAME_FEED_MEDIA, KEY_ID + "=?",
|
|
||||||
new String[]{String.valueOf(media.getId())});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void removeChaptersOfItem(FeedItem item) {
|
|
||||||
db.delete(TABLE_NAME_SIMPLECHAPTERS, KEY_FEEDITEM + "=?",
|
|
||||||
new String[]{String.valueOf(item.getId())});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove a FeedItem and its FeedMedia entry.
|
|
||||||
*/
|
|
||||||
private void removeFeedItem(FeedItem item) {
|
|
||||||
if (item.getMedia() != null) {
|
|
||||||
removeFeedMedia(item.getMedia());
|
|
||||||
}
|
|
||||||
if (item.hasChapters() || item.getChapters() != null) {
|
|
||||||
removeChaptersOfItem(item);
|
|
||||||
}
|
|
||||||
db.delete(TABLE_NAME_FEED_ITEMS, KEY_ID + "=?",
|
|
||||||
new String[]{String.valueOf(item.getId())});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the listed items and their FeedMedia entries.
|
* Remove the listed items and their FeedMedia entries.
|
||||||
*/
|
*/
|
||||||
public void removeFeedItems(@NonNull List<FeedItem> items) {
|
public void removeFeedItems(@NonNull List<FeedItem> items) {
|
||||||
try {
|
try {
|
||||||
db.beginTransactionNonExclusive();
|
StringBuilder mediaIds = new StringBuilder();
|
||||||
|
StringBuilder itemIds = new StringBuilder();
|
||||||
for (FeedItem item : items) {
|
for (FeedItem item : items) {
|
||||||
removeFeedItem(item);
|
if (item.getMedia() != null) {
|
||||||
|
if (mediaIds.length() != 0) {
|
||||||
|
mediaIds.append(",");
|
||||||
|
}
|
||||||
|
mediaIds.append(item.getMedia().getId());
|
||||||
|
}
|
||||||
|
if (itemIds.length() != 0) {
|
||||||
|
itemIds.append(",");
|
||||||
|
}
|
||||||
|
itemIds.append(item.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
db.beginTransactionNonExclusive();
|
||||||
|
db.delete(TABLE_NAME_SIMPLECHAPTERS, KEY_FEEDITEM + " IN (" + itemIds + ")", null);
|
||||||
|
db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILETYPE + "=" + FeedMedia.FEEDFILETYPE_FEEDMEDIA
|
||||||
|
+ " AND " + KEY_FEEDFILE + " IN (" + mediaIds + ")", null);
|
||||||
|
db.delete(TABLE_NAME_FEED_MEDIA, KEY_ID + " IN (" + mediaIds + ")", null);
|
||||||
|
db.delete(TABLE_NAME_FEED_ITEMS, KEY_ID + " IN (" + itemIds + ")", null);
|
||||||
db.setTransactionSuccessful();
|
db.setTransactionSuccessful();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Log.e(TAG, Log.getStackTraceString(e));
|
Log.e(TAG, Log.getStackTraceString(e));
|
||||||
@ -894,9 +881,7 @@ public class PodDBAdapter {
|
|||||||
try {
|
try {
|
||||||
db.beginTransactionNonExclusive();
|
db.beginTransactionNonExclusive();
|
||||||
if (feed.getItems() != null) {
|
if (feed.getItems() != null) {
|
||||||
for (FeedItem item : feed.getItems()) {
|
removeFeedItems(feed.getItems());
|
||||||
removeFeedItem(item);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// delete download log entries for feed
|
// delete download log entries for feed
|
||||||
db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE + "=?",
|
db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE + "=?",
|
||||||
@ -1359,25 +1344,7 @@ public class PodDBAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Select number of items, new items, the date of the latest episode and the number of episodes in progress. The result
|
* Insert raw data to the database.
|
||||||
* is sorted by the title of the feed.
|
|
||||||
*/
|
|
||||||
private static final String FEED_STATISTICS_QUERY = "SELECT Feeds.id, num_items, new_items, latest_episode, in_progress FROM " +
|
|
||||||
" Feeds LEFT JOIN " +
|
|
||||||
"(SELECT feed,count(*) AS num_items," +
|
|
||||||
" COUNT(CASE WHEN read=0 THEN 1 END) AS new_items," +
|
|
||||||
" MAX(pubDate) AS latest_episode," +
|
|
||||||
" COUNT(CASE WHEN position>0 THEN 1 END) AS in_progress," +
|
|
||||||
" COUNT(CASE WHEN downloaded=1 THEN 1 END) AS episodes_downloaded " +
|
|
||||||
" FROM FeedItems LEFT JOIN FeedMedia ON FeedItems.id=FeedMedia.feeditem GROUP BY FeedItems.feed)" +
|
|
||||||
" ON Feeds.id = feed ORDER BY Feeds.title COLLATE NOCASE ASC;";
|
|
||||||
|
|
||||||
public Cursor getFeedStatisticsCursor() {
|
|
||||||
return db.rawQuery(FEED_STATISTICS_QUERY, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Insert raw data to the database. *
|
|
||||||
* Call method only for unit tests.
|
* Call method only for unit tests.
|
||||||
*/
|
*/
|
||||||
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
|
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user