Add rake task for reordering posts by creation_date
This commit is contained in:
parent
3287ac77e0
commit
cf9965fd54
|
@ -274,3 +274,94 @@ task 'posts:refresh_emails', [:topic_id] => [:environment] do |_, args|
|
||||||
|
|
||||||
puts "", "Done. #{updated} posts updated.", ""
|
puts "", "Done. #{updated} posts updated.", ""
|
||||||
end
|
end
|
||||||
|
|
||||||
|
desc 'Reorders all posts based on their creation_date'
|
||||||
|
task 'posts:reorder_posts' => :environment do
|
||||||
|
Post.transaction do
|
||||||
|
# update sort_order and flip post_number to prevent
|
||||||
|
# unique constraint violations when updating post_number
|
||||||
|
Post.exec_sql(<<~SQL)
|
||||||
|
WITH ordered_posts AS (
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
ROW_NUMBER()
|
||||||
|
OVER (
|
||||||
|
PARTITION BY topic_id
|
||||||
|
ORDER BY created_at, post_number ) AS new_post_number
|
||||||
|
FROM posts
|
||||||
|
)
|
||||||
|
UPDATE posts AS p
|
||||||
|
SET sort_order = o.new_post_number,
|
||||||
|
post_number = p.post_number * -1
|
||||||
|
FROM ordered_posts AS o
|
||||||
|
WHERE p.id = o.id AND
|
||||||
|
p.post_number <> o.new_post_number
|
||||||
|
SQL
|
||||||
|
|
||||||
|
Notification.exec_sql(<<~SQL)
|
||||||
|
UPDATE notifications AS x
|
||||||
|
SET post_number = p.sort_order
|
||||||
|
FROM posts AS p
|
||||||
|
WHERE x.topic_id = p.topic_id AND
|
||||||
|
x.post_number = ABS(p.post_number) AND
|
||||||
|
p.post_number < 0
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PostTiming.exec_sql(<<~SQL)
|
||||||
|
UPDATE post_timings AS x
|
||||||
|
SET post_number = x.post_number * -1
|
||||||
|
FROM posts AS p
|
||||||
|
WHERE x.topic_id = p.topic_id AND
|
||||||
|
x.post_number = ABS(p.post_number) AND
|
||||||
|
p.post_number < 0;
|
||||||
|
|
||||||
|
UPDATE post_timings AS t
|
||||||
|
SET post_number = p.sort_order
|
||||||
|
FROM posts AS p
|
||||||
|
WHERE t.topic_id = p.topic_id AND
|
||||||
|
t.post_number = p.post_number AND
|
||||||
|
p.post_number < 0;
|
||||||
|
SQL
|
||||||
|
|
||||||
|
Post.exec_sql(<<~SQL)
|
||||||
|
UPDATE posts AS x
|
||||||
|
SET reply_to_post_number = p.sort_order
|
||||||
|
FROM posts AS p
|
||||||
|
WHERE x.topic_id = p.topic_id AND
|
||||||
|
x.reply_to_post_number = ABS(p.post_number) AND
|
||||||
|
p.post_number < 0;
|
||||||
|
SQL
|
||||||
|
|
||||||
|
TopicUser.exec_sql(<<~SQL)
|
||||||
|
UPDATE topic_users AS x
|
||||||
|
SET last_read_post_number = p.sort_order
|
||||||
|
FROM posts AS p
|
||||||
|
WHERE x.topic_id = p.topic_id AND
|
||||||
|
x.last_read_post_number = ABS(p.post_number) AND
|
||||||
|
p.post_number < 0;
|
||||||
|
|
||||||
|
UPDATE topic_users AS x
|
||||||
|
SET highest_seen_post_number = p.sort_order
|
||||||
|
FROM posts AS p
|
||||||
|
WHERE x.topic_id = p.topic_id AND
|
||||||
|
x.highest_seen_post_number = ABS(p.post_number) AND
|
||||||
|
p.post_number < 0;
|
||||||
|
|
||||||
|
UPDATE topic_users AS x
|
||||||
|
SET last_emailed_post_number = p.sort_order
|
||||||
|
FROM posts AS p
|
||||||
|
WHERE x.topic_id = p.topic_id AND
|
||||||
|
x.last_emailed_post_number = ABS(p.post_number) AND
|
||||||
|
p.post_number < 0;
|
||||||
|
SQL
|
||||||
|
|
||||||
|
# finally update the post_number
|
||||||
|
Post.exec_sql(<<~SQL)
|
||||||
|
UPDATE posts
|
||||||
|
SET post_number = sort_order
|
||||||
|
WHERE post_number < 0
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
|
||||||
|
puts "", "Done.", ""
|
||||||
|
end
|
||||||
|
|
|
@ -15,6 +15,10 @@
|
||||||
#
|
#
|
||||||
# You need to call fix_quotes_in_csv() for CSV files that use \" to escape quotes within quoted fields.
|
# You need to call fix_quotes_in_csv() for CSV files that use \" to escape quotes within quoted fields.
|
||||||
# The import script expects quotes to be escaped with "".
|
# The import script expects quotes to be escaped with "".
|
||||||
|
#
|
||||||
|
# It's likely that some posts in replies.csv aren't in the correct order. Currently the import script doesn't handle
|
||||||
|
# that correctly and will import the replies in the wrong order.
|
||||||
|
# You should run `rake posts:reorder_posts` after the import.
|
||||||
|
|
||||||
require 'csv'
|
require 'csv'
|
||||||
require 'set'
|
require 'set'
|
||||||
|
|
Loading…
Reference in New Issue