directory: move all storage to the database, optimize performance (#6287)

* core: add custom indexed columns to groups and contacts

* directory: use database (TODO search/listing)

* triggers to maintain current member count

* update simplexmq, fix tests, use summary from GroupInfo

* fix all directory tests

* remove acceptance fields from group reg

* enable all tests

* clean up

* postgres migrations, fixes

* query plans

* use function in postgres triggers, improve sqlite query

* fix export/import

* update schema

* prevent admins from promoting groups when approving

* update listing every 5 minutes
This commit is contained in:
Evgeny authored and GitHub committed 2025-09-28 15:11:49 +01:00
1 parent 53d6d057c6
commit 015d5de364
40 files changed
+1897 -1054

No files matched your search

@@ -1,8 +1,7 @@
CREATE TABLE migrations(
name TEXT NOT NULL,
name TEXT NOT NULL PRIMARY KEY,
ts TEXT NOT NULL,
down TEXT,
PRIMARY KEY(name)
down TEXT
);
CREATE TABLE contact_profiles(
-- remote user profile
@@ -156,7 +155,8 @@ CREATE TABLE groups(
welcome_shared_msg_id BLOB,
request_shared_msg_id BLOB,
conn_link_prepared_connection INTEGER NOT NULL DEFAULT 0,
via_group_link_uri BLOB, -- received
via_group_link_uri BLOB,
summary_current_members_count INTEGER NOT NULL DEFAULT 0, -- received
FOREIGN KEY(user_id, local_display_name)
REFERENCES display_names(user_id, local_display_name)
ON DELETE CASCADE
@@ -724,6 +724,10 @@ CREATE TABLE delivery_jobs(
created_at TEXT NOT NULL DEFAULT(datetime('now')),
updated_at TEXT NOT NULL DEFAULT(datetime('now'))
);
CREATE TABLE group_member_status_predicates(
member_status TEXT NOT NULL PRIMARY KEY,
current_member INTEGER NOT NULL DEFAULT 0
);
CREATE INDEX contact_profiles_index ON contact_profiles(
display_name,
full_name
@@ -1184,3 +1188,38 @@ CREATE INDEX idx_delivery_jobs_next ON delivery_jobs(
job_status
);
CREATE INDEX idx_delivery_jobs_created_at ON delivery_jobs(created_at);
CREATE INDEX idx_groups_summary_current_members_count ON groups(
summary_current_members_count
);
CREATE TRIGGER on_group_members_insert_update_summary
AFTER INSERT ON group_members
FOR EACH ROW
WHEN EXISTS (SELECT 1 FROM group_member_status_predicates WHERE member_status = NEW.member_status AND current_member = 1)
BEGIN
UPDATE groups
SET summary_current_members_count = summary_current_members_count + 1
WHERE group_id = NEW.group_id;
END;
CREATE TRIGGER on_group_members_delete_update_summary
AFTER DELETE ON group_members
FOR EACH ROW
WHEN EXISTS (SELECT 1 FROM group_member_status_predicates WHERE member_status = OLD.member_status AND current_member = 1)
BEGIN
UPDATE groups
SET summary_current_members_count = summary_current_members_count - 1
WHERE group_id = OLD.group_id;
END;
CREATE TRIGGER on_group_members_update_update_summary
AFTER UPDATE ON group_members
FOR EACH ROW
WHEN EXISTS (SELECT 1 FROM group_member_status_predicates WHERE member_status = OLD.member_status AND current_member = 1)
!= EXISTS (SELECT 1 FROM group_member_status_predicates WHERE member_status = NEW.member_status AND current_member = 1)
BEGIN
UPDATE groups
SET summary_current_members_count = summary_current_members_count +
(
CASE WHEN EXISTS (SELECT 1 FROM group_member_status_predicates WHERE member_status = NEW.member_status AND current_member = 1)
THEN 1 ELSE -1 END
)
WHERE group_id = NEW.group_id;
END;