Files
mostlymatter/db/migrations/mysql/000051_create_msg_root_count.up.sql
Ibrahim Serdar Acikgoz 56c7da5817 [MM-40952] migrations: Add if statements for some queries (#19359)
* migrations: add if statements for some queries

* add better checks to upgrade posts v6 migration

* use "is null" instead of "= null"

* fix down script for users v6

* reflect review comments
2022-01-19 10:57:28 +03:00

127 строки
4.2 KiB
SQL

CREATE PROCEDURE MigrateRootMentionCount () BEGIN DECLARE MentionCountRoot_EXIST INT; DECLARE MsgCountRoot_EXIST INT;
SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Channels'
AND table_schema = DATABASE()
AND COLUMN_NAME = 'TotalMsgCountRoot' INTO MsgCountRoot_EXIST;
SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'ChannelMembers'
AND table_schema = DATABASE()
AND COLUMN_NAME = 'MsgCountRoot' INTO MentionCountRoot_EXIST;
SET @tmp_count_root := 0;
IF(MentionCountRoot_EXIST = 1) THEN
SELECT @tmp_count_root := COUNT(*)
FROM ChannelMembers
WHERE MsgCountRoot IS NULL
OR MentionCountRoot IS NULL;
END IF;
SET @preparedStatement =
(SELECT IF(
(SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'ChannelMembers'
AND table_schema = DATABASE()
AND COLUMN_NAME = 'MentionCountRoot') > 0, 'SELECT 1', 'ALTER TABLE ChannelMembers ADD COLUMN MentionCountRoot bigint(20);'));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
IF(@tmp_count_root > 0) THEN
UPDATE ChannelMembers
INNER JOIN
(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) AS q ON q.ChannelId = ChannelMembers.ChannelId
AND q.UserId = ChannelMembers.UserId
AND ChannelMembers.MentionCount > 0
SET MentionCountRoot = ChannelMembers.MentionCount - q.UnreadMentions;
END IF;
SET @preparedStatement =
(SELECT IF(
(SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Channels'
AND table_schema = DATABASE()
AND COLUMN_NAME = 'TotalMsgCountRoot') > 0, 'SELECT 1', 'ALTER TABLE Channels ADD COLUMN TotalMsgCountRoot bigint(20);'));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
SET @preparedStatement =
(SELECT IF(
(SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Channels'
AND table_schema = DATABASE()
AND COLUMN_NAME = 'LastRootAt') > 0, 'SELECT 1', 'ALTER TABLE Channels ADD COLUMN LastRootAt bigint(20);'));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
SET @preparedStatement =
(SELECT IF(
(SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'ChannelMembers'
AND table_schema = DATABASE()
AND COLUMN_NAME = 'MsgCountRoot') > 0, 'SELECT 1', 'ALTER TABLE ChannelMembers ADD COLUMN MsgCountRoot bigint(20);'));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;
IF(MsgCountRoot_EXIST = 0) THEN
UPDATE Channels
INNER JOIN
(SELECT Channels.Id channelid,
COALESCE(COUNT(*), 0) newcount,
COALESCE(MAX(Posts.CreateAt), 0) AS lastpost
FROM Channels
LEFT JOIN Posts
FORCE INDEX (idx_posts_channel_id_update_at) ON Channels.Id = Posts.ChannelId
WHERE Posts.RootId = ''
GROUP BY Channels.Id) AS q ON q.channelid = Channels.Id
SET TotalMsgCountRoot = q.newcount,
LastRootAt = q.lastpost;
END IF;
IF(MentionCountRoot_EXIST = 0) THEN
UPDATE ChannelMembers CM
INNER JOIN
(SELECT TotalMsgCountRoot,
Id,
LastRootAt
FROM Channels) AS q ON q.id = CM.ChannelId
AND LastViewedAt >= q.lastrootat
SET MsgCountRoot = TotalMsgCountRoot;
END IF;
SET @preparedStatement =
(SELECT IF(
(SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Channels'
AND table_schema = DATABASE()
AND COLUMN_NAME = 'LastRootAt' ) > 0, 'ALTER TABLE Channels DROP COLUMN LastRootAt;', 'SELECT 1'));
PREPARE alterIfExists
FROM @preparedStatement;
EXECUTE alterIfExists;
DEALLOCATE PREPARE alterIfExists;
END;
CALL MigrateRootMentionCount ();
DROP PROCEDURE IF EXISTS MigrateRootMentionCount;