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 | ... | ... |