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