Skip to content

Commit fe563f3

Browse files
Improve DAO method calls
1 parent e00e256 commit fe563f3

12 files changed

Lines changed: 53 additions & 98 deletions

File tree

app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ class DatabaseMigrationTest {
129129
)
130130

131131
val migratedDatabaseV3 = getMigratedDatabase()
132-
val listFromDB = migratedDatabaseV3.streamDAO().all.blockingFirst()
132+
val listFromDB = migratedDatabaseV3.streamDAO().getAll().blockingFirst()
133133

134134
// Only expect 2, the one with the null url will be ignored
135135
assertEquals(2, listFromDB.size)

app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package org.schabi.newpipe.database
33
import android.content.Context
44
import androidx.room.Room
55
import androidx.test.core.app.ApplicationProvider
6-
import io.reactivex.rxjava3.core.Single
6+
import kotlinx.coroutines.Dispatchers
7+
import kotlinx.coroutines.runBlocking
8+
import kotlinx.coroutines.rx3.await
79
import org.junit.After
810
import org.junit.Assert.assertEquals
911
import org.junit.Assert.assertNotNull
@@ -22,7 +24,6 @@ import org.schabi.newpipe.extractor.channel.ChannelInfo
2224
import org.schabi.newpipe.extractor.stream.StreamType
2325
import java.io.IOException
2426
import java.time.OffsetDateTime
25-
import kotlin.streams.toList
2627

2728
class FeedDAOTest {
2829
private lateinit var db: AppDatabase
@@ -94,14 +95,10 @@ class FeedDAOTest {
9495
)
9596
}
9697

97-
private fun setupUnlinkDelete(time: String) {
98+
private fun setupUnlinkDelete(time: String) = runBlocking(Dispatchers.IO) {
9899
clearAndFillTables()
99-
Single.fromCallable {
100-
feedDAO.unlinkStreamsOlderThan(OffsetDateTime.parse(time))
101-
}.blockingSubscribe()
102-
Single.fromCallable {
103-
streamDAO.deleteOrphans()
104-
}.blockingSubscribe()
100+
feedDAO.unlinkStreamsOlderThan(OffsetDateTime.parse(time))
101+
streamDAO.deleteOrphans().await()
105102
}
106103

107104
private fun clearAndFillTables() {

app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,6 @@ class LocalPlaylistManagerTest {
7272
val result = manager.createPlaylist("name", listOf(stream, upserted))
7373

7474
result.test().await().assertComplete()
75-
database.streamDAO().all.test().awaitCount(1).assertValue(listOf(stream, upserted))
75+
database.streamDAO().getAll().test().awaitCount(1).assertValue(listOf(stream, upserted))
7676
}
7777
}

app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ abstract class FeedDAO {
119119
AND s.upload_date <> max_upload_date))
120120
"""
121121
)
122-
abstract fun unlinkStreamsOlderThan(offsetDateTime: OffsetDateTime)
122+
abstract suspend fun unlinkStreamsOlderThan(offsetDateTime: OffsetDateTime)
123123

124124
@Query(
125125
"""

app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,29 +30,29 @@
3030
import io.reactivex.rxjava3.core.Flowable;
3131

