FEATURE: add a rake task to recalculate user stats post_count and topic_count

This commit is contained in:
Neil Lalonde 2018-07-05 10:38:35 -04:00
parent 28dd7fb562
commit 92000bc8a0
2 changed files with 58 additions and 0 deletions

View File

@ -226,6 +226,9 @@ end
def update_user_stats
log "Updating user stats..."
# TODO: topic_count is counting all topics you replied in as if you started the topic.
# TODO: post_count is counting first posts.
# TODO: topic_reply_count is never used, and is counting PMs here.
DB.exec <<-SQL
WITH X AS (
SELECT p.user_id

View File

@ -80,6 +80,61 @@ task "users:update_posts", [:old_username, :current_username] => [:environment]
puts "", "Username updated!", ""
end
desc 'Recalculate post and topic counts in user stats'
task 'users:recalculate_post_counts' => :environment do
puts '', 'Updating user stats...'
filter_public_posts_and_topics = <<~SQL
p.deleted_at IS NULL
AND NOT COALESCE(p.hidden, 't')
AND p.post_type = 1
AND t.deleted_at IS NULL
AND COALESCE(t.visible, 't')
AND t.archetype <> 'private_message'
AND p.user_id > 0
SQL
puts 'post counts...'
# all public replies
DB.exec <<~SQL
WITH X AS (
SELECT p.user_id, COUNT(p.id) post_count
FROM posts p
JOIN topics t ON t.id = p.topic_id
WHERE #{filter_public_posts_and_topics}
AND p.post_number > 1
GROUP BY p.user_id
)
UPDATE user_stats
SET post_count = X.post_count
FROM X
WHERE user_stats.user_id = X.user_id
AND user_stats.post_count <> X.post_count
SQL
puts 'topic counts...'
# public topics
DB.exec <<~SQL
WITH X AS (
SELECT p.user_id, COUNT(p.id) topic_count
FROM posts p
JOIN topics t ON t.id = p.topic_id
WHERE #{filter_public_posts_and_topics}
AND p.post_number = 1
GROUP BY p.user_id
)
UPDATE user_stats
SET topic_count = X.topic_count
FROM X
WHERE user_stats.user_id = X.user_id
AND user_stats.topic_count <> X.topic_count
SQL
puts 'Done!', ''
end
def find_user(username)
user = User.find_by_username(username)