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,30 +45,40 @@ class VisitorsController < InheritedResources::Base | ||
| 45 | index! | 45 | index! |
| 46 | end | 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 | def votes | 83 | def votes |
| 74 | @visitor = Visitor.find_by_identifier!(params[:id]) | 84 | @visitor = Visitor.find_by_identifier!(params[:id]) |