3232
@Dao
33-
public abstract class StreamHistoryDAO {
33+
public interface StreamHistoryDAO {
3434
@Insert
35-
public abstract long insert(StreamHistoryEntity entity);
35+
long insert(StreamHistoryEntity entity);
3636

3737
@Delete
38-
public abstract void delete(StreamHistoryEntity entity);
38+
void delete(StreamHistoryEntity entity);
3939

4040
@Query("DELETE FROM " + STREAM_HISTORY_TABLE)
41-
public abstract Completable deleteAll();
41+
Completable deleteAll();
4242

4343
@Query("SELECT * FROM " + STREAM_TABLE
4444
+ " INNER JOIN " + STREAM_HISTORY_TABLE
4545
+ " ON " + STREAM_ID + " = " + JOIN_STREAM_ID
4646
+ " ORDER BY " + STREAM_ID + " ASC")
47-
public abstract Flowable<List<StreamHistoryEntry>> getHistorySortedById();
47+
Flowable<List<StreamHistoryEntry>> getHistorySortedById();
4848

4949
@Query("SELECT * FROM " + STREAM_HISTORY_TABLE + " WHERE " + JOIN_STREAM_ID
5050
+ " = :streamId ORDER BY " + STREAM_ACCESS_DATE + " DESC LIMIT 1")
5151
@Nullable
52-
public abstract StreamHistoryEntity getLatestEntry(long streamId);
52+
StreamHistoryEntity getLatestEntry(long streamId);
5353

5454
@Query("DELETE FROM " + STREAM_HISTORY_TABLE + " WHERE " + JOIN_STREAM_ID + " = :streamId")
55-
public abstract int deleteStreamHistory(long streamId);
55+
Completable deleteStreamHistory(long streamId);
5656

5757
@RewriteQueriesToDropUnusedColumns
5858
@Query("SELECT * FROM " + STREAM_TABLE
@@ -74,7 +74,7 @@ public abstract class StreamHistoryDAO {
7474

7575
+ " ORDER BY " + STREAM_LATEST_DATE + " DESC"
7676
)
77-
public abstract PagingSource<Integer, StreamStatisticsEntry> getHistoryOrderedByLastWatched();
77+
PagingSource<Integer, StreamStatisticsEntry> getHistoryOrderedByLastWatched();
7878

7979
@RewriteQueriesToDropUnusedColumns
8080
@Query("SELECT * FROM " + STREAM_TABLE
@@ -96,5 +96,5 @@ public abstract class StreamHistoryDAO {
9696

9797
+ " ORDER BY " + STREAM_WATCH_COUNT + " DESC"
9898
)
99-
public abstract PagingSource<Integer, StreamStatisticsEntry> getHistoryOrderedByViewCount();
99+
PagingSource<Integer, StreamStatisticsEntry> getHistoryOrderedByViewCount();
100100
}

app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ abstract class StreamDAO : BasicDAO<StreamEntity> {
3030
@Query("SELECT * FROM streams WHERE url = :url AND service_id = :serviceId")
3131
abstract fun getStream(serviceId: Long, url: String): Maybe<StreamEntity>
3232

33-
@Query("UPDATE streams SET uploader_url = :uploaderUrl WHERE url = :url AND service_id = :serviceId")
34-
abstract fun setUploaderUrl(serviceId: Long, url: String, uploaderUrl: String): Completable
35-
3633
@Insert(onConflict = OnConflictStrategy.IGNORE)
3734
internal abstract fun silentInsertInternal(stream: StreamEntity): Long
3835

@@ -123,7 +120,7 @@ abstract class StreamDAO : BasicDAO<StreamEntity> {
123120
WHERE f.stream_id = streams.uid)
124121
"""
125122
)
126-
abstract fun deleteOrphans(): Int
123+
abstract fun deleteOrphans(): Completable
127124

128125
/**
129126
* Minimal entry class used when comparing/updating an existent stream.
Lines changed: 16 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,23 @@
1-
package org.schabi.newpipe.database.stream.dao;
1+
package org.schabi.newpipe.database.stream.dao
22

3-
import static org.schabi.newpipe.database.stream.model.StreamStateEntity.JOIN_STREAM_ID;
4-
import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_STATE_TABLE;
5-
6-
import androidx.room.Dao;
7-
import androidx.room.Insert;
8-
import androidx.room.OnConflictStrategy;
9-
import androidx.room.Query;
10-
import androidx.room.Transaction;
11-
12-
import org.schabi.newpipe.database.BasicDAO;
13-
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
14-
15-
import java.util.List;
16-
17-
import io.reactivex.rxjava3.core.Flowable;
18-
import io.reactivex.rxjava3.core.Maybe;
3+
import androidx.room.Dao
4+
import androidx.room.Query
5+
import androidx.room.Upsert
6+
import io.reactivex.rxjava3.core.Completable
7+
import io.reactivex.rxjava3.core.Maybe
8+
import org.schabi.newpipe.database.stream.model.StreamStateEntity
199

2010
@Dao
21-
public interface StreamStateDAO extends BasicDAO<StreamStateEntity> {
22-
@Override
23-
@Query("SELECT * FROM " + STREAM_STATE_TABLE)
24-
Flowable<List<StreamStateEntity>> getAll();
25-
26-
@Override
27-
@Query("DELETE FROM " + STREAM_STATE_TABLE)
28-
int deleteAll();
29-
30-
@Override
31-
default Flowable<List<StreamStateEntity>> listByService(final int serviceId) {
32-
throw new UnsupportedOperationException();
33-
}
34-
35-
@Query("SELECT * FROM " + STREAM_STATE_TABLE + " WHERE " + JOIN_STREAM_ID + " = :streamId")
36-
Maybe<StreamStateEntity> getState(long streamId);
11+
interface StreamStateDAO {
12+
@Query("DELETE FROM " + StreamStateEntity.STREAM_STATE_TABLE)
13+
fun deleteAll(): Completable
3714

38-
@Query("DELETE FROM " + STREAM_STATE_TABLE + " WHERE " + JOIN_STREAM_ID + " = :streamId")
39-
int deleteState(long streamId);
15+
@Query("SELECT * FROM " + StreamStateEntity.STREAM_STATE_TABLE + " WHERE " + StreamStateEntity.JOIN_STREAM_ID + " = :streamId")
16+
fun getState(streamId: Long): Maybe<StreamStateEntity>
4017

41-
@Insert(onConflict = OnConflictStrategy.IGNORE)
42-
void silentInsertInternal(StreamStateEntity streamState);
18+
@Query("DELETE FROM " + StreamStateEntity.STREAM_STATE_TABLE + " WHERE " + StreamStateEntity.JOIN_STREAM_ID + " = :streamId")
19+
fun deleteState(streamId: Long): Completable
4320

44-
@Transaction
45-
default long upsert(final StreamStateEntity stream) {
46-
silentInsertInternal(stream);
47-
return update(stream);
48-
}
21+
@Upsert
22+
fun upsert(stream: StreamStateEntity)
4923
}

app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package org.schabi.newpipe.local.feed
22

33
import android.content.Context
4-
import android.util.Log
54
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
65
import io.reactivex.rxjava3.core.Completable
76
import io.reactivex.rxjava3.core.Flowable
87
import io.reactivex.rxjava3.core.Maybe
98
import io.reactivex.rxjava3.schedulers.Schedulers
10-
import org.schabi.newpipe.MainActivity.DEBUG
9+
import kotlinx.coroutines.rx3.await
1110
import org.schabi.newpipe.NewPipeDatabase
1211
import org.schabi.newpipe.database.feed.model.FeedEntity
1312
import org.schabi.newpipe.database.feed.model.FeedGroupEntity
@@ -111,20 +110,9 @@ class FeedDatabaseManager(context: Context) {
111110
)
112111
}
113112

114-
fun removeOrphansOrOlderStreams(oldestAllowedDate: OffsetDateTime = FEED_OLDEST_ALLOWED_DATE) {
113+
suspend fun removeOrphansOrOlderStreams(oldestAllowedDate: OffsetDateTime = FEED_OLDEST_ALLOWED_DATE) {
115114
feedTable.unlinkStreamsOlderThan(oldestAllowedDate)
116-
streamTable.deleteOrphans()
117-
}
118-
119-
fun clear() {
120-
feedTable.deleteAll()
121-
val deletedOrphans = streamTable.deleteOrphans()
122-
if (DEBUG) {
123-
Log.d(
124-
this::class.java.simpleName,
125-
"clear() → streamTable.deleteOrphans() → $deletedOrphans"
126-
)
127-
}
115+
streamTable.deleteOrphans().await()
128116
}
129117

130118
// /////////////////////////////////////////////////////////////////////////

app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import android.content.Context
44
import android.content.SharedPreferences
55
import androidx.preference.PreferenceManager
66
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
7-
import io.reactivex.rxjava3.core.Completable
87
import io.reactivex.rxjava3.core.Flowable
98
import io.reactivex.rxjava3.core.Notification
109
import io.reactivex.rxjava3.core.Single
1110
import io.reactivex.rxjava3.functions.Consumer
1211
import io.reactivex.rxjava3.processors.PublishProcessor
1312
import io.reactivex.rxjava3.schedulers.Schedulers
13+
import kotlinx.coroutines.Dispatchers
14+
import kotlinx.coroutines.rx3.rxCompletable
1415
import org.schabi.newpipe.R
1516
import org.schabi.newpipe.database.feed.model.FeedGroupEntity
1617
import org.schabi.newpipe.database.subscription.NotificationMode
@@ -256,7 +257,7 @@ class FeedLoadManager(private val context: Context) {
256257
* Remove streams from the feed which are older than [FeedDatabaseManager.FEED_OLDEST_ALLOWED_DATE].
257258
* Remove streams from the database which are not linked / used by any table.
258259
*/
259-
private fun postProcessFeed() = Completable.fromRunnable {
260+
private fun postProcessFeed() = rxCompletable(Dispatchers.IO) {
260261
FeedEventManager.postEvent(FeedEventManager.Event.ProgressEvent(R.string.feed_processing_message))
261262
feedDatabaseManager.removeOrphansOrOlderStreams()
262263

app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -151,19 +151,16 @@ public Maybe<Long> onViewed(final StreamInfo info) {
151151
}
152152

153153
public Completable deleteStreamHistoryAndState(final long streamId) {
154-
return Completable.fromAction(() -> {
155-
streamStateTable.deleteState(streamId);
156-
streamHistoryTable.deleteStreamHistory(streamId);
157-
}).subscribeOn(Schedulers.io());
154+
return streamStateTable.deleteState(streamId)
155+
.andThen(streamHistoryTable.deleteStreamHistory(streamId));
158156
}
159157

160158
public Completable deleteWholeStreamHistory() {
161159
return streamHistoryTable.deleteAll().subscribeOn(Schedulers.io());
162160
}
163161

164-
public Single<Integer> deleteCompleteStreamStateHistory() {
165-
return Single.fromCallable(streamStateTable::deleteAll)
166-
.subscribeOn(Schedulers.io());
162+
public Completable deleteCompleteStreamStateHistory() {
163+
return streamStateTable.deleteAll().subscribeOn(Schedulers.io());
167164
}
168165

169166
public Flowable<List<StreamHistoryEntry>> getStreamHistorySortedById() {
@@ -278,8 +275,7 @@ public Single<List<StreamStateEntity>> loadLocalStreamStateBatch(
278275
// Utility
279276
///////////////////////////////////////////////////////
280277

281-
public Single<Integer> removeOrphanedRecords() {
282-
return Single.fromCallable(streamTable::deleteOrphans).subscribeOn(Schedulers.io());
278+
public Completable removeOrphanedRecords() {
279+
return streamTable.deleteOrphans().subscribeOn(Schedulers.io());
283280
}
284-
285281
}

0 commit comments

Comments
 (0)