Class: Vanity::Adapters::MongodbAdapter
- Inherits:
-
AbstractAdapter
- Object
- AbstractAdapter
- Vanity::Adapters::MongodbAdapter
- Defined in:
- lib/vanity/adapters/mongodb_adapter.rb
Overview
MongoDB adapter.
Instance Attribute Summary collapse
- #mongo ⇒ Object readonly
Instance Method Summary collapse
- #ab_add_conversion(experiment, alternative, identity, count = 1, implicit = false) ⇒ Object
- #ab_add_participant(experiment, alternative, identity) ⇒ Object
- #ab_counts(experiment, alternative) ⇒ Object
- #ab_get_outcome(experiment) ⇒ Object
- #ab_not_showing(experiment, identity) ⇒ Object
- #ab_set_outcome(experiment, alternative = 0) ⇒ Object
- #ab_show(experiment, identity, alternative) ⇒ Object
- #ab_showing(experiment, identity) ⇒ Object
- #active? ⇒ Boolean
- #connect! ⇒ Object
- #destroy_experiment(experiment) ⇒ Object
- #destroy_metric(metric) ⇒ Object
- #disconnect! ⇒ Object
- #flushdb ⇒ Object
- #get_experiment_completed_at(experiment) ⇒ Object
- #get_experiment_created_at(experiment) ⇒ Object
-
#get_metric_last_update_at(metric) ⇒ Object
– Metrics –.
-
#initialize(options) ⇒ MongodbAdapter
constructor
A new instance of MongodbAdapter.
- #is_experiment_completed?(experiment) ⇒ Boolean
- #metric_track(metric, timestamp, identity, values) ⇒ Object
- #metric_values(metric, from, to) ⇒ Object
- #reconnect! ⇒ Object
- #set_experiment_completed_at(experiment, time) ⇒ Object
-
#set_experiment_created_at(experiment, time) ⇒ Object
– Experiments –.
- #setup_connection(options = {}) ⇒ Object
- #to_s ⇒ Object
Constructor Details
#initialize(options) ⇒ MongodbAdapter
Returns a new instance of MongodbAdapter.
20 21 22 23 24 25 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 20 def initialize() setup_connection() @options = .clone @options[:database] ||= (@options[:path] && @options[:path].split("/")[1]) || "vanity" connect! end |
Instance Attribute Details
#mongo ⇒ Object (readonly)
18 19 20 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 18 def mongo @mongo end |
Instance Method Details
#ab_add_conversion(experiment, alternative, identity, count = 1, implicit = false) ⇒ Object
153 154 155 156 157 158 159 160 161 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 153 def ab_add_conversion(experiment, alternative, identity, count = 1, implicit = false) if implicit @participants.update({ :experiment=>experiment, :identity=>identity }, { "$push"=>{ :seen=>alternative } }, :upsert=>true) else participating = @participants.find_one(:experiment=>experiment, :identity=>identity, :seen=>alternative) end @participants.update({ :experiment=>experiment, :identity=>identity }, { "$push"=>{ :converted=>alternative } }, :upsert=>true) if implicit || participating @experiments.update({ :_id=>experiment }, { "$inc"=>{ "conversions.#{alternative}"=>count } }, :upsert=>true) end |
#ab_add_participant(experiment, alternative, identity) ⇒ Object
149 150 151 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 149 def ab_add_participant(experiment, alternative, identity) @participants.update({ :experiment=>experiment, :identity=>identity }, { "$push"=>{ :seen=>alternative } }, :upsert=>true) end |
#ab_counts(experiment, alternative) ⇒ Object
128 129 130 131 132 133 134 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 128 def ab_counts(experiment, alternative) record = @experiments.find_one({ :_id=>experiment }, { :fields=>[:conversions] }) conversions = record && record["conversions"] { :participants => @participants.find({ :experiment=>experiment, :seen=>alternative }).count, :converted => @participants.find({ :experiment=>experiment, :converted=>alternative }).count, :conversions => conversions && conversions[alternative.to_s] || 0 } end |
#ab_get_outcome(experiment) ⇒ Object
163 164 165 166 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 163 def ab_get_outcome(experiment) experiment = @experiments.find_one({ :_id=>experiment }, { :fields=>[:outcome] }) experiment && experiment["outcome"] end |
#ab_not_showing(experiment, identity) ⇒ Object
145 146 147 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 145 def ab_not_showing(experiment, identity) @participants.update({ :experiment=>experiment, :identity=>identity }, { "$unset"=>:show }) end |
#ab_set_outcome(experiment, alternative = 0) ⇒ Object
168 169 170 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 168 def ab_set_outcome(experiment, alternative = 0) @experiments.update({ :_id=>experiment }, { "$set"=>{ :outcome=>alternative } }, :upsert=>true) end |
#ab_show(experiment, identity, alternative) ⇒ Object
136 137 138 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 136 def ab_show(experiment, identity, alternative) @participants.update({ :experiment=>experiment, :identity=>identity }, { "$set"=>{ :show=>alternative } }, :upsert=>true) end |
#ab_showing(experiment, identity) ⇒ Object
140 141 142 143 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 140 def ab_showing(experiment, identity) participant = @participants.find_one({ :experiment=>experiment, :identity=>identity }, { :fields=>[:show] }) participant && participant["show"] end |
#active? ⇒ Boolean
37 38 39 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 37 def active? @mongo.connected? end |
#connect! ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 52 def connect! @mongo ||= setup_connection(@options) @mongo.connect database = @mongo.db(@options[:database]) database.authenticate @options[:username], @options[:password], true if @options[:username] @metrics = database.collection("vanity.metrics") @experiments = database.collection("vanity.experiments") @participants = database.collection("vanity.participants") @participants.create_index [[:experiment, 1], [:identity, 1]], :unique=>true @participants.create_index [[:experiment, 1], [:seen, 1]] @participants.create_index [[:experiment, 1], [:converted, 1]] @mongo end |
#destroy_experiment(experiment) ⇒ Object
172 173 174 175 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 172 def destroy_experiment(experiment) @experiments.remove :_id=>experiment @participants.remove :experiment=>experiment end |
#destroy_metric(metric) ⇒ Object
99 100 101 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 99 def destroy_metric(metric) @metrics.remove :_id=>metric end |
#disconnect! ⇒ Object
41 42 43 44 45 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 41 def disconnect! @mongo.close rescue nil if @mongo @metrics, @experiments = nil @mongo = nil end |
#flushdb ⇒ Object
71 72 73 74 75 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 71 def flushdb @metrics.drop @experiments.drop @participants.drop end |
#get_experiment_completed_at(experiment) ⇒ Object
119 120 121 122 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 119 def get_experiment_completed_at(experiment) record = @experiments.find_one({ :_id=>experiment }, { :fields=>[:completed_at] }) record && record["completed_at"] end |
#get_experiment_created_at(experiment) ⇒ Object
110 111 112 113 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 110 def get_experiment_created_at(experiment) record = @experiments.find_one({ :_id=>experiment }, { :fields=>[:created_at] }) record && record["created_at"] end |
#get_metric_last_update_at(metric) ⇒ Object
– Metrics –
80 81 82 83 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 80 def get_metric_last_update_at(metric) record = @metrics.find_one(:_id=>metric) record && record["last_update_at"] end |
#is_experiment_completed?(experiment) ⇒ Boolean
124 125 126 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 124 def is_experiment_completed?(experiment) !!@experiments.find_one(:_id=>experiment, :completed_at=>{ "$exists"=>true }) end |
#metric_track(metric, timestamp, identity, values) ⇒ Object
85 86 87 88 89 90 91 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 85 def metric_track(metric, , identity, values) inc = {} values.each_with_index do |v,i| inc["data.#{.to_date}.#{i}"] = v end @metrics.update({ :_id=>metric }, { "$inc"=>inc, "$set"=>{ :last_update_at=>Time.now } }, :upsert=>true) end |
#metric_values(metric, from, to) ⇒ Object
93 94 95 96 97 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 93 def metric_values(metric, from, to) record = @metrics.find_one(:_id=>metric) data = record && record["data"] || {} (from.to_date..to.to_date).map { |date| (data[date.to_s] || {}).values } end |
#reconnect! ⇒ Object
47 48 49 50 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 47 def reconnect! disconnect! connect! end |
#set_experiment_completed_at(experiment, time) ⇒ Object
115 116 117 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 115 def set_experiment_completed_at(experiment, time) @experiments.update({ :_id=>experiment }, { "$set"=>{ :completed_at=>time } }, :upsert=>true) end |
#set_experiment_created_at(experiment, time) ⇒ Object
– Experiments –
106 107 108 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 106 def set_experiment_created_at(experiment, time) @experiments.insert :_id=>experiment, :created_at=>time end |
#setup_connection(options = {}) ⇒ Object
27 28 29 30 31 32 33 34 35 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 27 def setup_connection( = {}) if [:hosts] args = ([:hosts].map{|host| [host, [:port]] } << {:connect => false}) @mongo = Mongo::ReplSetConnection.new(*args) else @mongo = Mongo::Connection.new([:host], [:port], :connect => false) end @mongo end |
#to_s ⇒ Object
66 67 68 69 |
# File 'lib/vanity/adapters/mongodb_adapter.rb', line 66 def to_s userinfo = @options.values_at(:username, :password).join(":") if @options[:username] URI::Generic.build(:scheme=>"mongodb", :userinfo=>userinfo, :host=>(@mongo.host || @options[:host]), :port=>(@mongo.port || @options[:port]), :path=>"/#{@options[:database]}").to_s end |