eBooru/db/fixes/105_modaction_to_postevents.rb
Earlopain fc7d84affd
[RuboCop] Enable Style/FrozenStringLiteralComment
This reduces allocations on the posts page by about 5%, from basic testing
2024-02-25 18:15:55 +01:00

87 lines
3.2 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'config', 'environment'))
class PostEventTemp < PostEvent
self.table_name = "post_events_temp"
end
ActiveRecord::Base.connection.execute('CREATE TABLE post_events_temp (
id bigserial NOT NULL,
creator_id int8 NOT NULL,
post_id int8 NOT NULL,
"action" int4 NOT NULL,
extra_data jsonb NOT NULL,
created_at timestamp NOT NULL,
CONSTRAINT post_events_temp_pkey PRIMARY KEY (id)
);')
ActiveRecord::Base.connection.execute('CREATE INDEX index_post_events_temp_on_created_at ON public.post_events_temp USING btree (created_at);')
def create(post_id, creator_id, created_at, action, extra_data = {})
PostEventTemp.create!(post_id: post_id, creator_id: creator_id, created_at: created_at, action: action, extra_data: extra_data)
end
PostApproval.find_in_batches do |batch|
batch.pluck(:user_id, :post_id, :created_at).each do |approval|
creator_id, post_id, created_at = approval
create(post_id, creator_id, created_at, :approved)
end
end
PostFlag.find_in_batches do |batch|
batch.pluck(:creator_id, :post_id, :created_at, :is_deletion, :reason).each do |flag|
creator_id, post_id, created_at, is_deletion, reason = flag
if is_deletion
create(post_id, creator_id, created_at, :deleted, { reason: reason })
else
create(post_id, creator_id, created_at, :flag_created, { reason: reason })
end
end
end
migrate_actions = %w[
post_move_favorites
post_undelete
post_destroy
post_rating_lock
post_unapprove
post_replacement_accept
post_replacement_reject
post_replacement_delete
]
ModAction.where(action: migrate_actions).in_batches do |batch|
batch.pluck(:creator_id, :action, :values, :created_at).each do |modaction|
creator_id, action, vals, created_at = modaction
case action
when "post_move_favorites"
child_id = vals["post_id"]
parent_id = vals["parent_id"]
create(child_id, creator_id, created_at, :favorites_moved, { parent_id: parent_id })
create(parent_id, creator_id, created_at, :favorites_received, { child_id: child_id })
when "post_undelete"
create(vals["post_id"], creator_id, created_at, :undeleted)
when "post_destroy"
create(vals["post_id"], creator_id, created_at, :expunged)
when "post_rating_lock"
action = vals['locked'] ? :rating_locked : :rating_unlocked
create(vals["post_id"], creator_id, created_at, action)
when "post_unapprove"
create(vals["post_id"], creator_id, created_at, :unapproved)
when "post_replacement_accept"
create(vals["post_id"], creator_id, created_at, :replacement_accepted)
when "post_replacement_reject"
create(vals["post_id"], creator_id, created_at, :replacement_rejected)
when "post_replacement_delete"
create(vals["post_id"], creator_id, created_at, :replacement_deleted)
end
end
end
PostEvent.without_timeout do
ActiveRecord::Base.connection.execute('INSERT INTO post_events (creator_id, post_id, "action", extra_data, created_at)
SELECT creator_id, post_id, "action", extra_data, created_at FROM post_events_temp ORDER BY created_at ASC;')
end
# ActiveRecord::Base.connection.execute('DROP TABLE post_events_temp;')