Commit f44412f01fb98dfaec2877a9fe64112fb28b829f
1 parent
14a2322e
Exists in
master
and in
1 other branch
add initial start of conversion task
Showing
1 changed file
with
69 additions
and
1 deletions
Show diff stats
lib/tasks/prune_db.rake
1 | 1 | namespace :prune_db do |
2 | 2 | |
3 | - task :all => [:invalidate_votes_with_bad_response_times] | |
3 | + desc "Converts all dates from PT to UTC" | |
4 | + task :convert_dates_to_utc => :environment do | |
5 | + time_spans = [ | |
6 | + #{ :gt => "2009-11-01 02:00:00", :lt => "2010-03-14 02:00:00", :h => 8}, | |
7 | + #{ :gt => "2010-03-14 02:00:00", :lt => "2010-11-07 01:00:00", :h => 7}, | |
8 | + { :gt => "2010-11-07 01:00:00", :lt => "2010-11-07 02:00:00", :h => nil}, | |
9 | + #{ :gt => "2010-11-07 02:00:00", :lt => "2011-03-13 02:00:00", :h => 8}, | |
10 | + #{ :gt => "2011-03-13 02:00:00", :lt => "2011-11-06 01:00:00", :h => 7}, | |
11 | + { :gt => "2011-11-06 01:00:00", :lt => "2011-11-06 02:00:00", :h => nil}, | |
12 | + #{ :gt => "2011-11-06 02:00:00", :lt => "2012-03-11 02:00:00", :h => 8}, | |
13 | + #{ :gt => "2012-03-11 02:00:00", :lt => "2012-11-04 01:00:00", :h => 7} | |
14 | + ] | |
15 | + # UTC because Rails will be thinking DB is in UTC when we run this | |
16 | + time_spans.map! do |t| | |
17 | + { :gt => Time.parse("#{t[:gt]} UTC"), | |
18 | + :lt => Time.parse("#{t[:lt]} UTC"), | |
19 | + :h => t[:h] } | |
20 | + end | |
21 | + datetime_fields = { | |
22 | + :appearances => ['created_at', 'updated_at'], | |
23 | + :choices => ['created_at', 'updated_at'], | |
24 | + :clicks => ['created_at', 'updated_at'], | |
25 | + :densities => ['created_at', 'updated_at'], | |
26 | + :flags => ['created_at', 'updated_at'], | |
27 | + :prompts => ['created_at', 'updated_at'], | |
28 | + :skips => ['created_at', 'updated_at'], | |
29 | + :votes => ['created_at', 'updated_at'], | |
30 | + :visitors => ['created_at', 'updated_at'], | |
31 | + :users => ['created_at', 'updated_at'], | |
32 | + :questions => ['created_at', 'updated_at'], | |
33 | + :question_versions => ['created_at', 'updated_at'], | |
34 | + :delayed_jobs => ['created_at', 'updated_at', 'run_at', 'locked_at', 'failed_at'], | |
35 | + } | |
36 | + | |
37 | + STDOUT.sync = true | |
38 | + datetime_fields.each do |table, columns| | |
39 | + print "#{table}" | |
40 | + batch_size = 10000 | |
41 | + i = 0 | |
42 | + while true do | |
43 | + rows = ActiveRecord::Base.connection.select_all( | |
44 | + "SELECT id, #{columns.join(", ")} FROM #{table} ORDER BY id LIMIT #{i*batch_size}, #{batch_size}" | |
45 | + ) | |
46 | + print "." | |
47 | + | |
48 | + rows.each do |row| | |
49 | + row.each do |column, value| | |
50 | + if value.class == Time | |
51 | + time_spans.each do |span| | |
52 | + # TODO: update row if match and span has :h | |
53 | + # log if :h is nil these will be manually sorted out | |
54 | + # log if no time_span found | |
55 | + if value < span[:lt] && value > span[:gt] | |
56 | + if span[:h].blank? | |
57 | + puts "#{row.inspect}: #{span.inspect}" | |
58 | + end | |
59 | + break | |
60 | + end | |
61 | + end | |
62 | + end | |
63 | + end | |
64 | + end | |
65 | + | |
66 | + i+= 1 | |
67 | + break if rows.length < 1000 | |
68 | + end | |
69 | + print "\n" | |
70 | + end | |
71 | + end | |
4 | 72 | |
5 | 73 | desc "Fixes a mis-match between a vote's prompt_id and its appearance's prompt_id. Sets the appearance prompt_id to match the vote's prompt_id" |
6 | 74 | task :fix_promptid_mismatch => :environment do | ... | ... |