class FnordMetric::Session
Attributes
name[RW]
picture[RW]
updated_at[RW]
Public Class Methods
all(opts)
click to toggle source
# File lib/fnordmetric/session.rb, line 26 def self.all(opts) set_key = "#{opts[:namespace_prefix]}-session" limit = (opts[:limit].try(:to_i)||0)-1 session_ids = opts[:redis].zrevrange(set_key, 0, limit, :withscores => true) unless session_ids.first.is_a?(Array) session_ids = session_ids.in_groups_of(2).map do |session_id, ts| [session_id, Float(ts)] end end session_ids.map do |session_key, ts| find(session_key, opts).tap{ |s| s.updated_at = "%.f" % ts } end end
create(opts)
click to toggle source
# File lib/fnordmetric/session.rb, line 7 def self.create(opts) redis = opts.fetch(:redis) event = opts[:event] hash = Digest::MD5.hexdigest(event[:_session]) set_key = "#{opts[:namespace_prefix]}-session" self.new(hash).tap do |session| session.add_redis(redis, set_key) session.add_event(event) session.expire(opts[:session_data_ttl]) end end
find(session_key, opts)
click to toggle source
# File lib/fnordmetric/session.rb, line 21 def self.find(session_key, opts) set_key = "#{opts[:namespace_prefix]}-session" self.new(session_key, [opts[:redis], set_key]) end
new(session_key, redis_opts=nil)
click to toggle source
# File lib/fnordmetric/session.rb, line 42 def initialize(session_key, redis_opts=nil) @session_key = session_key add_redis(*redis_opts) if redis_opts end
Public Instance Methods
add_data(key, value)
click to toggle source
# File lib/fnordmetric/session.rb, line 112 def add_data(key, value) @redis.hset(redis_key(:data), key, value) end
add_event(event)
click to toggle source
# File lib/fnordmetric/session.rb, line 97 def add_event(event) @redis.zadd(redis_key(:events), event[:_time], event[:_eid]) add_data(:_picture, event[:url]) if event[:_type] == "_set_picture" add_data(:_name, event[:name]) if event[:_type] == "_set_name" add_event_data(event) if event[:_type] == "_set_data" touch(event[:_time]) end
add_event_data(event)
click to toggle source
# File lib/fnordmetric/session.rb, line 106 def add_event_data(event) event.each do |key, value| add_data(key, value) unless key.to_s.starts_with?("_") end end
add_redis(redis, prefix)
click to toggle source
# File lib/fnordmetric/session.rb, line 83 def add_redis(redis, prefix) @redis_prefix = prefix @redis = redis end
data(key=nil)
click to toggle source
# File lib/fnordmetric/session.rb, line 59 def data(key=nil) key ? @data[key] : @data end
event_ids()
click to toggle source
# File lib/fnordmetric/session.rb, line 63 def event_ids @event_ids || [] end
events()
click to toggle source
# File lib/fnordmetric/session.rb, line 67 def events [] end
expire(time)
click to toggle source
# File lib/fnordmetric/session.rb, line 92 def expire(time) @redis.expire(redis_key(:events), time) @redis.expire(redis_key(:data), time) end
fetch_data!()
click to toggle source
# File lib/fnordmetric/session.rb, line 116 def fetch_data! @data = Hash.new @redis.hgetall(redis_key(:data)).each do |key, value| if key.to_s.starts_with?("_") fetch_meta_key(key, value) else @data[key.intern] = value end end end
fetch_event_ids!(since=-1)
click to toggle source
# File lib/fnordmetric/session.rb, line 134 def fetch_event_ids!(since=-1) # FIXME: use WITHSCORE to get the timestamps and return event objects @event_ids = @redis.zrevrange(redis_key(:events), 0, since) end
fetch_meta_key(key, value)
click to toggle source
# File lib/fnordmetric/session.rb, line 127 def fetch_meta_key(key, value) meta_key = key[1..-1] if @@meta_attributes.include?(meta_key) instance_variable_set(:"@#{meta_key}", value) end end
redis_key(append=nil)
click to toggle source
# File lib/fnordmetric/session.rb, line 79 def redis_key(append=nil) [@redis_prefix, @session_key, append].compact.join("-") end
session_key()
click to toggle source
# File lib/fnordmetric/session.rb, line 47 def session_key @session_key end
to_json()
click to toggle source
# File lib/fnordmetric/session.rb, line 71 def to_json { :session_key => session_key }.tap do |hash| hash.merge!(:_picture => @picture) if @picture hash.merge!(:_name => @name) if @name hash.merge!(:_updated_at => @updated_at) if @updated_at end end
touch(time=Time.now.to_i)
click to toggle source
# File lib/fnordmetric/session.rb, line 88 def touch(time=Time.now.to_i) @redis.zadd(@redis_prefix, time, @session_key) end