Class: Vanity::Adapters::RedisAdapter

Inherits:
AbstractAdapter show all
Defined in:
lib/vanity/adapters/redis_adapter.rb

Overview

Redis adapter.

Since:

  • 1.4.0

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ RedisAdapter

Returns a new instance of RedisAdapter.

Since:

  • 1.4.0



17
18
19
20
21
22
# File 'lib/vanity/adapters/redis_adapter.rb', line 17

def initialize(options)
  @options = options.clone
  @options[:db] ||= @options[:database] || (@options[:path] && @options.delete(:path).split("/")[1].to_i)
  @options[:thread_safe] = true
  connect!
end

Instance Method Details

#ab_add_conversion(experiment, alternative, identity, count = 1, implicit = false) ⇒ Object

Since:

  • 1.4.0



133
134
135
136
137
138
139
140
141
# File 'lib/vanity/adapters/redis_adapter.rb', line 133

def ab_add_conversion(experiment, alternative, identity, count = 1, implicit = false)
  if implicit
    @experiments.sadd "#{experiment}:alts:#{alternative}:participants", identity
  else
    participating = @experiments.sismember("#{experiment}:alts:#{alternative}:participants", identity)
  end
  @experiments.sadd "#{experiment}:alts:#{alternative}:converted", identity if implicit || participating
  @experiments.incrby "#{experiment}:alts:#{alternative}:conversions", count
end

#ab_add_participant(experiment, alternative, identity) ⇒ Object

Since:

  • 1.4.0



129
130
131
# File 'lib/vanity/adapters/redis_adapter.rb', line 129

def ab_add_participant(experiment, alternative, identity)
  @experiments.sadd "#{experiment}:alts:#{alternative}:participants", identity
end

#ab_counts(experiment, alternative) ⇒ Object

Since:

  • 1.4.0



110
111
112
113
114
# File 'lib/vanity/adapters/redis_adapter.rb', line 110

def ab_counts(experiment, alternative)
  { :participants => @experiments.scard("#{experiment}:alts:#{alternative}:participants").to_i,
    :converted    => @experiments.scard("#{experiment}:alts:#{alternative}:converted").to_i,
    :conversions  => @experiments["#{experiment}:alts:#{alternative}:conversions"].to_i }
end

#ab_get_outcome(experiment) ⇒ Object

Since:

  • 1.4.0



143
144
145
146
# File 'lib/vanity/adapters/redis_adapter.rb', line 143

def ab_get_outcome(experiment)
  alternative = @experiments["#{experiment}:outcome"]
  alternative && alternative.to_i
end

#ab_not_showing(experiment, identity) ⇒ Object

Since:

  • 1.4.0



125
126
127
# File 'lib/vanity/adapters/redis_adapter.rb', line 125

def ab_not_showing(experiment, identity)
  @experiments.del "#{experiment}:participant:#{identity}:show"
end

#ab_set_outcome(experiment, alternative = 0) ⇒ Object

Since:

  • 1.4.0



148
149
150
# File 'lib/vanity/adapters/redis_adapter.rb', line 148

def ab_set_outcome(experiment, alternative = 0)
  @experiments.setnx "#{experiment}:outcome", alternative
end

#ab_show(experiment, identity, alternative) ⇒ Object

Since:

  • 1.4.0



116
117
118
# File 'lib/vanity/adapters/redis_adapter.rb', line 116

def ab_show(experiment, identity, alternative)
  @experiments["#{experiment}:participant:#{identity}:show"] = alternative
end

#ab_showing(experiment, identity) ⇒ Object

Since:

  • 1.4.0



120
121
122
123
# File 'lib/vanity/adapters/redis_adapter.rb', line 120

def ab_showing(experiment, identity)
  alternative = @experiments["#{experiment}:participant:#{identity}:show"]
  alternative && alternative.to_i
end

#active?Boolean

Returns:

  • (Boolean)

Since:

  • 1.4.0



24
25
26
# File 'lib/vanity/adapters/redis_adapter.rb', line 24

def active?
  !!@redis
end

#connect!Object

Since:

  • 1.4.0



44
45
46
47
48
# File 'lib/vanity/adapters/redis_adapter.rb', line 44

def connect!
  @redis = @options[:redis] || Redis.new(@options)
  @metrics = Redis::Namespace.new("vanity:metrics", :redis=>@redis)
  @experiments = Redis::Namespace.new("vanity:experiments", :redis=>@redis)
end

#destroy_experiment(experiment) ⇒ Object

Since:

  • 1.4.0



