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