Commit e42bf0b626c57ea194be93678025c6fa11674ecc
1 parent
47320adc
Exists in
master
and in
1 other branch
Setting up redis based prompt_queue to speed up catchup algorithm
Showing
4 changed files
with
67 additions
and
2 deletions
Show diff stats
app/models/choice.rb
| ... | ... | @@ -108,7 +108,7 @@ class Choice < ActiveRecord::Base |
| 108 | 108 | |
| 109 | 109 | def generate_prompts |
| 110 | 110 | #once a choice is added, we need to generate the new prompts (possible combinations of choices) |
| 111 | - #do this in a new process (via delayed jobs) | |
| 111 | + #do this in a new process (via delayed jobs)? Maybe just for uploaded ideas | |
| 112 | 112 | previous_choices = (self.question.choices - [self]) |
| 113 | 113 | return if previous_choices.empty? |
| 114 | 114 | inserts = [] |
| ... | ... | @@ -127,7 +127,6 @@ class Choice < ActiveRecord::Base |
| 127 | 127 | |
| 128 | 128 | Question.update_counters(self.question_id, :prompts_count => 2*previous_choices.size) |
| 129 | 129 | |
| 130 | - logger.info("The sql is:::: #{sql}") | |
| 131 | 130 | |
| 132 | 131 | ActiveRecord::Base.connection.execute(sql) |
| 133 | 132 | ... | ... |
app/models/question.rb
| ... | ... | @@ -298,6 +298,27 @@ class Question < ActiveRecord::Base |
| 298 | 298 | end |
| 299 | 299 | end |
| 300 | 300 | |
| 301 | + def pq_key | |
| 302 | + @pq_key ||= "#{self.id}_prompt_queue" | |
| 303 | + end | |
| 304 | + | |
| 305 | + def clear_prompt_queue | |
| 306 | + $redis.del(self.pq_key) | |
| 307 | + end | |
| 308 | + | |
| 309 | + def add_prompt_to_queue | |
| 310 | + prompt = self.catchup_choose_prompt | |
| 311 | + $redis.rpush(self.pq_key, prompt.id) | |
| 312 | + prompt | |
| 313 | + end | |
| 314 | + | |
| 315 | + def pop_prompt_queue | |
| 316 | + prompt_id = $redis.lpop(self.pq_key) | |
| 317 | + prompt = prompt_id.nil? ? nil : Prompt.find(prompt_id.to_i) | |
| 318 | + end | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 301 | 322 | |
| 302 | 323 | |
| 303 | 324 | end | ... | ... |
spec/models/question_spec.rb
| ... | ... | @@ -84,6 +84,49 @@ describe Question do |
| 84 | 84 | (sum - 1.0).abs.should < 0.000001 |
| 85 | 85 | end |
| 86 | 86 | |
| 87 | + it "should allow the prompt queue to be cleared" do | |
| 88 | + @catchup_q.add_prompt_to_queue | |
| 89 | + @catchup_q.clear_prompt_queue | |
| 90 | + | |
| 91 | + @catchup_q.pop_prompt_queue.should == nil | |
| 92 | + end | |
| 93 | + it "should allow a prompt to be added to the prompt queue" do | |
| 94 | + @catchup_q.clear_prompt_queue | |
| 95 | + @catchup_q.pop_prompt_queue.should == nil | |
| 96 | + | |
| 97 | + @catchup_q.add_prompt_to_queue | |
| 98 | + | |
| 99 | + prompt = @catchup_q.pop_prompt_queue | |
| 100 | + | |
| 101 | + prompt.should_not == nil | |
| 102 | + prompt.active?.should == true | |
| 103 | + end | |
| 104 | + it "should return prompts from the queue in FIFO order" do | |
| 105 | + @catchup_q.clear_prompt_queue | |
| 106 | + @catchup_q.pop_prompt_queue.should == nil | |
| 107 | + | |
| 108 | + prompt1 = @catchup_q.add_prompt_to_queue | |
| 109 | + prompt2 = @catchup_q.add_prompt_to_queue | |
| 110 | + prompt3 = @catchup_q.add_prompt_to_queue | |
| 111 | + | |
| 112 | + prompt_1 = @catchup_q.pop_prompt_queue | |
| 113 | + prompt_2 = @catchup_q.pop_prompt_queue | |
| 114 | + prompt_3 = @catchup_q.pop_prompt_queue | |
| 115 | + | |
| 116 | + | |
| 117 | + prompt_1.should == prompt1 | |
| 118 | + prompt_2.should == prompt2 | |
| 119 | + prompt_3.should == prompt3 | |
| 120 | + | |
| 121 | + # there is a small probability that the catchup algorithm | |
| 122 | + # choose two prompts that are indeed equal | |
| 123 | + prompt_1.should_not == prompt_2 | |
| 124 | + prompt_1.should_not == prompt_3 | |
| 125 | + prompt_2.should_not == prompt_3 | |
| 126 | + | |
| 127 | + | |
| 128 | + @catchup_q.pop_prompt_queue.should == nil | |
| 129 | + end | |
| 87 | 130 | |
| 88 | 131 | |
| 89 | 132 | end | ... | ... |