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,7 +108,7 @@ class Choice < ActiveRecord::Base | ||
| 108 | 108 | ||
| 109 | def generate_prompts | 109 | def generate_prompts |
| 110 | #once a choice is added, we need to generate the new prompts (possible combinations of choices) | 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 | previous_choices = (self.question.choices - [self]) | 112 | previous_choices = (self.question.choices - [self]) |
| 113 | return if previous_choices.empty? | 113 | return if previous_choices.empty? |
| 114 | inserts = [] | 114 | inserts = [] |
| @@ -127,7 +127,6 @@ class Choice < ActiveRecord::Base | @@ -127,7 +127,6 @@ class Choice < ActiveRecord::Base | ||
| 127 | 127 | ||
| 128 | Question.update_counters(self.question_id, :prompts_count => 2*previous_choices.size) | 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 | ActiveRecord::Base.connection.execute(sql) | 131 | ActiveRecord::Base.connection.execute(sql) |
| 133 | 132 |
app/models/question.rb
| @@ -298,6 +298,27 @@ class Question < ActiveRecord::Base | @@ -298,6 +298,27 @@ class Question < ActiveRecord::Base | ||
| 298 | end | 298 | end |
| 299 | end | 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 | end | 324 | end |
spec/models/question_spec.rb
| @@ -84,6 +84,49 @@ describe Question do | @@ -84,6 +84,49 @@ describe Question do | ||
| 84 | (sum - 1.0).abs.should < 0.000001 | 84 | (sum - 1.0).abs.should < 0.000001 |
| 85 | end | 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 | end | 132 | end |