discourse/db/migrate/20130404232558_add_user_extras.rb
Sam Saffron 30990006a9 DEV: enable frozen string literal on all files
This reduces chances of errors where consumers of strings mutate inputs
and reduces memory usage of the app.

Test suite passes now, but there may be some stuff left, so we will run
a few sites on a branch prior to merging
2019-05-13 09:31:32 +08:00

72 lines
1.7 KiB
Ruby

# frozen_string_literal: true
class AddUserExtras < ActiveRecord::Migration[4.2]
def up
# NOTE: our user table is getting bloated, we probably want to split it for performance
# put lesser used columns into a user_extras table and frequently used ones here.
add_column :users, :likes_given, :integer, null: false, default: 0
add_column :users, :likes_received, :integer, null: false, default: 0
add_column :users, :topic_reply_count, :integer, null: false, default: 0
# NOTE: to keep migrations working through refactorings we avoid externalizing this stuff.
# even though a helper method may make sense
execute <<SQL
UPDATE users u
SET
likes_given = X.likes_given
FROM (
SELECT
a.user_id,
COUNT(*) likes_given
FROM user_actions a
JOIN posts p ON p.id = a.target_post_id
WHERE p.deleted_at IS NULL AND a.action_type = 1
GROUP BY a.user_id
) as X
WHERE X.user_id = u.id
SQL
execute <<SQL
UPDATE users u
SET
likes_received = Y.likes_received
FROM (
SELECT
a.user_id,
COUNT(*) likes_received
FROM user_actions a
JOIN posts p ON p.id = a.target_post_id
WHERE p.deleted_at IS NULL AND a.action_type = 2
GROUP BY a.user_id
) as Y
WHERE Y.user_id = u.id
SQL
execute <<SQL
UPDATE users u
SET
topic_reply_count = Z.topic_reply_count
FROM (
SELECT
p.user_id,
COUNT(DISTINCT topic_id) topic_reply_count
FROM posts p
JOIN topics t on t.id = p.topic_id
WHERE t.user_id <> p.user_id AND
p.deleted_at IS NULL AND t.deleted_at IS NULL
GROUP BY p.user_id
) Z
WHERE
Z.user_id = u.id
SQL
end
def down
remove_column :users, :likes_given
remove_column :users, :likes_received
remove_column :users, :topic_reply_count
end
end