Commit f80262186b6b8183a19853702053d831b1ca8d94

Authored by Luke Baker
1 parent 67fd10da

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