Commit ac6d249329acdb2b6dbdbb8ba8fbc26d69cc5f8f
1 parent
a43ab92a
Exists in
master
and in
1 other branch
Speeding up density generation
Showing
2 changed files
with
55 additions
and
10 deletions
Show diff stats
app/models/question.rb
... | ... | @@ -276,19 +276,40 @@ class Question < ActiveRecord::Base |
276 | 276 | nonseed_nonseed_sum= 0 |
277 | 277 | nonseed_nonseed_total= 0 |
278 | 278 | |
279 | + #cache some hashes to prevent tons of sql thrashing | |
280 | + num_appearances_by_prompt = self.appearances.count(:group => :prompt_id) | |
281 | + | |
282 | + | |
283 | + is_user_created = {} | |
284 | + self.choices.each do |c| | |
285 | + is_user_created[c.id] = c.user_created | |
286 | + end | |
287 | + | |
288 | + | |
279 | 289 | #the_prompts = prompts.find(:all, :include => ['left_choice', 'right_choice']) |
280 | - prompts.find_each(:include => ['left_choice', 'right_choice']) do |p| | |
281 | - if p.left_choice.user_created == false && p.right_choice.user_created == false | |
282 | - seed_seed_sum += p.appearances.size | |
290 | + prompts.find_each do |p| | |
291 | + | |
292 | + num_appearances = num_appearances_by_prompt[p.id] | |
293 | + | |
294 | + if num_appearances.nil? | |
295 | + num_appearances = 0 | |
296 | + end | |
297 | + | |
298 | + left_user_created = is_user_created[p.left_choice_id] | |
299 | + right_user_created = is_user_created[p.right_choice_id] | |
300 | + | |
301 | + | |
302 | + if left_user_created == false && right_user_created == false | |
303 | + seed_seed_sum += num_appearances | |
283 | 304 | seed_seed_total +=1 |
284 | - elsif p.left_choice.user_created == false && p.right_choice.user_created == true | |
285 | - seed_nonseed_sum += p.appearances.size | |
305 | + elsif left_user_created == false && right_user_created == true | |
306 | + seed_nonseed_sum += num_appearances | |
286 | 307 | seed_nonseed_total +=1 |
287 | - elsif p.left_choice.user_created == true && p.right_choice.user_created == false | |
288 | - nonseed_seed_sum += p.appearances.size | |
308 | + elsif left_user_created == true && right_user_created == false | |
309 | + nonseed_seed_sum += num_appearances | |
289 | 310 | nonseed_seed_total +=1 |
290 | - elsif p.left_choice.user_created == true && p.right_choice.user_created == true | |
291 | - nonseed_nonseed_sum += p.appearances.size | |
311 | + elsif left_user_created == true && right_user_created == true | |
312 | + nonseed_nonseed_sum += num_appearances | |
292 | 313 | nonseed_nonseed_total +=1 |
293 | 314 | end |
294 | 315 | end | ... | ... |
lib/tasks/test_api.rake
... | ... | @@ -211,9 +211,33 @@ namespace :test_api do |
211 | 211 | |
212 | 212 | desc "Generate density information for each question - should be run nightly" |
213 | 213 | task(:generate_density_information => :environment) do |
214 | - Question.find(:all).each do |q| | |
214 | + | |
215 | + # calculating densities is expensive, so only do it for questions with new data | |
216 | + question_ids = Vote.count(:conditions => ['date(created_at) = ?', Date.yesterday], :group => 'question_id').keys() | |
217 | + | |
218 | + Question.find(:all, :conditions => {:id => question_ids}).each do |q| | |
215 | 219 | q.save_densities! |
216 | 220 | end |
221 | + | |
222 | + # we can just copy the previous night's data for remaining questions | |
223 | + | |
224 | + Question.find(:all, :conditions => ['id NOT IN (?)', question_ids]).each do |q| | |
225 | + densities = q.densities.find(:all, :conditions => ['date(created_at) = ?', Date.yesterday]) | |
226 | + | |
227 | + | |
228 | + densities.each do |d| | |
229 | + new_d = d.clone | |
230 | + new_d.created_at = new_d.updated_at = Time.now | |
231 | + new_d.save! | |
232 | + end | |
233 | + | |
234 | + if densities.blank? | |
235 | + #fallback in case there wasn't a successful run yesterday | |
236 | + q.save_densities! | |
237 | + | |
238 | + end | |
239 | + | |
240 | + end | |
217 | 241 | end |
218 | 242 | |
219 | 243 | desc "Description here" | ... | ... |