mirror of
https://github.com/discourse/discourse.git
synced 2025-05-21 18:12:32 +08:00
DEV: speed up posts base imports
This commit is contained in:
@ -54,6 +54,8 @@ class ImportScripts::Base
|
||||
update_last_posted_at
|
||||
update_last_seen_at
|
||||
update_user_stats
|
||||
update_topic_users
|
||||
update_post_timings
|
||||
update_feature_topic_users
|
||||
update_category_featured_topics
|
||||
update_topic_count_replies
|
||||
@ -313,7 +315,7 @@ class ImportScripts::Base
|
||||
|
||||
unless opts[:email][EmailValidator.email_regex]
|
||||
opts[:email] = fake_email
|
||||
puts "Invalid email #{original_email} for #{opts[:username]}. Using: #{opts[:email]}"
|
||||
puts "Invalid email '#{original_email}' for '#{opts[:username]}'. Using '#{opts[:email]}'"
|
||||
end
|
||||
|
||||
opts[:name] = original_username if original_name.blank? && opts[:username] != original_username
|
||||
@ -326,7 +328,7 @@ class ImportScripts::Base
|
||||
u = User.new(opts)
|
||||
(opts[:custom_fields] || {}).each { |k, v| u.custom_fields[k] = v }
|
||||
u.custom_fields["import_id"] = import_id
|
||||
u.custom_fields["import_username"] = opts[:username] if original_username.present?
|
||||
u.custom_fields["import_username"] = original_username if original_username.present? && original_username != opts[:username]
|
||||
u.custom_fields["import_avatar_url"] = avatar_url if avatar_url.present?
|
||||
u.custom_fields["import_pass"] = opts[:password] if opts[:password].present?
|
||||
u.custom_fields["import_email"] = original_email if original_email != opts[:email]
|
||||
@ -506,21 +508,19 @@ class ImportScripts::Base
|
||||
import_id = params.delete(:id).to_s
|
||||
|
||||
if post_id_from_imported_post_id(import_id)
|
||||
skipped += 1 # already imported this post
|
||||
skipped += 1
|
||||
else
|
||||
begin
|
||||
new_post = create_post(params, import_id)
|
||||
if new_post.is_a?(Post)
|
||||
add_post(import_id, new_post)
|
||||
add_topic(new_post)
|
||||
|
||||
created_post(new_post)
|
||||
|
||||
created += 1
|
||||
else
|
||||
skipped += 1
|
||||
puts "Error creating post #{import_id}. Skipping."
|
||||
puts new_post.inspect
|
||||
p new_post
|
||||
end
|
||||
rescue Discourse::InvalidAccess => e
|
||||
skipped += 1
|
||||
@ -632,7 +632,7 @@ class ImportScripts::Base
|
||||
def update_topic_status
|
||||
puts "", "Updating topic status"
|
||||
|
||||
DB.exec(<<~SQL)
|
||||
DB.exec <<~SQL
|
||||
UPDATE topics AS t
|
||||
SET closed = TRUE
|
||||
WHERE EXISTS(
|
||||
@ -642,7 +642,7 @@ class ImportScripts::Base
|
||||
)
|
||||
SQL
|
||||
|
||||
DB.exec(<<~SQL)
|
||||
DB.exec <<~SQL
|
||||
UPDATE topics AS t
|
||||
SET archived = TRUE
|
||||
WHERE EXISTS(
|
||||
@ -652,7 +652,7 @@ class ImportScripts::Base
|
||||
)
|
||||
SQL
|
||||
|
||||
DB.exec(<<~SQL)
|
||||
DB.exec <<~SQL
|
||||
DELETE FROM topic_custom_fields
|
||||
WHERE name IN ('import_closed', 'import_archived')
|
||||
SQL
|
||||
@ -660,13 +660,16 @@ class ImportScripts::Base
|
||||
|
||||
def update_bumped_at
|
||||
puts "", "Updating bumped_at on topics"
|
||||
DB.exec("update topics t set bumped_at = COALESCE((select max(created_at) from posts where topic_id = t.id and post_type = #{Post.types[:regular]}), bumped_at)")
|
||||
DB.exec <<~SQL
|
||||
UPDATE topics t
|
||||
SET bumped_at = COALESCE((SELECT MAX(created_at) FROM posts WHERE topic_id = t.id AND post_type = #{Post.types[:regular]}), bumped_at)
|
||||
SQL
|
||||
end
|
||||
|
||||
def update_last_posted_at
|
||||
puts "", "Updating last posted at on users"
|
||||
|
||||
sql = <<-SQL
|
||||
DB.exec <<~SQL
|
||||
WITH lpa AS (
|
||||
SELECT user_id, MAX(posts.created_at) AS last_posted_at
|
||||
FROM posts
|
||||
@ -679,8 +682,6 @@ class ImportScripts::Base
|
||||
WHERE u1.id = users.id
|
||||
AND users.last_posted_at <> lpa.last_posted_at
|
||||
SQL
|
||||
|
||||
DB.exec(sql)
|
||||
end
|
||||
|
||||
def update_user_stats
|
||||
@ -699,7 +700,7 @@ class ImportScripts::Base
|
||||
|
||||
puts "", "Updating first_post_created_at..."
|
||||
|
||||
sql = <<-SQL
|
||||
DB.exec <<~SQL
|
||||
WITH sub AS (
|
||||
SELECT user_id, MIN(posts.created_at) AS first_post_created_at
|
||||
FROM posts
|
||||
@ -713,11 +714,9 @@ class ImportScripts::Base
|
||||
AND user_stats.first_post_created_at <> sub.first_post_created_at
|
||||
SQL
|
||||
|
||||
DB.exec(sql)
|
||||
|
||||
puts "", "Updating user post_count..."
|
||||
|
||||
sql = <<-SQL
|
||||
DB.exec <<~SQL
|
||||
WITH sub AS (
|
||||
SELECT user_id, COUNT(*) AS post_count
|
||||
FROM posts
|
||||
@ -731,11 +730,9 @@ class ImportScripts::Base
|
||||
AND user_stats.post_count <> sub.post_count
|
||||
SQL
|
||||
|
||||
DB.exec(sql)
|
||||
|
||||
puts "", "Updating user topic_count..."
|
||||
|
||||
sql = <<-SQL
|
||||
DB.exec <<~SQL
|
||||
WITH sub AS (
|
||||
SELECT user_id, COUNT(*) AS topic_count
|
||||
FROM topics
|
||||
@ -748,8 +745,6 @@ class ImportScripts::Base
|
||||
WHERE u1.user_id = user_stats.user_id
|
||||
AND user_stats.topic_count <> sub.topic_count
|
||||
SQL
|
||||
|
||||
DB.exec(sql)
|
||||
end
|
||||
|
||||
# scripts that are able to import last_seen_at from the source data should override this method
|
||||
@ -760,6 +755,31 @@ class ImportScripts::Base
|
||||
DB.exec("UPDATE users SET last_seen_at = last_posted_at WHERE last_posted_at IS NOT NULL")
|
||||
end
|
||||
|
||||
def update_topic_users
|
||||
puts "", "Updating topic users"
|
||||
|
||||
DB.exec <<~SQL
|
||||
INSERT INTO topic_users (user_id, topic_id, posted, last_read_post_number, highest_seen_post_number, first_visited_at, last_visited_at, total_msecs_viewed)
|
||||
SELECT user_id, topic_id, 't' , MAX(post_number), MAX(post_number), MIN(created_at), MAX(created_at), COUNT(id) * 5000
|
||||
FROM posts
|
||||
WHERE user_id > 0
|
||||
GROUP BY user_id, topic_id
|
||||
ON CONFLICT DO NOTHING
|
||||
SQL
|
||||
end
|
||||
|
||||
def update_post_timings
|
||||
puts "", "Updating post timings"
|
||||
|
||||
DB.exec <<~SQL
|
||||
INSERT INTO post_timings (topic_id, post_number, user_id, msecs)
|
||||
SELECT topic_id, post_number, user_id, 5000
|
||||
FROM posts
|
||||
WHERE user_id > 0
|
||||
ON CONFLICT DO NOTHING
|
||||
SQL
|
||||
end
|
||||
|
||||
def update_feature_topic_users
|
||||
puts "", "Updating featured topic users"
|
||||
|
||||
|
Reference in New Issue
Block a user