diff options
author | Thibaut Girka <thib@sitedethib.com> | 2018-10-28 08:37:49 +0100 |
---|---|---|
committer | Thibaut Girka <thib@sitedethib.com> | 2018-10-28 08:37:49 +0100 |
commit | b00f60f1d3d5415b5fd536191a7ee183ae910d03 (patch) | |
tree | fa36e5f3ef4128cbf6c55b88e4ea1ddaa2dc161e /db/migrate | |
parent | 008f98b30481dff2278d0687deb874f05de66b75 (diff) | |
parent | 26fe37c41460d6db3b5dd975a86c14fdd8dfadf3 (diff) |
Merge branch 'master' into glitch-soc/merge-upstream
Diffstat (limited to 'db/migrate')
-rw-r--r-- | db/migrate/20181024224956_migrate_account_conversations.rb | 50 |
1 files changed, 41 insertions, 9 deletions
diff --git a/db/migrate/20181024224956_migrate_account_conversations.rb b/db/migrate/20181024224956_migrate_account_conversations.rb index 1821e8c27..47f7375ba 100644 --- a/db/migrate/20181024224956_migrate_account_conversations.rb +++ b/db/migrate/20181024224956_migrate_account_conversations.rb @@ -14,12 +14,29 @@ class MigrateAccountConversations < ActiveRecord::Migration[5.2] sleep 1 end - local_direct_statuses.find_each do |status| + total = estimate_rows(local_direct_statuses) + estimate_rows(notifications_about_direct_statuses) + migrated = 0 + started_time = Time.zone.now + last_time = Time.zone.now + + local_direct_statuses.includes(:account, mentions: :account).find_each do |status| AccountConversation.add_status(status.account, status) + migrated += 1 + + if Time.zone.now - last_time > 1 + say_progress(migrated, total, started_time) + last_time = Time.zone.now + end end - notifications_about_direct_statuses.find_each do |notification| + notifications_about_direct_statuses.includes(:account, mention: { status: [:account, mentions: :account] }).find_each do |notification| AccountConversation.add_status(notification.account, notification.target_status) + migrated += 1 + + if Time.zone.now - last_time > 1 + say_progress(migrated, total, started_time) + last_time = Time.zone.now + end end end @@ -28,16 +45,31 @@ class MigrateAccountConversations < ActiveRecord::Migration[5.2] private + def estimate_rows(query) + result = exec_query("EXPLAIN #{query.to_sql}").first + result['QUERY PLAN'].scan(/ rows=([\d]+)/).first&.first&.to_i || 0 + end + + def say_progress(migrated, total, started_time) + status = "Migrated #{migrated} rows" + + percentage = 100.0 * migrated / total + status += " (~#{sprintf('%.2f', percentage)}%, " + + remaining_time = (100.0 - percentage) * (Time.zone.now - started_time) / percentage + + status += "#{(remaining_time / 60).to_i}:" + status += sprintf('%02d', remaining_time.to_i % 60) + status += ' remaining)' + + say status, true + end + def local_direct_statuses - Status.unscoped - .local - .where(visibility: :direct) - .includes(:account, mentions: :account) + Status.unscoped.local.where(visibility: :direct) end def notifications_about_direct_statuses - Notification.joins(mention: :status) - .where(activity_type: 'Mention', statuses: { visibility: :direct }) - .includes(:account, mention: { status: [:account, mentions: :account] }) + Notification.joins(mention: :status).where(activity_type: 'Mention', statuses: { visibility: :direct }) end end |