1
0
mirror of https://github.com/vector-im/riotX-android synced 2025-10-06 00:02:48 +02:00

Realm-kotlin: introduce queryFirstMapped so we can map on the same dispatcher

This commit is contained in:
ganfra
2022-10-21 17:13:13 +02:00
parent b806bd59a1
commit e1031fab0f
10 changed files with 39 additions and 46 deletions

View File

@@ -27,6 +27,7 @@ import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.internal.database.pagedlist.RealmTiledDataSource
import org.matrix.android.sdk.internal.util.mapOptional
internal fun interface RealmQueryBuilder<T : RealmObject> {
fun build(realm: TypedRealm): RealmQuery<T>
@@ -97,6 +98,15 @@ internal class RealmInstance(
}.flowOn(coroutineDispatcher)
}
fun <T : RealmObject, U : Any> queryFirstMapped(
mapper: (T) -> U?,
realmQueryBuilder: RealmSingleQueryBuilder<T>
): Flow<Optional<U>> {
return queryFirst(realmQueryBuilder)
.mapOptional(mapper)
.flowOn(coroutineDispatcher)
}
fun <T : RealmObject, R> queryPagedList(
config: PagedList.Config,
mapper: RealmObjectMapper<T, R>,

View File

@@ -40,6 +40,7 @@ import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotification
import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.internal.database.RealmInstance
import org.matrix.android.sdk.internal.database.mapper.asDomain
import org.matrix.android.sdk.internal.database.model.RoomMemberSummaryEntity
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.session.room.alias.DeleteRoomAliasTask
import org.matrix.android.sdk.internal.session.room.alias.GetRoomIdByAliasTask
@@ -56,7 +57,6 @@ import org.matrix.android.sdk.internal.session.room.read.MarkAllRoomsReadTask
import org.matrix.android.sdk.internal.session.room.summary.RoomSummaryDataSource
import org.matrix.android.sdk.internal.session.room.summary.RoomSummaryUpdater
import org.matrix.android.sdk.internal.session.user.accountdata.UpdateBreadcrumbsTask
import org.matrix.android.sdk.internal.util.mapOptional
import javax.inject.Inject
internal class DefaultRoomService @Inject constructor(
@@ -227,14 +227,15 @@ internal class DefaultRoomService @Inject constructor(
}
override fun getRoomMemberLive(userId: String, roomId: String): LiveData<Optional<RoomMemberSummary>> {
return realmInstance.queryFirst { realm ->
fun map(roomMemberSummaryEntity: RoomMemberSummaryEntity) = roomMemberSummaryEntity.asDomain()
return realmInstance.queryFirstMapped(::map) { realm ->
RoomMemberHelper(realm, roomId)
.queryRoomMembersEvent()
.query("userId == $0", userId)
.first()
}
.mapOptional { it.asDomain() }
.asLiveData()
}.asLiveData()
}
override suspend fun getRoomState(roomId: String): List<Event> {

View File

@@ -29,7 +29,6 @@ import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity
import org.matrix.android.sdk.internal.database.model.UserDraftsEntity
import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.util.mapOptional
import timber.log.Timber
import javax.inject.Inject
@@ -57,11 +56,9 @@ internal class DraftRepository @Inject constructor(
}
fun getDraftsLive(roomId: String): LiveData<Optional<UserDraft>> {
return realmInstance.queryFirst {
return realmInstance.queryFirstMapped(::mapUserDrafts) {
UserDraftsEntity.where(it, roomId).first()
}
.mapOptional(::mapUserDrafts)
.asLiveData()
}.asLiveData()
}
private fun mapUserDrafts(userDraftsEntity: UserDraftsEntity): UserDraft? {

View File

@@ -32,7 +32,6 @@ import org.matrix.android.sdk.internal.database.model.livelocation.LiveLocationS
import org.matrix.android.sdk.internal.database.query.findRunningLiveInRoom
import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.util.mapOptional
internal class DefaultLocationSharingService @AssistedInject constructor(
@Assisted private val roomId: String,
@@ -119,10 +118,9 @@ internal class DefaultLocationSharingService @AssistedInject constructor(
}
override fun getLiveLocationShareSummary(beaconInfoEventId: String): LiveData<Optional<LiveLocationShareAggregatedSummary>> {
return realmInstance.queryFirst {
return realmInstance.queryFirstMapped(liveLocationShareAggregatedSummaryMapper::map) {
LiveLocationShareAggregatedSummaryEntity.where(it, roomId = roomId, eventId = beaconInfoEventId).first()
}
.mapOptional(liveLocationShareAggregatedSummaryMapper::map)
.asLiveData()
}
}

View File

@@ -98,10 +98,10 @@ internal class DefaultReadService @AssistedInject constructor(
}
override fun getEventReadReceiptsLive(eventId: String): LiveData<List<ReadReceipt>> {
return realmInstance.queryFirst {
return realmInstance.queryFirstMapped(readReceiptsSummaryMapper::map) {
ReadReceiptsSummaryEntity.where(it, eventId)
}.map {
readReceiptsSummaryMapper.map(it.getOrNull())
it.getOrNull().orEmpty()
}.asLiveData()
}

View File

@@ -36,7 +36,6 @@ import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory
import org.matrix.android.sdk.internal.session.room.send.queue.EventSenderProcessor
import org.matrix.android.sdk.internal.session.room.timeline.TimelineEventDataSource
import org.matrix.android.sdk.internal.util.mapOptional
import timber.log.Timber
internal class DefaultRelationService @AssistedInject constructor(
@@ -157,11 +156,12 @@ internal class DefaultRelationService @AssistedInject constructor(
}
override fun getEventAnnotationsSummaryLive(eventId: String): LiveData<Optional<EventAnnotationsSummary>> {
return realmInstance.queryFirst {
fun map(entity: EventAnnotationsSummaryEntity): EventAnnotationsSummary = entity.asDomain()
return realmInstance.queryFirstMapped(::map) {
EventAnnotationsSummaryEntity.where(it, roomId, eventId).first()
}
.mapOptional { it.asDomain() }
.asLiveData()
}.asLiveData()
}
override fun replyInThread(

View File

@@ -50,10 +50,11 @@ internal class StateEventDataSource @Inject constructor(
}
fun getStateEventLive(roomId: String, eventType: String, stateKey: QueryStateEventValue): LiveData<Optional<Event>> {
return realmInstance.queryFirst {
fun map(entity: CurrentStateEventEntity) = entity.root?.asDomain()
return realmInstance.queryFirstMapped(::map) {
buildStateEventQuery(it, roomId, setOf(eventType), stateKey).first()
}.mapOptional {
it.root?.asDomain()
}.asLiveData()
}

View File

@@ -56,7 +56,6 @@ import org.matrix.android.sdk.internal.database.queryIn
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.query.QueryStringValueProcessor
import org.matrix.android.sdk.internal.query.process
import org.matrix.android.sdk.internal.util.mapOptional
import javax.inject.Inject
internal class RoomSummaryDataSource @Inject constructor(
@@ -80,10 +79,8 @@ internal class RoomSummaryDataSource @Inject constructor(
}
fun getRoomSummaryLive(roomId: String): LiveData<Optional<RoomSummary>> {
return realmInstance.queryFirst {
return realmInstance.queryFirstMapped(roomSummaryMapper::map) {
RoomSummaryEntity.where(it, roomId).first()
}.mapOptional {
roomSummaryMapper.map(it)
}.asLiveData()
}
@@ -107,10 +104,8 @@ internal class RoomSummaryDataSource @Inject constructor(
}
fun getLocalRoomSummaryLive(roomId: String): LiveData<Optional<LocalRoomSummary>> {
return realmInstance.queryFirst {
return realmInstance.queryFirstMapped(localRoomSummaryMapper::map) {
LocalRoomSummaryEntity.where(it, roomId).first()
}.mapOptional {
localRoomSummaryMapper.map(it)
}.asLiveData()
}
@@ -136,13 +131,11 @@ internal class RoomSummaryDataSource @Inject constructor(
}
fun getSpaceSummaryLive(roomId: String): LiveData<Optional<RoomSummary>> {
return realmInstance.queryFirst { realm ->
return realmInstance.queryFirstMapped(roomSummaryMapper::map) { realm ->
RoomSummaryEntity.where(realm, roomId)
.query("displayName != ''")
.query("roomType == $0", RoomType.SPACE)
.first()
}.mapOptional {
roomSummaryMapper.map(it)
}.asLiveData()
}

View File

@@ -48,11 +48,9 @@ internal class LiveTimelineEvent(
private var initialLiveData: LiveData<Optional<TimelineEvent>>? = null
private fun buildAndObserveQuery() {
val liveData = realmInstance.queryFirst {
val liveData = realmInstance.queryFirstMapped(timelineEventMapper::map) {
TimelineEventEntity.where(it, roomId = roomId, eventId = eventId).first()
}
.mapOptional(timelineEventMapper::map)
.asLiveData()
}.asLiveData()
addSource(liveData) { newValue ->
value = newValue
@@ -64,11 +62,9 @@ internal class LiveTimelineEvent(
}
private fun observeTimelineEventWithTxId() {
val liveData = realmInstance.queryFirst {
val liveData = realmInstance.queryFirstMapped(timelineEventMapper::map) {
it.queryTimelineEventWithTxId().first()
}
.mapOptional(timelineEventMapper::map)
.asLiveData()
}.asLiveData()
addSource(liveData) { newValue ->
if (newValue.hasValue()) {
initialLiveData?.also { removeSource(it) }

View File

@@ -28,7 +28,6 @@ import org.matrix.android.sdk.internal.database.model.UserEntity
import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.database.queryNotIn
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.util.mapOptional
import javax.inject.Inject
internal class UserDataSource @Inject constructor(
@@ -54,11 +53,9 @@ internal class UserDataSource @Inject constructor(
fun getUserOrDefault(userId: String): User = getUser(userId) ?: User(userId)
fun getUserLive(userId: String): LiveData<Optional<User>> {
return realmInstance.queryFirst {
return realmInstance.queryFirstMapped(this::mapUser) {
UserEntity.where(it, userId).first()
}
.mapOptional(this::mapUser)
.asLiveData()
}.asLiveData()
}
fun getUsersLive(): LiveData<List<User>> {