module RedisAnalytics::Helpers

Constants

FORMAT_SPECIFIER
GRANULARITY

Private Instance Methods

data(granularity, metric_name, from_date, options = {}) click to toggle source
# File lib/redis_analytics/helpers.rb, line 23
def data(granularity, metric_name, from_date, options = {})
  aggregate = options[:aggregate] || false
  x = granularity[0..-3]

  to_date = (options[:to_date] || Time.now).send("end_of_#{x}")
  i = from_date.send("beginning_of_#{x}")

  union = []
  time = []
  begin
    slice_key = i.strftime(FORMAT_SPECIFIER[0..GRANULARITY.index(granularity)].map{|x| x[0]}.join('_'))
    union << "#{RedisAnalytics.redis_namespace}:#{metric_name}:#{slice_key}"
    time << slice_key.split('_')
    i += 1.send(x)
  end while i <= to_date
  seq = get_next_seq
  if metric_type(metric_name) == 'String'
    if aggregate
      union_key = "#{RedisAnalytics.redis_namespace}:#{seq}"
      RedisAnalytics.redis_connection.zunionstore(union_key, union)
      RedisAnalytics.redis_connection.expire(union_key, 100)
      return Hash[RedisAnalytics.redis_connection.zrange(union_key, 0, -1, :with_scores => true)]
    else
      return time.zip(union.map{|x| Hash[RedisAnalytics.redis_connection.zrange(x, 0, -1, :with_scores => true)]})
    end
  elsif metric_type(metric_name) == 'Integer'
    if aggregate
      return RedisAnalytics.redis_connection.mget(*union).map(&:to_i).inject(:+)
    else
      return time.zip(RedisAnalytics.redis_connection.mget(*union).map(&:to_i))
    end
  else
    if Metrics.public_instance_methods.any?{|m| m.to_s =~ /^#{metric_name}_ratio_per_(hit|visit)$/}
      aggregate ? {} : time.zip([{}] * time.length)
    elsif Metrics.public_instance_methods.any?{|m| m.to_s =~ /^#{metric_name}_count_per_(hit|visit)$/}
      aggregate ? 0 : time.zip([0] * time.length)
    else
      aggregate ? 0 : time.zip([0] * time.length)
    end
  end
end
get_next_seq() click to toggle source
# File lib/redis_analytics/helpers.rb, line 65
def get_next_seq
  seq = RedisAnalytics.redis_connection.incr("#{RedisAnalytics.redis_namespace}:#SEQUENCER")
end
method_missing(meth, *args, &block) click to toggle source
Calls superclass method
# File lib/redis_analytics/helpers.rb, line 9
def method_missing(meth, *args, &block)
  if meth.to_s =~ /^(minute|hour|dai|day|month|year)ly_([a-z_0-9]+)$/
    granularity = ($1 == 'dai' ? 'day' : $1) + 'ly'
    metric_name = $2
    data(granularity, metric_name, *args)
  else
    super
  end
end
metric_type(metric_name) click to toggle source
# File lib/redis_analytics/helpers.rb, line 19
def metric_type(metric_name)
  RedisAnalytics.redis_connection.hget("#{RedisAnalytics.redis_namespace}:#METRICS", metric_name)
end
time_range() click to toggle source
# File lib/redis_analytics/helpers.rb, line 69
def time_range
  (request.cookies["_rarng"] || RedisAnalytics.default_range).to_sym
end