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 | 64 | end |
65 | 65 | |
66 | 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 | 75 | Skip.find_each do |s| |
76 | 76 | if s.appearance_id |
77 | 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 | 85 | end |
81 | 86 | end |
82 | 87 | end |
83 | 88 | |
84 | 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 | 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 | 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 | 121 | end |
152 | 122 | |
153 | 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 | 545 | def ensure_all_votes_and_skips_have_unique_appearance |
546 | 546 | error_message = "" |
547 | 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 | 556 | end |
557 | - | |
557 | + | |
558 | 558 | return error_message.blank? ? [success_message, false] : [error_message, true] |
559 | 559 | end |
560 | 560 | ... | ... |