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