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:
@@ -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>,
|
||||
|
@@ -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> {
|
||||
|
@@ -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? {
|
||||
|
@@ -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()
|
||||
}
|
||||
}
|
||||
|
@@ -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()
|
||||
}
|
||||
|
||||
|
@@ -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(
|
||||
|
@@ -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()
|
||||
}
|
||||
|
||||
|
@@ -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()
|
||||
}
|
||||
|
||||
|
@@ -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) }
|
||||
|
@@ -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>> {
|
||||
|
Reference in New Issue
Block a user