152
153
154
155
156
# File 'lib/vanity/adapters/redis_adapter.rb', line 152

def destroy_experiment(experiment)
  @experiments.del "#{experiment}:outcome", "#{experiment}:created_at", "#{experiment}:completed_at"
  alternatives = @experiments.keys("#{experiment}:alts:*")
  @experiments.del *alternatives unless alternatives.empty?
end

#destroy_metric(metric) ⇒ Object

Since:

  • 1.4.0



81
82
83
# File 'lib/vanity/adapters/redis_adapter.rb', line 81

def destroy_metric(metric)
  @metrics.del *@metrics.keys("#{metric}:*")
end

#disconnect!Object

Since:

  • 1.4.0



28
29
30
31
32
33
34
35
36
37
# File 'lib/vanity/adapters/redis_adapter.rb', line 28

def disconnect!
  if redis
    begin
      redis.client.disconnect
    rescue Exception => e
      warn("Error while disconnecting from redis: #{e.message}")
    end
  end
  @redis = nil
end

#flushdbObject

Since:

  • 1.4.0



58
59
60
# File 'lib/vanity/adapters/redis_adapter.rb', line 58

def flushdb
  @redis.flushdb
end

#get_experiment_completed_at(experiment) ⇒ Object

Since:

  • 1.4.0



101
102
103
104
# File 'lib/vanity/adapters/redis_adapter.rb', line 101

def get_experiment_completed_at(experiment)
  completed_at = @experiments["#{experiment}:completed_at"]
  completed_at && Time.at(completed_at.to_i)
end

#get_experiment_created_at(experiment) ⇒ Object

Since:

  • 1.4.0



92
93
94
95
# File 'lib/vanity/adapters/redis_adapter.rb', line 92

def get_experiment_created_at(experiment)
  created_at = @experiments["#{experiment}:created_at"]
  created_at && Time.at(created_at.to_i)
end

#get_metric_last_update_at(metric) ⇒ Object

– Metrics –

Since:

  • 1.4.0



64
65
66
67
# File 'lib/vanity/adapters/redis_adapter.rb', line 64

def get_metric_last_update_at(metric)
  last_update_at = @metrics["#{metric}:last_update_at"]
  last_update_at && Time.at(last_update_at.to_i)
end

#is_experiment_completed?(experiment) ⇒ Boolean

Returns:

  • (Boolean)

Since:

  • 1.4.0



106
107
108
# File 'lib/vanity/adapters/redis_adapter.rb', line 106

def is_experiment_completed?(experiment)
  @experiments.exists("#{experiment}:completed_at")
end

#metric_track(metric, timestamp, identity, values) ⇒ Object

Since:

  • 1.4.0



69
70
71
72
73
74
# File 'lib/vanity/adapters/redis_adapter.rb', line 69

def metric_track(metric, timestamp, identity, values)
  values.each_with_index do |v,i|
    @metrics.incrby "#{metric}:#{timestamp.to_date}:value:#{i}", v
  end
  @metrics["#{metric}:last_update_at"] = Time.now.to_i
end

#metric_values(metric, from, to) ⇒ Object

Since:

  • 1.4.0



76
77
78
79
# File 'lib/vanity/adapters/redis_adapter.rb', line 76

def metric_values(metric, from, to)
  single = @metrics.mget(*(from.to_date..to.to_date).map { |date| "#{metric}:#{date}:value:0" }) || []
  single.map { |v| [v] }
end

#reconnect!Object

Since:

  • 1.4.0



39
40
41
42
# File 'lib/vanity/adapters/redis_adapter.rb', line 39

def reconnect!
  disconnect!
  connect!
end

#redisObject

Since:

  • 1.4.0



54
55
56
# File 'lib/vanity/adapters/redis_adapter.rb', line 54

def redis
  @redis
end

#set_experiment_completed_at(experiment, time) ⇒ Object

Since:

  • 1.4.0



97
98
99
# File 'lib/vanity/adapters/redis_adapter.rb', line 97

def set_experiment_completed_at(experiment, time)
  @experiments.setnx "#{experiment}:completed_at", time.to_i
end

#set_experiment_created_at(experiment, time) ⇒ Object

– Experiments –

Since:

  • 1.4.0



88
89
90
# File 'lib/vanity/adapters/redis_adapter.rb', line 88

def set_experiment_created_at(experiment, time)
  @experiments.setnx "#{experiment}:created_at", time.to_i
end

#to_sObject

Since:

  • 1.4.0



50
51
52
# File 'lib/vanity/adapters/redis_adapter.rb', line 50

def to_s
  redis.id
end