forked from MirrorHub/synapse
Name 'user_rooms_intersect' transaction
This commit is contained in:
parent
76ec154e95
commit
96707ed718
1 changed files with 18 additions and 16 deletions
|
@ -239,26 +239,28 @@ class RoomMemberStore(SQLBaseStore):
|
||||||
results = self._parse_events_txn(txn, rows)
|
results = self._parse_events_txn(txn, rows)
|
||||||
return results
|
return results
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
|
||||||
def user_rooms_intersect(self, user_id_list):
|
def user_rooms_intersect(self, user_id_list):
|
||||||
""" Checks whether all the users whose IDs are given in a list share a
|
""" Checks whether all the users whose IDs are given in a list share a
|
||||||
room.
|
room.
|
||||||
"""
|
"""
|
||||||
user_list_clause = " OR ".join(["m.user_id = ?"] * len(user_id_list))
|
def interaction(txn):
|
||||||
sql = (
|
user_list_clause = " OR ".join(["m.user_id = ?"] * len(user_id_list))
|
||||||
"SELECT m.room_id FROM room_memberships as m "
|
sql = (
|
||||||
"INNER JOIN current_state_events as c "
|
"SELECT m.room_id FROM room_memberships as m "
|
||||||
"ON m.event_id = c.event_id "
|
"INNER JOIN current_state_events as c "
|
||||||
"WHERE m.membership = 'join' "
|
"ON m.event_id = c.event_id "
|
||||||
"AND (%(clause)s) "
|
"WHERE m.membership = 'join' "
|
||||||
# TODO(paul): We've got duplicate rows in the database somewhere
|
"AND (%(clause)s) "
|
||||||
# so we have to DISTINCT m.user_id here
|
# TODO(paul): We've got duplicate rows in the database somewhere
|
||||||
"GROUP BY m.room_id HAVING COUNT(DISTINCT m.user_id) = ?"
|
# so we have to DISTINCT m.user_id here
|
||||||
) % {"clause": user_list_clause}
|
"GROUP BY m.room_id HAVING COUNT(DISTINCT m.user_id) = ?"
|
||||||
|
) % {"clause": user_list_clause}
|
||||||
|
|
||||||
args = list(user_id_list)
|
args = list(user_id_list)
|
||||||
args.append(len(user_id_list))
|
args.append(len(user_id_list))
|
||||||
|
|
||||||
rows = yield self._execute(None, sql, *args)
|
txn.execute(sql, args)
|
||||||
|
|
||||||
defer.returnValue(len(rows) > 0)
|
return len(txn.fetchall()) > 0
|
||||||
|
|
||||||
|
return self.runInteraction("user_rooms_intersect", interaction)
|
||||||
|
|
Loading…
Reference in a new issue