From 0f924d4a95d3cfda7782d2492dbaac1d11cdc1db Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Mon, 28 Dec 2020 15:52:38 +0100 Subject: [PATCH] Use a different request for starred items when option is to true --- .../readrops/app/itemslist/MainViewModel.java | 11 ++++- .../java/com/readrops/db/ItemsQueryBuilder.kt | 45 ++++++++++++++----- .../db/entities/account/AccountConfig.java | 16 +++++++ .../com/readrops/db/ItemsQueryBuilderTest.kt | 14 +++--- 4 files changed, 66 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/readrops/app/itemslist/MainViewModel.java b/app/src/main/java/com/readrops/app/itemslist/MainViewModel.java index 211540e7..9a5ff1bb 100644 --- a/app/src/main/java/com/readrops/app/itemslist/MainViewModel.java +++ b/app/src/main/java/com/readrops/app/itemslist/MainViewModel.java @@ -6,6 +6,7 @@ import androidx.lifecycle.MediatorLiveData; import androidx.lifecycle.ViewModel; import androidx.paging.LivePagedListBuilder; import androidx.paging.PagedList; +import androidx.sqlite.db.SupportSQLiteQuery; import com.readrops.app.repositories.ARepository; import com.readrops.app.utils.SharedPreferencesManager; @@ -67,8 +68,16 @@ public class MainViewModel extends ViewModel { itemsWithFeed.removeSource(lastFetch); } + SupportSQLiteQuery query; + + if (queryFilters.getFilterType() == FilterType.STARS_FILTER && currentAccount.getAccountType().getAccountConfig().isUseStarredItems()) { + query = ItemsQueryBuilder.buildStarredItemsQuery(queryFilters); + } else { + query = ItemsQueryBuilder.buildItemsQuery(queryFilters); + } + lastFetch = new LivePagedListBuilder<>(new RoomFactoryWrapper<>(database.itemDao() - .selectAll(ItemsQueryBuilder.buildQuery(queryFilters))), + .selectAll(query)), new PagedList.Config.Builder() .setPageSize(100) .setPrefetchDistance(150) diff --git a/db/src/main/java/com/readrops/db/ItemsQueryBuilder.kt b/db/src/main/java/com/readrops/db/ItemsQueryBuilder.kt index d7c4cd2a..70660ec4 100644 --- a/db/src/main/java/com/readrops/db/ItemsQueryBuilder.kt +++ b/db/src/main/java/com/readrops/db/ItemsQueryBuilder.kt @@ -7,36 +7,44 @@ import com.readrops.db.filters.ListSortType object ItemsQueryBuilder { - private val COLUMNS = arrayOf("Item.id", "title", "clean_description", "image_link", "pub_date", "read", - "read_changed", "read_it_later", "Feed.name", "text_color", "background_color", "icon_url", "read_time", "Item.remoteId", + private val COLUMNS = arrayOf("title", "clean_description", "image_link", "pub_date", "read", + "read_changed", "read_it_later", "Feed.name", "text_color", "background_color", "icon_url", "read_time", "Feed.id as feedId", "Feed.account_id", "Folder.id as folder_id", "Folder.name as folder_name") + private val ITEM_COLUMNS = arrayOf(".id", ".remoteId") + private const val SELECT_ALL_JOIN = "Item INNER JOIN Feed on Item.feed_id = Feed.id " + "LEFT JOIN Folder on Feed.folder_id = Folder.id" - private const val ORDER_BY_ASC = "Item.id DESC" + private const val ORDER_BY_ASC = ".id DESC" private const val ORDER_BY_DESC = "pub_date ASC" + @JvmStatic + fun buildItemsQuery(queryFilters: QueryFilters): SupportSQLiteQuery = + buildQuery(queryFilters, false) @JvmStatic - fun buildQuery(queryFilters: QueryFilters): SupportSQLiteQuery { - if (queryFilters.accountId == 0) + fun buildStarredItemsQuery(queryFilters: QueryFilters): SupportSQLiteQuery = + buildQuery(queryFilters, true) + + private fun buildQuery(queryFilters: QueryFilters, starQuery: Boolean): SupportSQLiteQuery = with(queryFilters) { + if (accountId == 0) throw IllegalArgumentException("AccountId must be greater than 0") - if (queryFilters.filterType == FilterType.FEED_FILTER && queryFilters.filterFeedId == 0) + if (filterType == FilterType.FEED_FILTER && filterFeedId == 0) throw IllegalArgumentException("FeedId must be greater than 0 if current filter is FEED_FILTER") - return SupportSQLiteQueryBuilder.builder(SELECT_ALL_JOIN).run { - columns(COLUMNS) - selection(buildWhereClause(queryFilters), null) - orderBy(if (queryFilters.sortType == ListSortType.NEWEST_TO_OLDEST) ORDER_BY_ASC else ORDER_BY_DESC) + SupportSQLiteQueryBuilder.builder(if (starQuery) SELECT_ALL_JOIN.replace("Item", "StarredItem") else SELECT_ALL_JOIN).run { + columns(COLUMNS.plus(buildItemColumns(starQuery))) + selection(buildWhereClause(this@with), null) + orderBy(if (sortType == ListSortType.NEWEST_TO_OLDEST) buildOrderByAsc(starQuery) else ORDER_BY_DESC) create() } } - private fun buildWhereClause(queryFilters: QueryFilters): String? { + private fun buildWhereClause(queryFilters: QueryFilters): String { return StringBuilder(500).run { append("Feed.account_id = ${queryFilters.accountId} And ") @@ -51,8 +59,21 @@ object ItemsQueryBuilder { toString() } - } + + private fun buildItemColumns(starQuery: Boolean): Array { + val columns = arrayListOf() + + for (column in ITEM_COLUMNS) { + columns += if (starQuery) "StarredItem$column" else "Item$column" + } + + return columns.toTypedArray() + } + + private fun buildOrderByAsc(starQuery: Boolean): String = + if (starQuery) "StarredItem$ORDER_BY_ASC" else "Item$ORDER_BY_ASC" + } class QueryFilters(var showReadItems: Boolean = true, diff --git a/db/src/main/java/com/readrops/db/entities/account/AccountConfig.java b/db/src/main/java/com/readrops/db/entities/account/AccountConfig.java index b05c8bf7..2c086408 100644 --- a/db/src/main/java/com/readrops/db/entities/account/AccountConfig.java +++ b/db/src/main/java/com/readrops/db/entities/account/AccountConfig.java @@ -6,18 +6,21 @@ public class AccountConfig { .setFeedUrlEditable(true) .setFolderCreation(true) .setNoFolderCase(false) + .setUseStarredItems(false) .build(); public static final AccountConfig NEXTNEWS = new AccountConfigBuilder() .setFeedUrlEditable(false) .setFolderCreation(true) .setNoFolderCase(false) + .setUseStarredItems(false) .build(); public static final AccountConfig FRESHRSS = new AccountConfigBuilder() .setFeedUrlEditable(false) .setFolderCreation(false) .setNoFolderCase(true) + .setUseStarredItems(true) .build(); private boolean feedUrlEditable; @@ -26,6 +29,8 @@ public class AccountConfig { private boolean noFolderCase; + private boolean useStarredItems; + public boolean isFeedUrlEditable() { return feedUrlEditable; } @@ -38,16 +43,22 @@ public class AccountConfig { return noFolderCase; } + public boolean isUseStarredItems() { + return useStarredItems; + } + public AccountConfig(AccountConfigBuilder builder) { this.feedUrlEditable = builder.feedUrlEditable; this.folderCreation = builder.folderCreation; this.noFolderCase = builder.noFolderCase; + this.useStarredItems = builder.useStarredItems; } public static class AccountConfigBuilder { private boolean feedUrlEditable; private boolean folderCreation; private boolean noFolderCase; + private boolean useStarredItems; public AccountConfigBuilder setFeedUrlEditable(boolean feedUrlEditable) { this.feedUrlEditable = feedUrlEditable; @@ -64,6 +75,11 @@ public class AccountConfig { return this; } + public AccountConfigBuilder setUseStarredItems(boolean useStarredItems) { + this.useStarredItems = useStarredItems; + return this; + } + public AccountConfig build() { return new AccountConfig(this); } diff --git a/db/src/test/java/com/readrops/db/ItemsQueryBuilderTest.kt b/db/src/test/java/com/readrops/db/ItemsQueryBuilderTest.kt index b61ce808..fd16b23b 100644 --- a/db/src/test/java/com/readrops/db/ItemsQueryBuilderTest.kt +++ b/db/src/test/java/com/readrops/db/ItemsQueryBuilderTest.kt @@ -12,7 +12,7 @@ class ItemsQueryBuilderTest { fun noFilterDefaultSortCaseTest() { val queryFilters = QueryFilters(accountId = 1) - val query = ItemsQueryBuilder.buildQuery(queryFilters).sql + val query = ItemsQueryBuilder.buildItemsQuery(queryFilters).sql assertTrue(query.contains("Feed.account_id = 1")) assertTrue(query.contains("read_it_later = 0")) @@ -26,7 +26,7 @@ class ItemsQueryBuilderTest { val queryFilters = QueryFilters(accountId = 1, filterType = FilterType.FEED_FILTER, filterFeedId = 15) - val query = ItemsQueryBuilder.buildQuery(queryFilters).sql + val query = ItemsQueryBuilder.buildItemsQuery(queryFilters).sql assertTrue(query.contains("feed_id = 15 And read_it_later = 0")) } @@ -35,7 +35,7 @@ class ItemsQueryBuilderTest { fun readLaterFilterCaseTest() { val queryFilters = QueryFilters(accountId = 1, filterType = FilterType.READ_IT_LATER_FILTER) - val query = ItemsQueryBuilder.buildQuery(queryFilters).sql + val query = ItemsQueryBuilder.buildItemsQuery(queryFilters).sql assertTrue(query.contains("read_it_later = 1")) } @@ -43,7 +43,7 @@ class ItemsQueryBuilderTest { fun starsFilterCaseTest() { val queryFilters = QueryFilters(accountId = 1, filterType = FilterType.STARS_FILTER) - val query = ItemsQueryBuilder.buildQuery(queryFilters).sql + val query = ItemsQueryBuilder.buildItemsQuery(queryFilters).sql assertTrue(query.contains("starred = 1 And read_it_later = 0")) } @@ -52,7 +52,7 @@ class ItemsQueryBuilderTest { val queryFilters = QueryFilters(accountId = 1, sortType = ListSortType.OLDEST_TO_NEWEST, showReadItems = false) - val query = ItemsQueryBuilder.buildQuery(queryFilters).sql + val query = ItemsQueryBuilder.buildItemsQuery(queryFilters).sql assertTrue(query.contains("read = 0 And ")) assertTrue(query.contains("pub_date ASC")) @@ -62,12 +62,12 @@ class ItemsQueryBuilderTest { fun accountIdExceptionTest() { val queryFilters = QueryFilters() - ItemsQueryBuilder.buildQuery(queryFilters) + ItemsQueryBuilder.buildItemsQuery(queryFilters) } @Test(expected = IllegalArgumentException::class) fun filterFeedIdExceptionTest() { val queryFilters = QueryFilters(accountId = 1, filterType = FilterType.FEED_FILTER) - ItemsQueryBuilder.buildQuery(queryFilters) + ItemsQueryBuilder.buildItemsQuery(queryFilters) } } \ No newline at end of file