mirror of
https://github.com/discourse/discourse.git
synced 2024-12-05 10:03:43 +08:00
30990006a9
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
36 lines
1.2 KiB
Ruby
36 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class MigrateWordCounts < ActiveRecord::Migration[4.2]
|
|
disable_ddl_transaction!
|
|
|
|
def up
|
|
post_ids = execute("SELECT id FROM posts WHERE word_count IS NULL LIMIT 500").map { |r| r['id'].to_i }
|
|
while post_ids.length > 0
|
|
3.times do
|
|
begin
|
|
execute "UPDATE posts SET word_count = COALESCE(array_length(regexp_split_to_array(raw, ' '),1), 0) WHERE id IN (#{post_ids.join(',')})"
|
|
break
|
|
rescue PG::Error
|
|
# Deadlock. Try again, up to 3 times.
|
|
end
|
|
end
|
|
post_ids = execute("SELECT id FROM posts WHERE word_count IS NULL LIMIT 500").map { |r| r['id'].to_i }
|
|
end
|
|
|
|
topic_ids = execute("SELECT id FROM topics WHERE word_count IS NULL LIMIT 500").map { |r| r['id'].to_i }
|
|
while topic_ids.length > 0
|
|
3.times do
|
|
begin
|
|
execute "UPDATE topics SET word_count = COALESCE((SELECT SUM(COALESCE(posts.word_count, 0)) FROM posts WHERE posts.topic_id = topics.id), 0) WHERE topics.id IN (#{topic_ids.join(',')})"
|
|
break
|
|
rescue PG::Error
|
|
# Deadlock. Try again, up to 3 times.
|
|
end
|
|
end
|
|
topic_ids = execute("SELECT id FROM topics WHERE word_count IS NULL LIMIT 500").map { |r| r['id'].to_i }
|
|
end
|
|
|
|
end
|
|
|
|
end
|