mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-04-26 19:35:48 +00:00
core: optimize member subscriptions query
This commit is contained in:
@@ -271,31 +271,34 @@ getUCLConnsToSub db User {userId} filterToSubscribe =
|
||||
cond = " AND c.conn_status != ?"
|
||||
|
||||
getMemberConnsToSub :: DB.Connection -> User -> Bool -> IO [ConnId]
|
||||
getMemberConnsToSub db User {userId, userContactId} filterToSubscribe =
|
||||
map fromOnly <$>
|
||||
DB.query
|
||||
db
|
||||
query
|
||||
((userId, ConnDeleted, userContactId)
|
||||
:. (GSMemRemoved, GSMemLeft, GSMemGroupDeleted, GSMemRemoved, GSMemLeft, GSMemGroupDeleted))
|
||||
getMemberConnsToSub db User {userId, userContactId} filterToSubscribe = do
|
||||
DB.execute
|
||||
db
|
||||
[sql|
|
||||
CREATE TABLE temp_user_groups AS
|
||||
SELECT g.group_id
|
||||
FROM groups g
|
||||
JOIN group_members mu ON mu.group_id = g.group_id
|
||||
WHERE g.user_id = ?
|
||||
AND mu.contact_id = ?
|
||||
AND mu.member_status NOT IN (?,?,?);
|
||||
|]
|
||||
(userId, userContactId, GSMemRemoved, GSMemLeft, GSMemGroupDeleted)
|
||||
connIds <- map fromOnly <$> DB.query db query (GSMemRemoved, GSMemLeft, GSMemGroupDeleted, ConnDeleted)
|
||||
DB.execute_ db "DROP TABLE temp_user_groups"
|
||||
pure connIds
|
||||
where
|
||||
query
|
||||
| filterToSubscribe = baseQuery <> " AND c.to_subscribe = 1 " <> cond
|
||||
| otherwise = baseQuery <> " " <> cond
|
||||
| filterToSubscribe = baseQuery <> " AND c.to_subscribe = 1"
|
||||
| otherwise = baseQuery
|
||||
baseQuery =
|
||||
[sql|
|
||||
SELECT c.agent_conn_id
|
||||
FROM connections c
|
||||
JOIN group_members m ON m.group_member_id = c.group_member_id
|
||||
JOIN groups g ON g.group_id = m.group_id
|
||||
JOIN group_members mu ON mu.group_id = g.group_id
|
||||
WHERE c.user_id = ?
|
||||
|]
|
||||
cond =
|
||||
[sql|
|
||||
AND c.conn_status != ?
|
||||
AND mu.contact_id = ? AND mu.member_status NOT IN (?,?,?)
|
||||
AND m.member_status NOT IN (?,?,?)
|
||||
FROM temp_user_groups ug
|
||||
JOIN group_members m ON m.group_id = ug.group_id
|
||||
JOIN connections c ON c.group_member_id = m.group_member_id
|
||||
WHERE m.member_status NOT IN (?,?,?)
|
||||
AND c.conn_status != ?
|
||||
|]
|
||||
|
||||
getPendingConnsToSub :: DB.Connection -> User -> Bool -> IO [ConnId]
|
||||
|
||||
Reference in New Issue
Block a user