class Statlysis::LastestVisits
See tech details at mvj3.github.io/2013/01/30/recent-visitors-implement/
Attributes
clock[RW]
reject_proc[RW]
Public Class Methods
new(source, opts = {})
click to toggle source
pattern_proc is a proc to extract user_id or url_prefix to compute the top visitors from log user_id_proc is a proc to extract user_id from log user_info_proc is a proc to extract visitor informations(like id, name, …) reject_proc filter visitors
Calls superclass method
Statlysis::Top::new
# File lib/statlysis/cron/top/lastest_visits.rb, line 14 def initialize source, opts = {} # set variables cron.reclock opts[:default_time] cron.reject_proc = opts[:reject_proc] || proc {|pattern, user_id| pattern.to_i == user_id.to_i } super Utils.setup_pattern_table_and_model cron.stat_table_name cron end
Public Instance Methods
output()
click to toggle source
# File lib/statlysis/cron/top/lastest_visits.rb, line 23 def output cron.logs = cron.source.asc(cron.time_column).where(cron.time_column => {"$gte" => cron.clock.current}).limit(1000).to_a return {} if cron.logs.blank? cron.logs.inject({}) do |h, log| pattern = cron.pattern_proc.call(log) if pattern h[pattern] ||= [] user_id = cron.user_id_proc.call(log).to_i h[pattern] << user_id if not user_id.zero? end h end end
reclock(default_time = nil)
click to toggle source
# File lib/statlysis/cron/top/lastest_visits.rb, line 48 def reclock default_time = nil cron.clock = Clock.new cron.stat_table_name, (default_time || cron.clock.current) end
write()
click to toggle source
# File lib/statlysis/cron/top/lastest_visits.rb, line 37 def write logger.info "#{Time.now.strftime('%H:%M:%S')} #{cron.stat_model} #{cron.output.inspect}" cron.output.each do |pattern, user_ids| s = cron.stat_model.find_or_create(:pattern => pattern) old_array = (JSON.parse(s.result) rescue []).map {|i| Array(i)[0] } new_user_ids = (old_array + user_ids).reverse.uniq.reverse # ensure the right items will overwrite the left [1,4,5,7,4,3,3,2,1,5].uniq => [1, 4, 5, 7, 3, 2] s.update :result => new_user_ids.reject {|user_id| cron.reject_proc.call(pattern, user_id) rescue false }.map {|user_id| cron.user_info_proc.call(user_id) }.compact[0..cron.result_limit].to_json end cron.clock.update cron.logs.last.try(cron.time_column) end