From a056cca6ccd7e420c13d8f93bf0dd4a4a2e8a345 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Tue, 30 Sep 2025 14:25:43 +0400 Subject: [PATCH] core: optimize member subscriptions query --- src/Simplex/Chat/Store/Connections.hs | 43 ++++++++++++++------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/Simplex/Chat/Store/Connections.hs b/src/Simplex/Chat/Store/Connections.hs index a270f95f1c..9e588ee874 100644 --- a/src/Simplex/Chat/Store/Connections.hs +++ b/src/Simplex/Chat/Store/Connections.hs @@ -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]