2023-07-12 07:47:08 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2019-07-28 03:59:51 +00:00
|
|
|
class AddCaseInsensitiveIndexToTags < ActiveRecord::Migration[5.2]
|
|
|
|
disable_ddl_transaction!
|
|
|
|
|
|
|
|
def up
|
2021-03-19 01:45:34 +00:00
|
|
|
Tag.connection.select_all('SELECT string_agg(id::text, \',\') AS ids FROM tags GROUP BY lower(name) HAVING count(*) > 1').to_ary.each do |row|
|
2019-07-29 18:40:21 +00:00
|
|
|
canonical_tag_id = row['ids'].split(',').first
|
2023-07-12 08:03:06 +00:00
|
|
|
redundant_tag_ids = row['ids'].split(',')[1..]
|
2019-07-29 18:40:21 +00:00
|
|
|
|
|
|
|
safety_assured do
|
2024-02-06 16:42:25 +00:00
|
|
|
execute <<~SQL.squish
|
|
|
|
UPDATE accounts_tags
|
|
|
|
AS t0
|
|
|
|
SET tag_id = #{canonical_tag_id}
|
|
|
|
WHERE
|
|
|
|
tag_id IN (#{redundant_tag_ids.join(', ')})
|
|
|
|
AND NOT EXISTS (SELECT t1.tag_id FROM accounts_tags AS t1 WHERE t1.tag_id = #{canonical_tag_id} AND t1.account_id = t0.account_id)
|
|
|
|
SQL
|
|
|
|
|
|
|
|
execute <<~SQL.squish
|
|
|
|
UPDATE statuses_tags
|
|
|
|
AS t0
|
|
|
|
SET tag_id = #{canonical_tag_id}
|
|
|
|
WHERE
|
|
|
|
tag_id IN (#{redundant_tag_ids.join(', ')})
|
|
|
|
AND NOT EXISTS (SELECT t1.tag_id FROM statuses_tags AS t1 WHERE t1.tag_id = #{canonical_tag_id} AND t1.status_id = t0.status_id)
|
|
|
|
SQL
|
|
|
|
|
|
|
|
execute <<~SQL.squish
|
|
|
|
UPDATE featured_tags
|
|
|
|
AS t0
|
|
|
|
SET tag_id = #{canonical_tag_id}
|
|
|
|
WHERE
|
|
|
|
tag_id IN (#{redundant_tag_ids.join(', ')})
|
|
|
|
AND NOT EXISTS (SELECT t1.tag_id FROM featured_tags AS t1 WHERE t1.tag_id = #{canonical_tag_id} AND t1.account_id = t0.account_id)
|
|
|
|
SQL
|
2019-07-29 18:40:21 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
Tag.where(id: redundant_tag_ids).in_batches.delete_all
|
|
|
|
end
|
|
|
|
|
2021-06-02 17:15:17 +00:00
|
|
|
begin
|
|
|
|
safety_assured { execute 'CREATE UNIQUE INDEX CONCURRENTLY index_tags_on_name_lower ON tags (lower(name))' }
|
|
|
|
rescue ActiveRecord::StatementInvalid
|
|
|
|
remove_index :tags, name: 'index_tags_on_name_lower'
|
|
|
|
raise
|
|
|
|
end
|
|
|
|
|
2019-07-28 03:59:51 +00:00
|
|
|
remove_index :tags, name: 'index_tags_on_name'
|
|
|
|
remove_index :tags, name: 'hashtag_search_index'
|
|
|
|
end
|
|
|
|
|
|
|
|
def down
|
|
|
|
add_index :tags, :name, unique: true, algorithm: :concurrently
|
|
|
|
safety_assured { execute 'CREATE INDEX CONCURRENTLY hashtag_search_index ON tags (name text_pattern_ops)' }
|
|
|
|
remove_index :tags, name: 'index_tags_on_name_lower'
|
|
|
|
end
|
|
|
|
end
|