Commit f80262186b6b8183a19853702053d831b1ca8d94
1 parent
67fd10da
Exists in
master
and in
1 other branch
optimize objects_by_session_id
Showing
1 changed file
with
32 additions
and
22 deletions
Show diff stats
app/controllers/visitors_controller.rb
| ... | ... | @@ -45,30 +45,40 @@ class VisitorsController < InheritedResources::Base |
| 45 | 45 | index! |
| 46 | 46 | end |
| 47 | 47 | |
| 48 | - def objects_by_session_ids | |
| 49 | - session_ids = params[:session_ids] | |
| 48 | + def objects_by_session_ids | |
| 49 | + session_ids = params[:session_ids] | |
| 50 | 50 | |
| 51 | - visitor_ids = Visitor.find(:all, :conditions => { :identifier => session_ids}) | |
| 52 | - votes_by_visitor_id = Vote.with_voter_ids(visitor_ids).count(:group => :voter_id) | |
| 53 | - ideas_by_visitor_id = Choice.count(:group => :creator_id) | |
| 51 | + # reject any session_ids that have characters outside of [a-f0-9] | |
| 52 | + session_ids_query = session_ids.reject{|si| si.match(/[^a-f0-9]/)}.map{|si| "'#{si}'"}.join(',') | |
| 53 | + vsql = "SELECT vi.identifier, count(*) as count_all | |
| 54 | + FROM visitors vi | |
| 55 | + LEFT JOIN votes vo ON (vi.id = vo.voter_id) | |
| 56 | + WHERE vi.identifier in (#{session_ids_query}) | |
| 57 | + AND vo.valid_record = 1 | |
| 58 | + AND vo.voter_id IS NOT NULL | |
| 59 | + GROUP BY vo.voter_id" | |
| 60 | + csql = "SELECT vi.identifier, count(*) as count_all | |
| 61 | + FROM visitors vi | |
| 62 | + LEFT JOIN choices c ON (vi.id = c.creator_id) | |
| 63 | + WHERE vi.identifier in (#{session_ids_query}) | |
| 64 | + AND c.creator_id IS NOT NULL | |
| 65 | + GROUP BY c.creator_id" | |
| 66 | + votes = Visitor.connection.select_rows(vsql) | |
| 67 | + choices = Choice.connection.select_rows(csql) | |
| 54 | 68 | |
| 55 | - objects_by_session_id = {} | |
| 56 | - | |
| 57 | - visitor_ids.each do |e| | |
| 58 | - if votes_by_visitor_id.has_key?(e.id) | |
| 59 | - objects_by_session_id[e.identifier] = Hash.new | |
| 60 | - objects_by_session_id[e.identifier]['votes'] = votes_by_visitor_id[e.id] | |
| 61 | - end | |
| 62 | - if ideas_by_visitor_id.has_key?(e.id) | |
| 63 | - objects_by_session_id[e.identifier] = Hash.new if objects_by_session_id[e.identifier].nil? | |
| 64 | - objects_by_session_id[e.identifier]['ideas'] = ideas_by_visitor_id[e.id] | |
| 65 | - end | |
| 66 | - end | |
| 67 | - | |
| 68 | - respond_to do |format| | |
| 69 | - format.json { render :json => objects_by_session_id.to_json and return} | |
| 70 | - end | |
| 71 | - end | |
| 69 | + objects_by_session_id = Hash.new {|hsh, key| hsh[key] = {} } | |
| 70 | + | |
| 71 | + votes.each do |v| | |
| 72 | + objects_by_session_id[v[0]]['votes'] = v[1] | |
| 73 | + end | |
| 74 | + choices.each do |c| | |
| 75 | + objects_by_session_id[c[0]]['ideas'] = c[1] | |
| 76 | + end | |
| 77 | + | |
| 78 | + respond_to do |format| | |
| 79 | + format.json { render :json => objects_by_session_id.to_json and return} | |
| 80 | + end | |
| 81 | + end | |
| 72 | 82 | |
| 73 | 83 | def votes |
| 74 | 84 | @visitor = Visitor.find_by_identifier!(params[:id]) | ... | ... |