|
1 | 1 | class MigrateOldResults < ActiveRecord::Migration[7.0] |
2 | | - def up |
3 | | - Submission.where(contest_id: nil).where.not(old_result: nil).find_in_batches do |lst| |
4 | | - data = lst.map {|s| |
5 | | - { |
6 | | - submission_id: s.id, |
7 | | - problem_id: s.problem_id, |
8 | | - result: s.old_result, |
9 | | - score: s.old_score, |
10 | | - time: s.old_time, |
11 | | - memory: s.old_memory, |
12 | | - } |
13 | | - } |
14 | | - OldSubmission.import(data) |
15 | | - end |
16 | | - mp = OldSubmission.pluck(:submission_id, :id).to_h |
17 | | - mp.values.each_slice(256).each {|lst| |
18 | | - data = SubmissionTask.where(submission_id: lst).where.not(old_result: nil).map { |s| |
19 | | - { |
20 | | - old_submission_id: mp[s.submission_id], |
21 | | - position: s.position, |
22 | | - result: s.old_result, |
23 | | - score: s.old_score, |
24 | | - time: s.old_time, |
25 | | - memory: s.old_memory, |
26 | | - } |
27 | | - } |
28 | | - OldSubmissionTask.import(data) |
29 | | - } |
30 | | - |
31 | | - add_index :old_submissions, [:problem_id, :result] |
| 2 | + def change |
32 | 3 | remove_index :submissions, [:contest_id, :new_rejudged, :result] |
33 | 4 | remove_index :submissions, [:contest_id, :new_rejudged, :id] |
34 | 5 | remove_index :submissions, [:contest_id, :user_id, :problem_id, :old_result], name: :index_submissions_old_user_query |
35 | 6 | remove_index :submissions, [:contest_id, :user_id, :result, :old_result], name: :index_submissions_old_user_result |
36 | 7 | remove_index :submissions, [:contest_id, :user_id, :result, :old_result, :problem_id], name: :index_submissions_old_user_problem_result |
37 | | - remove_column :submission_tasks, :old_result |
38 | | - remove_column :submission_tasks, :old_score |
39 | | - remove_column :submission_tasks, :old_time |
40 | | - remove_column :submission_tasks, :old_memory |
41 | | - remove_column :submissions, :old_result |
42 | | - remove_column :submissions, :old_score |
43 | | - remove_column :submissions, :old_time |
44 | | - remove_column :submissions, :old_memory |
45 | | - remove_column :submissions, :new_rejudged |
46 | | - remove_column :problems, :old_pid |
| 8 | + |
| 9 | + reversible do |direction| |
| 10 | + direction.up do |
| 11 | + execute %{ |
| 12 | + INSERT INTO old_submissions |
| 13 | + (submission_id, problem_id, result, score, time, memory, created_at, updated_at) |
| 14 | + SELECT id, problem_id, old_result, old_score, old_time, old_memory, NOW(), NOW() |
| 15 | + FROM submissions |
| 16 | + WHERE contest_id IS NULL AND old_result IS NOT NULL |
| 17 | + } |
| 18 | + execute %{ |
| 19 | + INSERT INTO old_submission_tasks |
| 20 | + (old_submission_id, position, result, score, time, memory, created_at, updated_at) |
| 21 | + SELECT old_submissions.id, submission_tasks.position, submission_tasks.old_result, |
| 22 | + submission_tasks.old_score, submission_tasks.old_time, submission_tasks.old_memory, NOW(), NOW() |
| 23 | + FROM submission_tasks |
| 24 | + INNER JOIN old_submissions ON submission_tasks.submission_id = old_submissions.submission_id |
| 25 | + WHERE submission_tasks.old_result IS NOT NULL |
| 26 | + } |
| 27 | + end |
| 28 | + direction.down do |
| 29 | + execute %{ |
| 30 | + UPDATE submissions, |
| 31 | + (SELECT submission_id, result, score, time, memory FROM old_submissions) AS t |
| 32 | + SET submissions.old_result = t.result, submissions.old_score = t.score, |
| 33 | + submissions.old_time = t.time, submissions.old_memory = t.memory |
| 34 | + WHERE submissions.id = t.submission_id |
| 35 | + } |
| 36 | + execute %{ |
| 37 | + UPDATE submission_tasks, |
| 38 | + (SELECT old_submissions.submission_id, old_submission_tasks.position, |
| 39 | + old_submission_tasks.result, old_submission_tasks.score, |
| 40 | + old_submission_tasks.time, old_submission_tasks.memory |
| 41 | + FROM old_submission_tasks |
| 42 | + INNER JOIN old_submissions ON old_submissions.id = old_submission_tasks.old_submission_id |
| 43 | + ) AS t |
| 44 | + SET submission_tasks.old_result = t.result, submission_tasks.old_score = t.score, |
| 45 | + submission_tasks.old_time = t.time, submission_tasks.old_memory = t.memory |
| 46 | + WHERE submission_tasks.submission_id = t.submission_id AND |
| 47 | + submission_tasks.position = t.position |
| 48 | + } |
| 49 | + end |
| 50 | + end |
| 51 | + |
| 52 | + add_index :old_submissions, [:problem_id, :result] |
| 53 | + remove_column :submission_tasks, :old_result, :string |
| 54 | + remove_column :submission_tasks, :old_score, :decimal, precision: 18, scale: 6 |
| 55 | + remove_column :submission_tasks, :old_time, :integer |
| 56 | + remove_column :submission_tasks, :old_memory, :integer |
| 57 | + remove_column :submissions, :old_result, :string |
| 58 | + remove_column :submissions, :old_score, :decimal, precision: 18, scale: 6 |
| 59 | + remove_column :submissions, :old_time, :integer |
| 60 | + remove_column :submissions, :old_memory, :integer |
| 61 | + remove_column :submissions, :new_rejudged, :boolean |
| 62 | + remove_column :problems, :old_pid, :integer |
47 | 63 | end |
48 | 64 | end |
0 commit comments