summaryrefslogtreecommitdiff
path: root/lib/gitlab/background_migration/update_timelogs_null_spent_at.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/background_migration/update_timelogs_null_spent_at.rb')
-rw-r--r--lib/gitlab/background_migration/update_timelogs_null_spent_at.rb39
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/gitlab/background_migration/update_timelogs_null_spent_at.rb b/lib/gitlab/background_migration/update_timelogs_null_spent_at.rb
new file mode 100644
index 00000000000..b61f2ee7f4c
--- /dev/null
+++ b/lib/gitlab/background_migration/update_timelogs_null_spent_at.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Class to populate spent_at for timelogs
+ class UpdateTimelogsNullSpentAt
+ include Gitlab::Database::DynamicModelHelpers
+
+ BATCH_SIZE = 100
+
+ def perform(start_id, stop_id)
+ define_batchable_model('timelogs', connection: connection)
+ .where(spent_at: nil, id: start_id..stop_id)
+ .each_batch(of: 100) do |subbatch|
+ batch_start, batch_end = subbatch.pick('min(id), max(id)')
+
+ update_timelogs(batch_start, batch_end)
+ end
+ end
+
+ def update_timelogs(batch_start, batch_stop)
+ execute(<<~SQL)
+ UPDATE timelogs
+ SET spent_at = created_at
+ WHERE spent_at IS NULL
+ AND timelogs.id BETWEEN #{batch_start} AND #{batch_stop};
+ SQL
+ end
+
+ def connection
+ @connection ||= ApplicationRecord.connection
+ end
+
+ def execute(sql)
+ connection.execute(sql)
+ end
+ end
+ end
+end