core: index group members by role for moderator lookup

This commit is contained in:
Narasimha-sc
2026-09-26 19:36:11 +00:00
parent 7bed5ea95f
commit 1aaa480d90
8 changed files with 67 additions and 16 deletions
+2
View File
@@ -168,6 +168,7 @@ library
Simplex.Chat.Store.Postgres.Migrations.M20260915_user_badges
Simplex.Chat.Store.Postgres.Migrations.M20260918_badge_issue_errors
Simplex.Chat.Store.Postgres.Migrations.M20260923_preferences_json
Simplex.Chat.Store.Postgres.Migrations.M20260926_member_role_index
else
exposed-modules:
Simplex.Chat.Archive
@@ -345,6 +346,7 @@ library
Simplex.Chat.Store.SQLite.Migrations.M20260915_user_badges
Simplex.Chat.Store.SQLite.Migrations.M20260918_badge_issue_errors
Simplex.Chat.Store.SQLite.Migrations.M20260923_preferences_json
Simplex.Chat.Store.SQLite.Migrations.M20260926_member_role_index
other-modules:
Paths_simplex_chat
hs-source-dirs:
@@ -53,6 +53,7 @@ import Simplex.Chat.Store.Postgres.Migrations.M20260904_file_badges
import Simplex.Chat.Store.Postgres.Migrations.M20260915_user_badges
import Simplex.Chat.Store.Postgres.Migrations.M20260918_badge_issue_errors
import Simplex.Chat.Store.Postgres.Migrations.M20260923_preferences_json
import Simplex.Chat.Store.Postgres.Migrations.M20260926_member_role_index
import Simplex.Messaging.Agent.Store.Shared (Migration (..))
schemaMigrations :: [(String, Text, Maybe Text)]
@@ -105,7 +106,8 @@ schemaMigrations =
("20260904_file_badges", m20260904_file_badges, Just down_m20260904_file_badges),
("20260915_user_badges", m20260915_user_badges, Just down_m20260915_user_badges),
("20260918_badge_issue_errors", m20260918_badge_issue_errors, Just down_m20260918_badge_issue_errors),
("20260923_preferences_json", m20260923_preferences_json, Just down_m20260923_preferences_json)
("20260923_preferences_json", m20260923_preferences_json, Just down_m20260923_preferences_json),
("20260926_member_role_index", m20260926_member_role_index, Just down_m20260926_member_role_index)
]
-- | The list of migrations in ascending order by date
@@ -0,0 +1,21 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
module Simplex.Chat.Store.Postgres.Migrations.M20260926_member_role_index where
import Data.Text (Text)
import Text.RawString.QQ (r)
m20260926_member_role_index :: Text
m20260926_member_role_index =
[r|
CREATE INDEX idx_group_members_group_id_member_role ON group_members(user_id, group_id, member_role);
DROP INDEX idx_group_members_group_id;
|]
down_m20260926_member_role_index :: Text
down_m20260926_member_role_index =
[r|
CREATE INDEX idx_group_members_group_id ON group_members(user_id, group_id);
DROP INDEX idx_group_members_group_id_member_role;
|]
@@ -2672,14 +2672,14 @@ CREATE INDEX idx_group_members_contact_profile_id ON test_chat_schema.group_memb
CREATE INDEX idx_group_members_group_id ON test_chat_schema.group_members USING btree (user_id, group_id);
CREATE UNIQUE INDEX idx_group_members_group_id_index_in_group ON test_chat_schema.group_members USING btree (group_id, index_in_group);
CREATE INDEX idx_group_members_group_id_member_role ON test_chat_schema.group_members USING btree (user_id, group_id, member_role);
CREATE INDEX idx_group_members_invited_by ON test_chat_schema.group_members USING btree (invited_by);
+3 -1
View File
@@ -176,6 +176,7 @@ import Simplex.Chat.Store.SQLite.Migrations.M20260904_file_badges
import Simplex.Chat.Store.SQLite.Migrations.M20260915_user_badges
import Simplex.Chat.Store.SQLite.Migrations.M20260918_badge_issue_errors
import Simplex.Chat.Store.SQLite.Migrations.M20260923_preferences_json
import Simplex.Chat.Store.SQLite.Migrations.M20260926_member_role_index
import Simplex.Messaging.Agent.Store.Shared (Migration (..))
schemaMigrations :: [(String, Query, Maybe Query)]
@@ -351,7 +352,8 @@ schemaMigrations =
("20260904_file_badges", m20260904_file_badges, Just down_m20260904_file_badges),
("20260915_user_badges", m20260915_user_badges, Just down_m20260915_user_badges),
("20260918_badge_issue_errors", m20260918_badge_issue_errors, Just down_m20260918_badge_issue_errors),
("20260923_preferences_json", m20260923_preferences_json, Just down_m20260923_preferences_json)
("20260923_preferences_json", m20260923_preferences_json, Just down_m20260923_preferences_json),
("20260926_member_role_index", m20260926_member_role_index, Just down_m20260926_member_role_index)
]
-- | The list of migrations in ascending order by date
@@ -0,0 +1,20 @@
{-# LANGUAGE QuasiQuotes #-}
module Simplex.Chat.Store.SQLite.Migrations.M20260926_member_role_index where
import Database.SQLite.Simple (Query)
import Database.SQLite.Simple.QQ (sql)
m20260926_member_role_index :: Query
m20260926_member_role_index =
[sql|
CREATE INDEX idx_group_members_group_id_member_role ON group_members(user_id, group_id, member_role);
DROP INDEX idx_group_members_group_id;
|]
down_m20260926_member_role_index :: Query
down_m20260926_member_role_index =
[sql|
CREATE INDEX idx_group_members_group_id ON group_members(user_id, group_id);
DROP INDEX idx_group_members_group_id_member_role;
|]
@@ -5891,7 +5891,7 @@ Query:
)
Plan:
SEARCH m USING INDEX idx_group_members_group_id (user_id=? AND group_id=?)
SEARCH m USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=?)
LIST SUBQUERY 1
SCAN chat_items USING COVERING INDEX idx_chat_items_group_member_id
SEARCH p USING INTEGER PRIMARY KEY (rowid=?)
@@ -6074,7 +6074,7 @@ Query:
LEFT JOIN connections c ON c.group_member_id = m.group_member_id
WHERE m.user_id = ? AND m.group_id = ? AND (m.contact_id IS NULL OR m.contact_id != ?)
Plan:
SEARCH m USING INDEX idx_group_members_group_id (user_id=? AND group_id=?)
SEARCH m USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=?)
SEARCH p USING INTEGER PRIMARY KEY (rowid=?)
SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN
@@ -6094,7 +6094,7 @@ Query:
LEFT JOIN connections c ON c.group_member_id = m.group_member_id
WHERE m.user_id = ? AND m.group_id = ? AND (m.contact_id IS NULL OR m.contact_id != ?) AND m.member_role = ?
Plan:
SEARCH m USING INDEX idx_group_members_group_id (user_id=? AND group_id=?)
SEARCH m USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=? AND member_role=?)
SEARCH p USING INTEGER PRIMARY KEY (rowid=?)
SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN
@@ -6114,7 +6114,7 @@ Query:
LEFT JOIN connections c ON c.group_member_id = m.group_member_id
WHERE m.user_id = ? AND m.group_id = ? AND (m.contact_id IS NULL OR m.contact_id != ?) AND m.member_role IN (?,?)
Plan:
SEARCH m USING INDEX idx_group_members_group_id (user_id=? AND group_id=?)
SEARCH m USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=? AND member_role=?)
SEARCH p USING INTEGER PRIMARY KEY (rowid=?)
SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN
@@ -6134,7 +6134,7 @@ Query:
LEFT JOIN connections c ON c.group_member_id = m.group_member_id
WHERE m.user_id = ? AND m.group_id = ? AND (m.contact_id IS NULL OR m.contact_id != ?) AND m.member_role IN (?,?,?)
Plan:
SEARCH m USING INDEX idx_group_members_group_id (user_id=? AND group_id=?)
SEARCH m USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=? AND member_role=?)
SEARCH p USING INTEGER PRIMARY KEY (rowid=?)
SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN
@@ -6154,7 +6154,7 @@ Query:
LEFT JOIN connections c ON c.group_member_id = m.group_member_id
WHERE m.user_id = ? AND m.group_id = ? AND m.contact_id IS DISTINCT FROM ? AND m.member_role = ?
Plan:
SEARCH m USING INDEX idx_group_members_group_id (user_id=? AND group_id=?)
SEARCH m USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=? AND member_role=?)
SEARCH p USING INTEGER PRIMARY KEY (rowid=?)
SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN
@@ -6923,7 +6923,7 @@ SEARCH contacts USING COVERING INDEX idx_contacts_contact_group_member_id (conta
Query: DELETE FROM group_members WHERE user_id = ? AND group_id = ?
Plan:
SEARCH group_members USING COVERING INDEX idx_group_members_group_id (user_id=? AND group_id=?)
SEARCH group_members USING COVERING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=?)
SEARCH rcv_roster_transfers USING COVERING INDEX idx_rcv_roster_transfers_from_member_id (from_member_id=?)
SEARCH group_relays USING COVERING INDEX idx_group_relays_group_member_id (group_member_id=?)
SEARCH delivery_jobs USING COVERING INDEX idx_delivery_jobs_job_scope_support_gm_id (job_scope_support_gm_id=?)
@@ -7574,11 +7574,11 @@ SEARCH group_members USING INDEX idx_group_members_user_id (user_id=?)
Query: SELECT group_member_id FROM group_members WHERE user_id = ? AND group_id = ? AND local_display_name = ?
Plan:
SEARCH group_members USING INDEX idx_group_members_group_id (user_id=? AND group_id=?)
SEARCH group_members USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=?)
Query: SELECT group_member_id FROM group_members WHERE user_id = ? AND group_id = ? AND member_category = ?
Plan:
SEARCH group_members USING INDEX idx_group_members_group_id (user_id=? AND group_id=?)
SEARCH group_members USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=?)
Query: SELECT group_member_id, member_category FROM group_members WHERE user_id = ? AND group_id = ? AND member_id = ?
Plan:
@@ -1117,7 +1117,6 @@ CREATE INDEX idx_chat_items_timed_delete_at ON chat_items(
user_id,
timed_delete_at
);
CREATE INDEX idx_group_members_group_id ON group_members(user_id, group_id);
CREATE INDEX idx_chat_item_moderations_group_id ON chat_item_moderations(
group_id
);
@@ -1576,3 +1575,8 @@ BEGIN
)
WHERE group_id = NEW.group_id;
END;
CREATE INDEX idx_group_members_group_id_member_role ON group_members(
user_id,
group_id,
member_role
);