lemmy/migrations/2025-08-01-000057_multi-community/up.sql
Dessalines 644a448aa9
[main] Fixing active counts slow queries. (#5907) (#5917)
* [0.19] Fixing active counts slow queries. (#5907)

* Fixing active counts slow queries.

* Simplify back to str tuple

* Batch site and community updates

* Using update from temp table

* Making aggs temp table use interval name.

* Make dev setup use optimized postgres.

* Addressing PR comments.

* Use ref

* Removing system custom info from customPostgresql.conf

* Forgot to remove old scheduled tasks.

* Making sure migrations aren't missing anything from release/v0.19

Checked using git diff --diff-filter D --stat release/v0.19 migrations

* Rename all migrations to come after release/v0.19 migrations

* Add liked_at is not null check.
2025-08-09 21:57:38 +02:00

98 lines
3.3 KiB
SQL

CREATE TABLE multi_community (
id serial PRIMARY KEY,
creator_id int NOT NULL REFERENCES person ON UPDATE CASCADE ON DELETE CASCADE,
instance_id int NOT NULL REFERENCES instance ON UPDATE CASCADE ON DELETE CASCADE,
name varchar(255) NOT NULL,
title varchar(255),
description varchar(255),
local bool NOT NULL DEFAULT TRUE,
deleted bool NOT NULL DEFAULT FALSE,
ap_id text UNIQUE NOT NULL DEFAULT generate_unique_changeme (),
public_key text NOT NULL,
private_key text,
inbox_url text NOT NULL DEFAULT generate_unique_changeme (),
last_refreshed_at timestamptz NOT NULL DEFAULT now(),
following_url text NOT NULL DEFAULT generate_unique_changeme (),
published_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz
);
CREATE TABLE multi_community_entry (
multi_community_id int NOT NULL REFERENCES multi_community ON UPDATE CASCADE ON DELETE CASCADE,
community_id int NOT NULL REFERENCES community ON UPDATE CASCADE ON DELETE CASCADE,
PRIMARY KEY (multi_community_id, community_id)
);
CREATE TABLE multi_community_follow (
multi_community_id int NOT NULL REFERENCES multi_community ON UPDATE CASCADE ON DELETE CASCADE,
person_id int NOT NULL REFERENCES person ON UPDATE CASCADE ON DELETE CASCADE,
follow_state community_follower_state NOT NULL,
PRIMARY KEY (person_id, multi_community_id)
);
ALTER TABLE local_site
ADD COLUMN suggested_communities int REFERENCES multi_community ON UPDATE CASCADE ON DELETE CASCADE,
ADD COLUMN multi_comm_follower int REFERENCES person ON UPDATE CASCADE ON DELETE CASCADE;
-- generate new account with randomized name (max 20 chars) and set it
-- as local_site.multi_comm_follower
WITH x AS (
INSERT INTO person (name, public_key, private_key, instance_id, inbox_url, bot_account)
SELECT
'multicomm' || substr(gen_random_uuid ()::text, 0, 11),
public_key,
private_key,
instance_id,
inbox_url,
TRUE
FROM
site,
local_site
WHERE
site.id = local_site.id
RETURNING
person.id)
UPDATE
local_site
SET
multi_comm_follower = x.id
FROM
x;
ALTER TABLE local_site
ALTER COLUMN multi_comm_follower SET NOT NULL;
-- set ap_id for multicomm follower account (should use r.local_url but thats not defined here)
UPDATE
person
SET
ap_id = current_setting('lemmy.protocol_and_hostname') || '/u/' || person.name
FROM
local_site
WHERE
person.id = local_site.multi_comm_follower;
ALTER TYPE listing_type_enum
ADD VALUE 'Suggested';
CREATE INDEX idx_multi_community_read_from_name ON multi_community (local)
WHERE
local AND NOT deleted;
CREATE INDEX idx_multi_community_ap_id ON multi_community (ap_id);
CREATE INDEX idx_multi_creator_id ON multi_community (creator_id);
CREATE INDEX idx_multi_community_follow_multi_id ON multi_community_follow (multi_community_id);
CREATE INDEX idx_multi_community_entry_community_id ON multi_community_entry (community_id);
ALTER TABLE search_combined
ADD COLUMN multi_community_id int REFERENCES multi_community (id) ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE search_combined
DROP CONSTRAINT search_combined_check;
ALTER TABLE search_combined
ADD CONSTRAINT search_combined_check CHECK (num_nonnulls (post_id, comment_id, community_id, person_id, multi_community_id) = 1);