Files
mostlymatter/db/migrations/postgres/000051_create_msg_root_count.up.sql
Agniva De Sarker 91f7eb0957 Filter by templated schema name for postgres queries (#21635)
There were certain queries which did not filter
by the current schema, but hardcoded public schema.

Apart from that, we always filter with the current schema
which allows connection proxies to run multiple MM within
a single DB.
```release-note
NONE
```
2022-11-11 13:03:28 +05:30

70 строки
2.2 KiB
SQL

DO $$
<<migrate_root_mention_count>>
DECLARE
mention_count_root_exist boolean := false;
DECLARE
msg_count_root_exist boolean := false;
DECLARE
tmp_count_root integer := 0;
BEGIN
SELECT count(*) != 0 INTO msg_count_root_exist
FROM information_schema.columns
WHERE table_name = 'channels'
AND table_schema = current_schema()
AND column_name = 'totalmsgcountroot';
SELECT count(*) != 0 INTO mention_count_root_exist
FROM information_schema.columns
WHERE table_name = 'channelmembers'
AND table_schema = current_schema()
AND column_name = 'mentioncountroot';
IF mention_count_root_exist THEN
tmp_count_root := (SELECT count(*) FROM channelmembers WHERE msgcountroot IS NULL OR mentioncountroot IS NULL);
END IF;
ALTER TABLE channelmembers ADD COLUMN IF NOT EXISTS mentioncountroot bigint;
IF (tmp_count_root > 0) THEN
WITH q AS (
SELECT ChannelId, COALESCE(SUM(UnreadMentions), 0) AS UnreadMentions, UserId
FROM ThreadMemberships
LEFT JOIN Threads ON ThreadMemberships.PostId = Threads.PostId
GROUP BY Threads.ChannelId, ThreadMemberships.UserId
)
UPDATE channelmembers
SET MentionCountRoot = ChannelMembers.MentionCount - q.UnreadMentions
FROM q
WHERE
q.ChannelId = ChannelMembers.ChannelId AND
q.UserId = ChannelMembers.UserId AND
ChannelMembers.MentionCount > 0;
END IF;
ALTER TABLE channels ADD COLUMN IF NOT EXISTS totalmsgcountroot bigint;
ALTER TABLE channels ADD COLUMN IF NOT EXISTS lastrootat bigint;
ALTER TABLE channelmembers ADD COLUMN IF NOT EXISTS msgcountroot bigint;
IF NOT msg_count_root_exist THEN
WITH q AS (
SELECT Channels.Id channelid, COALESCE(COUNT(*),0) newcount, COALESCE(MAX(Posts.CreateAt), 0) as lastpost
FROM Channels
LEFT JOIN Posts ON Channels.Id = Posts.ChannelId
WHERE Posts.RootId = ''
GROUP BY Channels.Id
)
UPDATE Channels SET TotalMsgCountRoot = q.newcount, LastRootAt=q.lastpost
FROM q where q.channelid=Channels.Id;
END IF;
IF NOT mention_count_root_exist THEN
WITH q as (SELECT TotalMsgCountRoot, Id, LastRootAt from Channels)
UPDATE ChannelMembers CM SET MsgCountRoot=TotalMsgCountRoot
FROM q WHERE q.id=CM.ChannelId AND LastViewedAt >= q.lastrootat;
END IF;
ALTER TABLE channels DROP COLUMN IF EXISTS lastrootat;
END migrate_root_mention_count $$;