Commit d08205453b60b45cc0adeb1ee6aa578a1fa5d5b5
1 parent
1a4f43bd
Exists in
master
and in
1 other branch
Rake tasks to deal with doubly counted votes
Showing
2 changed files
with
44 additions
and
74 deletions
Show diff stats
lib/tasks/prune_db.rake
| @@ -64,90 +64,60 @@ namespace :prune_db do | @@ -64,90 +64,60 @@ namespace :prune_db do | ||
| 64 | end | 64 | end |
| 65 | 65 | ||
| 66 | task(:move_vote_and_skip_ids_to_appearance => :environment) do | 66 | task(:move_vote_and_skip_ids_to_appearance => :environment) do |
| 67 | - Vote.find_each do |v| | ||
| 68 | - @appearance = Appearance.find(v.appearance_id) | ||
| 69 | - @appearance.answerable = v | ||
| 70 | - @appearance.save | ||
| 71 | - if v.id % 1000 == 0 | ||
| 72 | - puts v.id | ||
| 73 | - end | ||
| 74 | - end | 67 | + #Vote.find_each do |v| |
| 68 | + # @appearance = Appearance.find(v.appearance_id) | ||
| 69 | +# @appearance.answerable = v | ||
| 70 | +# @appearance.save | ||
| 71 | +# if v.id % 1000 == 0 | ||
| 72 | +# puts v.id | ||
| 73 | +# end | ||
| 74 | +# end | ||
| 75 | Skip.find_each do |s| | 75 | Skip.find_each do |s| |
| 76 | if s.appearance_id | 76 | if s.appearance_id |
| 77 | @appearance = Appearance.find(s.appearance_id) | 77 | @appearance = Appearance.find(s.appearance_id) |
| 78 | - @appearance.answerable = s | ||
| 79 | - @appearance.save | 78 | + |
| 79 | + if @appearance.answerable | ||
| 80 | + puts "Appearance #{@appearance.id} has more than one skip!" | ||
| 81 | + else | ||
| 82 | + @appearance.answerable = s | ||
| 83 | + @appearance.save | ||
| 84 | + end | ||
| 80 | end | 85 | end |
| 81 | end | 86 | end |
| 82 | end | 87 | end |
| 83 | 88 | ||
| 84 | task(:remove_double_counted_votes_with_same_appearance => :environment) do | 89 | task(:remove_double_counted_votes_with_same_appearance => :environment) do |
| 85 | - problem_appearances = Vote.count(:group => :appearance_id, :having => "count(*) > 1") | ||
| 86 | - count = 0 | ||
| 87 | - choice_count = 0 | ||
| 88 | - voter_count = 0 | ||
| 89 | - problem_appearances.each do |id, num| | ||
| 90 | - votes = Vote.find(:all, :conditions => {:appearance_id => id}, :order => 'id ASC') | ||
| 91 | - choices = votes.map{|v| v.choice_id} | ||
| 92 | - voters = votes.map{|v| v.voter_id} | ||
| 93 | - questions = votes.map{|v| v.question_id} | ||
| 94 | - | ||
| 95 | - if choices.uniq.size > 1 || voters.uniq.size > 1 | ||
| 96 | - count+=1 | ||
| 97 | - puts "Appearance #{id}, on Question #{questions.uniq.first} has more than one inconsistent vote" | ||
| 98 | - if choices.uniq.size > 1 | ||
| 99 | - puts " There are #{choices.uniq.size} different choices!" | ||
| 100 | - choice_count +=1 | ||
| 101 | - end | ||
| 102 | - if voters.uniq.size > 1 | ||
| 103 | - puts " There are #{voters.uniq.size} different voters!" | ||
| 104 | - voter_count +=1 | ||
| 105 | - end | ||
| 106 | 90 | ||
| 107 | - if votes.size == 2 | ||
| 108 | - puts " There was #{votes.second.created_at.to_f - votes.first.created_at.to_f} seconds between votes" | ||
| 109 | - end | ||
| 110 | - end | 91 | + votes_with_no_appearance = [] |
| 92 | + Vote.find_each(:include => :appearance) do |v| | ||
| 93 | + puts v.id if v.id % 1000 == 0 | ||
| 111 | 94 | ||
| 112 | - votes = votes - [votes.first] # keep the first valid vote | ||
| 113 | - votes.each do |v| | ||
| 114 | - v.valid_record = false | ||
| 115 | - v.validity_information = "Double counted vote" | ||
| 116 | - v.save | ||
| 117 | - end | 95 | + votes_with_no_appearance << v if v.appearance.nil? |
| 118 | end | 96 | end |
| 97 | + | ||
| 98 | + skips_with_no_appearance = [] | ||
| 99 | + Skip.find_each(:include => :appearance) do |s| | ||
| 100 | + puts s.id if s.id % 1000 == 0 | ||
| 119 | 101 | ||
| 120 | - # one vote and one skip: | ||
| 121 | - # | ||
| 122 | - double_counted_appearances = ActiveRecord::Base.connection.select_all("select votes.appearance_id from skips inner join votes using (appearance_id) where votes.valid_record=1 AND skips.valid_record=1;") | 102 | + skips_with_no_appearance << s if s.appearance.nil? |
| 103 | + end | ||
| 123 | 104 | ||
| 124 | - puts double_counted_appearances.inspect | ||
| 125 | 105 | ||
| 126 | - double_counted_appearances.each do |result| | ||
| 127 | - v = result["appearance_id"] | ||
| 128 | - vote = Vote.find(:first, :conditions => {:appearance_id => v}) | ||
| 129 | - skip = Skip.find(:first, :conditions => {:appearance_id => v}) | 106 | + puts "#{votes_with_no_appearance.size} Votes" |
| 107 | + puts "#{skips_with_no_appearance.size} Skips" | ||
| 130 | 108 | ||
| 131 | - if vote.created_at < skip.created_at | ||
| 132 | - object = skip | ||
| 133 | - good_object = vote | ||
| 134 | - else | ||
| 135 | - object = vote | ||
| 136 | - good_object = skip | ||
| 137 | - end | ||
| 138 | - | ||
| 139 | - object.valid_record = false | ||
| 140 | - object.validity_information = "Double counted vote" | ||
| 141 | - object.save | 109 | + votes_with_no_appearance.each do |v| |
| 110 | + v.valid_record = false | ||
| 111 | + v.validity_information = "No associated appearance object" | ||
| 112 | + v.save! | ||
| 113 | + end | ||
| 142 | 114 | ||
| 143 | - @appearance = Appearance.find(good_object.appearance_id) | ||
| 144 | - @appearance.answerable = good_object | ||
| 145 | - @appearance.save | 115 | + skips_with_no_appearance.each do |s| |
| 116 | + s.valid_record = false | ||
| 117 | + s.validity_information = "No associated appearance object" | ||
| 118 | + s.save! | ||
| 146 | end | 119 | end |
| 147 | 120 | ||
| 148 | - puts "Total inconsistent appearances: #{count}" | ||
| 149 | - puts " #{choice_count} have inconsistent choices voted on" | ||
| 150 | - puts " #{voter_count} have inconsistent voters" | ||
| 151 | end | 121 | end |
| 152 | 122 | ||
| 153 | #call this by doing rake prune_db:populate_seed_ideas['blahblah',questionnum], where blahblah is the filename | 123 | #call this by doing rake prune_db:populate_seed_ideas['blahblah',questionnum], where blahblah is the filename |
lib/tasks/test_api.rake
| @@ -545,16 +545,16 @@ namespace :test_api do | @@ -545,16 +545,16 @@ namespace :test_api do | ||
| 545 | def ensure_all_votes_and_skips_have_unique_appearance | 545 | def ensure_all_votes_and_skips_have_unique_appearance |
| 546 | error_message = "" | 546 | error_message = "" |
| 547 | success_message = "All vote and skip objects have an associated appearance object" | 547 | success_message = "All vote and skip objects have an associated appearance object" |
| 548 | - votes_without_appearances= Vote.count(:conditions => {:appearance_id => nil}) | ||
| 549 | - if (votes_without_appearances > 0) | ||
| 550 | - error_message += "Error! There are #{votes_without_appearances} votes without associated appearance objects." | ||
| 551 | - end | ||
| 552 | 548 | ||
| 553 | - skips_without_appearances= Skip.count(:conditions => {:appearance_id => nil}) | ||
| 554 | - if (skips_without_appearances > 0) | ||
| 555 | - error_message += "Error! There are #{skips_without_appearances} skips without associated appearance objects." | 549 | + total_answered_appearances = Appearance.count(:conditions => 'answerable_id IS NOT NULL') |
| 550 | + total_votes = Vote.count | ||
| 551 | + total_skips = Skip.count | ||
| 552 | + | ||
| 553 | + if (total_answered_appearances != total_votes+ total_skips) | ||
| 554 | + difference = (total_votes+ total_skips) - total_answered_appearances | ||
| 555 | + error_message += "Error! There are #{difference} votes or skips without associated appearance objects." | ||
| 556 | end | 556 | end |
| 557 | - | 557 | + |
| 558 | return error_message.blank? ? [success_message, false] : [error_message, true] | 558 | return error_message.blank? ? [success_message, false] : [error_message, true] |
| 559 | end | 559 | end |
| 560 | 560 |