Add more optimized iterations for user memberships room_id's.

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2025-10-04 06:17:43 +00:00
parent ee777bc287
commit 443248965d
3 changed files with 47 additions and 8 deletions

View File

@@ -119,14 +119,14 @@ pub(crate) async fn sync_events_v5_route(
let all_invited_rooms = services
.state_cache
.rooms_invited_state(sender_user)
.map(|r| r.0)
.rooms_invited(sender_user)
.map(ToOwned::to_owned)
.collect::<Vec<OwnedRoomId>>();
let all_knocked_rooms = services
.state_cache
.rooms_knocked_state(sender_user)
.map(|r| r.0)
.rooms_knocked(sender_user)
.map(ToOwned::to_owned)
.collect::<Vec<OwnedRoomId>>();
let (all_joined_rooms, all_invited_rooms, all_knocked_rooms) =

View File

@@ -123,14 +123,14 @@ impl Service {
let rooms_invited = self
.services
.state_cache
.rooms_invited_state(user_id)
.map(|(r, _)| r);
.rooms_invited(user_id)
.map(ToOwned::to_owned);
let rooms_knocked = self
.services
.state_cache
.rooms_knocked_state(user_id)
.map(|(r, _)| r);
.rooms_knocked(user_id)
.map(ToOwned::to_owned);
let all_rooms: Vec<_> = rooms_joined
.chain(rooms_invited)

View File

@@ -396,6 +396,45 @@ pub fn rooms_joined<'a>(
.map(|(_, room_id): (Ignore, &RoomId)| room_id)
}
/// Returns an iterator over all rooms a user was invited to.
#[implement(Service)]
#[tracing::instrument(skip(self), level = "debug")]
pub fn rooms_invited<'a>(
&'a self,
user_id: &'a UserId,
) -> impl Stream<Item = &RoomId> + Send + 'a {
self.db
.userroomid_invitestate
.keys_raw_prefix(user_id)
.ignore_err()
.map(|(_, room_id): (Ignore, &RoomId)| room_id)
}
/// Returns an iterator over all rooms a user is currently knocking.
#[implement(Service)]
#[tracing::instrument(skip(self), level = "debug")]
pub fn rooms_knocked<'a>(
&'a self,
user_id: &'a UserId,
) -> impl Stream<Item = &RoomId> + Send + 'a {
self.db
.userroomid_knockedstate
.keys_raw_prefix(user_id)
.ignore_err()
.map(|(_, room_id): (Ignore, &RoomId)| room_id)
}
/// Returns an iterator over all rooms a user left.
#[implement(Service)]
#[tracing::instrument(skip(self), level = "debug")]
pub fn rooms_left<'a>(&'a self, user_id: &'a UserId) -> impl Stream<Item = &RoomId> + Send + 'a {
self.db
.userroomid_leftstate
.keys_raw_prefix(user_id)
.ignore_err()
.map(|(_, room_id): (Ignore, &RoomId)| room_id)
}
/// Returns an iterator over all rooms a user was invited to.
#[implement(Service)]
#[tracing::instrument(skip(self), level = "debug")]