AntennaPod/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemFilterQuery.java

83 lines
3.6 KiB
Java

package de.danoeh.antennapod.storage.database.mapper;
import de.danoeh.antennapod.model.feed.FeedItemFilter;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
import java.util.ArrayList;
import java.util.List;
public class FeedItemFilterQuery {
private FeedItemFilterQuery() {
// Must not be instantiated
}
/**
* Express the filter using an SQL boolean statement that can be inserted into an SQL WHERE clause
* to yield output filtered according to the rules of this filter.
*
* @return An SQL boolean statement that matches the desired items,
* empty string if there is nothing to filter
*/
public static String generateFrom(FeedItemFilter filter) {
// The keys used within this method, but explicitly combined with their table
String keyRead = PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_READ;
String keyPosition = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_POSITION;
String keyCompletionDate = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_PLAYBACK_COMPLETION_DATE;
String keyDownloaded = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_DOWNLOAD_DATE;
String keyMediaId = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_ID;
String keyItemId = PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_ID;
String keyFeedItem = PodDBAdapter.KEY_FEEDITEM;
String tableQueue = PodDBAdapter.TABLE_NAME_QUEUE;
String tableFavorites = PodDBAdapter.TABLE_NAME_FAVORITES;
List<String> statements = new ArrayList<>();
if (filter.showPlayed) {
statements.add(keyRead + " = 1 ");
} else if (filter.showUnplayed) {
statements.add(" NOT " + keyRead + " = 1 "); // Match "New" items (read = -1) as well
} else if (filter.showNew) {
statements.add(keyRead + " = -1 ");
}
if (filter.showPaused) {
statements.add(" (" + keyPosition + " NOT NULL AND " + keyPosition + " > 0 " + ") ");
} else if (filter.showNotPaused) {
statements.add(" (" + keyPosition + " IS NULL OR " + keyPosition + " = 0 " + ") ");
}
if (filter.showQueued) {
statements.add(keyItemId + " IN (SELECT " + keyFeedItem + " FROM " + tableQueue + ") ");
} else if (filter.showNotQueued) {
statements.add(keyItemId + " NOT IN (SELECT " + keyFeedItem + " FROM " + tableQueue + ") ");
}
if (filter.showDownloaded) {
statements.add(keyDownloaded + " > 0 ");
} else if (filter.showNotDownloaded) {
statements.add(keyDownloaded + " = 0 ");
}
if (filter.showHasMedia) {
statements.add(keyMediaId + " NOT NULL ");
} else if (filter.showNoMedia) {
statements.add(keyMediaId + " IS NULL ");
}
if (filter.showIsFavorite) {
statements.add(keyItemId + " IN (SELECT " + keyFeedItem + " FROM " + tableFavorites + ") ");
} else if (filter.showNotFavorite) {
statements.add(keyItemId + " NOT IN (SELECT " + keyFeedItem + " FROM " + tableFavorites + ") ");
}
if (filter.showInHistory) {
statements.add(keyCompletionDate + " > 0 ");
}
if (statements.isEmpty()) {
return "";
}
StringBuilder query = new StringBuilder(" (" + statements.get(0));
for (String r : statements.subList(1, statements.size())) {
query.append(" AND ");
query.append(r);
}
query.append(") ");
return query.toString();
}
}