Use the current_state_events.membership column

This commit is contained in:
Erik Johnston 2019-07-17 16:17:17 +01:00
parent 059d8c1a4e
commit 8e1ada9e6f

View File

@ -115,14 +115,23 @@ class RoomMemberWorkerStore(EventsWorkerStore):
@cached(max_entries=100000, iterable=True) @cached(max_entries=100000, iterable=True)
def get_users_in_room(self, room_id): def get_users_in_room(self, room_id):
def f(txn): def f(txn):
sql = ( # If we can assume current_state_events.membership is up to date
"SELECT m.user_id FROM room_memberships as m" # then we can avoid a join, which is a Very Good Thing given how
" INNER JOIN current_state_events as c" # frequently this function gets called.
" ON m.event_id = c.event_id " if self._current_state_events_membership_up_to_date:
" AND m.room_id = c.room_id " sql = """
" AND m.user_id = c.state_key" SELECT state_key FROM current_state_events
" WHERE c.type = 'm.room.member' AND c.room_id = ? AND m.membership = ?" WHERE type = 'm.room.member' AND room_id = ? AND membership = ?
) """
else:
sql = """
SELECT state_key FROM room_memberships as m
INNER JOIN current_state_events as c
ON m.event_id = c.event_id
AND m.room_id = c.room_id
AND m.user_id = c.state_key
WHERE c.type = 'm.room.member' AND c.room_id = ? AND m.membership = ?
"""
txn.execute(sql, (room_id, Membership.JOIN)) txn.execute(sql, (room_id, Membership.JOIN))
return [to_ascii(r[0]) for r in txn] return [to_ascii(r[0]) for r in txn]
@ -144,15 +153,26 @@ class RoomMemberWorkerStore(EventsWorkerStore):
# first get counts. # first get counts.
# We do this all in one transaction to keep the cache small. # We do this all in one transaction to keep the cache small.
# FIXME: get rid of this when we have room_stats # FIXME: get rid of this when we have room_stats
sql = """
SELECT count(*), m.membership FROM room_memberships as m # If we can assume current_state_events.membership is up to date
INNER JOIN current_state_events as c # then we can avoid a join, which is a Very Good Thing given how
ON m.event_id = c.event_id # frequently this function gets called.
AND m.room_id = c.room_id if self._current_state_events_membership_up_to_date:
AND m.user_id = c.state_key sql = """
WHERE c.type = 'm.room.member' AND c.room_id = ? SELECT count(*), membership FROM current_state_events
GROUP BY m.membership WHERE type = 'm.room.member' AND room_id = ?
""" GROUP BY membership
"""
else:
sql = """
SELECT count(*), m.membership FROM room_memberships as m
INNER JOIN current_state_events as c
ON m.event_id = c.event_id
AND m.room_id = c.room_id
AND m.user_id = c.state_key
WHERE c.type = 'm.room.member' AND c.room_id = ?
GROUP BY m.membership
"""
txn.execute(sql, (room_id,)) txn.execute(sql, (room_id,))
res = {} res = {}