diff --git a/simplex-chat.cabal b/simplex-chat.cabal index 16ab1fcb59..ef3eef916c 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -172,6 +172,7 @@ library Simplex.Chat.Store.Postgres.Migrations.M20261010_invite_member_via_group Simplex.Chat.Store.Postgres.Migrations.M20261012_delivery_job_notification Simplex.Chat.Store.Postgres.Migrations.M20261016_badge_store_receipts + Simplex.Chat.Store.Postgres.Migrations.M20261018_member_role_index else exposed-modules: Simplex.Chat.Archive @@ -353,6 +354,7 @@ library Simplex.Chat.Store.SQLite.Migrations.M20261010_invite_member_via_group Simplex.Chat.Store.SQLite.Migrations.M20261012_delivery_job_notification Simplex.Chat.Store.SQLite.Migrations.M20261016_badge_store_receipts + Simplex.Chat.Store.SQLite.Migrations.M20261018_member_role_index other-modules: Paths_simplex_chat hs-source-dirs: diff --git a/src/Simplex/Chat/Store/Postgres/Migrations.hs b/src/Simplex/Chat/Store/Postgres/Migrations.hs index ce096b81e0..7af5795dcb 100644 --- a/src/Simplex/Chat/Store/Postgres/Migrations.hs +++ b/src/Simplex/Chat/Store/Postgres/Migrations.hs @@ -57,6 +57,7 @@ import Simplex.Chat.Store.Postgres.Migrations.M20260925_badge_bindings import Simplex.Chat.Store.Postgres.Migrations.M20261010_invite_member_via_group import Simplex.Chat.Store.Postgres.Migrations.M20261012_delivery_job_notification import Simplex.Chat.Store.Postgres.Migrations.M20261016_badge_store_receipts +import Simplex.Chat.Store.Postgres.Migrations.M20261018_member_role_index import Simplex.Messaging.Agent.Store.Shared (Migration (..)) schemaMigrations :: [(String, Text, Maybe Text)] @@ -113,7 +114,8 @@ schemaMigrations = ("20260925_badge_bindings", m20260925_badge_bindings, Just down_m20260925_badge_bindings), ("20261010_invite_member_via_group", m20261010_invite_member_via_group, Just down_m20261010_invite_member_via_group), ("20261012_delivery_job_notification", m20261012_delivery_job_notification, Just down_m20261012_delivery_job_notification), - ("20261016_badge_store_receipts", m20261016_badge_store_receipts, Just down_m20261016_badge_store_receipts) + ("20261016_badge_store_receipts", m20261016_badge_store_receipts, Just down_m20261016_badge_store_receipts), + ("20261018_member_role_index", m20261018_member_role_index, Just down_m20261018_member_role_index) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Chat/Store/Postgres/Migrations/M20261018_member_role_index.hs b/src/Simplex/Chat/Store/Postgres/Migrations/M20261018_member_role_index.hs new file mode 100644 index 0000000000..4086803555 --- /dev/null +++ b/src/Simplex/Chat/Store/Postgres/Migrations/M20261018_member_role_index.hs @@ -0,0 +1,19 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Store.Postgres.Migrations.M20261018_member_role_index where + +import Data.Text (Text) +import Text.RawString.QQ (r) + +m20261018_member_role_index :: Text +m20261018_member_role_index = + [r| +CREATE INDEX idx_group_members_user_id_member_role ON group_members(user_id, member_role, group_id); +|] + +down_m20261018_member_role_index :: Text +down_m20261018_member_role_index = + [r| +DROP INDEX idx_group_members_user_id_member_role; +|] diff --git a/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql b/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql index d062fc41e2..3a0b3d7bb8 100644 --- a/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql @@ -2781,6 +2781,10 @@ CREATE INDEX idx_group_members_user_id_local_display_name ON test_chat_schema.gr +CREATE INDEX idx_group_members_user_id_member_role ON test_chat_schema.group_members USING btree (user_id, member_role, group_id); + + + CREATE INDEX idx_group_profiles_user_id ON test_chat_schema.group_profiles USING btree (user_id); diff --git a/src/Simplex/Chat/Store/SQLite/Migrations.hs b/src/Simplex/Chat/Store/SQLite/Migrations.hs index 535e5d3864..234826eb8c 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations.hs +++ b/src/Simplex/Chat/Store/SQLite/Migrations.hs @@ -180,6 +180,7 @@ import Simplex.Chat.Store.SQLite.Migrations.M20260925_badge_bindings import Simplex.Chat.Store.SQLite.Migrations.M20261010_invite_member_via_group import Simplex.Chat.Store.SQLite.Migrations.M20261012_delivery_job_notification import Simplex.Chat.Store.SQLite.Migrations.M20261016_badge_store_receipts +import Simplex.Chat.Store.SQLite.Migrations.M20261018_member_role_index import Simplex.Messaging.Agent.Store.Shared (Migration (..)) schemaMigrations :: [(String, Query, Maybe Query)] @@ -359,7 +360,8 @@ schemaMigrations = ("20260925_badge_bindings", m20260925_badge_bindings, Just down_m20260925_badge_bindings), ("20261010_invite_member_via_group", m20261010_invite_member_via_group, Just down_m20261010_invite_member_via_group), ("20261012_delivery_job_notification", m20261012_delivery_job_notification, Just down_m20261012_delivery_job_notification), - ("20261016_badge_store_receipts", m20261016_badge_store_receipts, Just down_m20261016_badge_store_receipts) + ("20261016_badge_store_receipts", m20261016_badge_store_receipts, Just down_m20261016_badge_store_receipts), + ("20261018_member_role_index", m20261018_member_role_index, Just down_m20261018_member_role_index) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/M20261018_member_role_index.hs b/src/Simplex/Chat/Store/SQLite/Migrations/M20261018_member_role_index.hs new file mode 100644 index 0000000000..1109827cac --- /dev/null +++ b/src/Simplex/Chat/Store/SQLite/Migrations/M20261018_member_role_index.hs @@ -0,0 +1,18 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Store.SQLite.Migrations.M20261018_member_role_index where + +import Database.SQLite.Simple (Query) +import Database.SQLite.Simple.QQ (sql) + +m20261018_member_role_index :: Query +m20261018_member_role_index = + [sql| +CREATE INDEX idx_group_members_user_id_member_role ON group_members(user_id, member_role, group_id); +|] + +down_m20261018_member_role_index :: Query +down_m20261018_member_role_index = + [sql| +DROP INDEX idx_group_members_user_id_member_role; +|] diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt index fefef85c38..cb0228db79 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt @@ -6242,7 +6242,7 @@ Query: LEFT JOIN group_member_badge_proofs bp ON bp.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_user_id_member_role (user_id=? AND member_role=? AND group_id=?) SEARCH p USING INTEGER PRIMARY KEY (rowid=?) SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN SEARCH bp USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN @@ -6265,7 +6265,7 @@ Query: LEFT JOIN group_member_badge_proofs bp ON bp.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_user_id_member_role (user_id=? AND member_role=? AND group_id=?) SEARCH p USING INTEGER PRIMARY KEY (rowid=?) SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN SEARCH bp USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN @@ -6288,7 +6288,7 @@ Query: LEFT JOIN group_member_badge_proofs bp ON bp.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_user_id_member_role (user_id=? AND member_role=? AND group_id=?) SEARCH p USING INTEGER PRIMARY KEY (rowid=?) SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN SEARCH bp USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN @@ -6311,7 +6311,7 @@ Query: LEFT JOIN group_member_badge_proofs bp ON bp.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_user_id_member_role (user_id=? AND member_role=? AND group_id=?) SEARCH p USING INTEGER PRIMARY KEY (rowid=?) SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN SEARCH bp USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql b/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql index d3b3a095d4..eed3a05e6a 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql @@ -1584,6 +1584,11 @@ CREATE INDEX idx_badge_store_receipts_user ON badge_store_receipts(user_id); CREATE UNIQUE INDEX idx_badge_purchases_store_receipt ON badge_purchases( badge_store_receipt_id ); +CREATE INDEX idx_group_members_user_id_member_role ON group_members( + user_id, + member_role, + group_id +); CREATE TRIGGER on_group_members_insert_update_summary AFTER INSERT ON group_members FOR EACH ROW