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