extracting the room members caching to its own class - need an upper limit to be set

This commit is contained in:
Adam Brown 2022-04-13 21:52:37 +01:00
parent dccf8cc206
commit aa78bcd439
2 changed files with 15 additions and 10 deletions

View File

@ -10,6 +10,7 @@ import app.dapk.st.matrix.common.RoomMember
import app.dapk.st.matrix.common.UserId import app.dapk.st.matrix.common.UserId
import app.dapk.st.matrix.room.internal.DefaultRoomService import app.dapk.st.matrix.room.internal.DefaultRoomService
import app.dapk.st.matrix.room.internal.RoomMembers import app.dapk.st.matrix.room.internal.RoomMembers
import app.dapk.st.matrix.room.internal.RoomMembersCache
private val SERVICE_KEY = RoomService::class private val SERVICE_KEY = RoomService::class
@ -40,7 +41,7 @@ fun MatrixServiceInstaller.installRoomService(
roomMessenger: ServiceDepFactory<RoomMessenger>, roomMessenger: ServiceDepFactory<RoomMessenger>,
) { ) {
this.install { (httpClient, _, services, logger) -> this.install { (httpClient, _, services, logger) ->
SERVICE_KEY to DefaultRoomService(httpClient, logger, RoomMembers(memberStore), roomMessenger.create(services)) SERVICE_KEY to DefaultRoomService(httpClient, logger, RoomMembers(memberStore, RoomMembersCache()), roomMessenger.create(services))
} }
} }

View File

@ -5,19 +5,17 @@ import app.dapk.st.matrix.common.RoomMember
import app.dapk.st.matrix.common.UserId import app.dapk.st.matrix.common.UserId
import app.dapk.st.matrix.room.MemberStore import app.dapk.st.matrix.room.MemberStore
class RoomMembers(private val memberStore: MemberStore) { class RoomMembers(private val memberStore: MemberStore, private val membersCache: RoomMembersCache) {
private val cache = mutableMapOf<RoomId, MutableMap<UserId, RoomMember>>()
suspend fun findMember(roomId: RoomId, userId: UserId): RoomMember? { suspend fun findMember(roomId: RoomId, userId: UserId): RoomMember? {
return findMembers(roomId, listOf(userId)).firstOrNull() return findMembers(roomId, listOf(userId)).firstOrNull()
} }
suspend fun findMembers(roomId: RoomId, userIds: List<UserId>): List<RoomMember> { suspend fun findMembers(roomId: RoomId, userIds: List<UserId>): List<RoomMember> {
val roomCache = cache[roomId] val roomCache = membersCache.room(roomId)
return if (roomCache.isNullOrEmpty()) { return if (roomCache.isNullOrEmpty()) {
memberStore.query(roomId, userIds).also { cache(roomId, it) } memberStore.query(roomId, userIds).also { membersCache.insert(roomId, it) }
} else { } else {
val (cachedMembers, missingIds) = userIds.fold(mutableListOf<RoomMember>() to mutableListOf<UserId>()) { acc, current -> val (cachedMembers, missingIds) = userIds.fold(mutableListOf<RoomMember>() to mutableListOf<UserId>()) { acc, current ->
when (val member = roomCache[current]) { when (val member = roomCache[current]) {
@ -29,7 +27,7 @@ class RoomMembers(private val memberStore: MemberStore) {
when { when {
missingIds.isNotEmpty() -> { missingIds.isNotEmpty() -> {
(memberStore.query(roomId, missingIds).also { cache(roomId, it) } + cachedMembers) (memberStore.query(roomId, missingIds).also { membersCache.insert(roomId, it) } + cachedMembers)
} }
else -> cachedMembers else -> cachedMembers
} }
@ -37,13 +35,19 @@ class RoomMembers(private val memberStore: MemberStore) {
} }
suspend fun insert(roomId: RoomId, members: List<RoomMember>) { suspend fun insert(roomId: RoomId, members: List<RoomMember>) {
cache(roomId, members) membersCache.insert(roomId, members)
memberStore.insert(roomId, members) memberStore.insert(roomId, members)
} }
}
private fun cache(roomId: RoomId, members: List<RoomMember>) { class RoomMembersCache {
private val cache = mutableMapOf<RoomId, MutableMap<UserId, RoomMember>>()
fun room(roomId: RoomId) = cache[roomId]
fun insert(roomId: RoomId, members: List<RoomMember>) {
val map = cache.getOrPut(roomId) { mutableMapOf() } val map = cache.getOrPut(roomId) { mutableMapOf() }
members.forEach { map[it.id] = it } members.forEach { map[it.id] = it }
} }
} }