Class: Vanity::Adapters::ActiveRecordAdapter
- Inherits:
-
AbstractAdapter
- Object
- AbstractAdapter
- Vanity::Adapters::ActiveRecordAdapter
- Defined in:
- lib/vanity/adapters/active_record_adapter.rb
Overview
ActiveRecord adapter
Defined Under Namespace
Classes: VanityConversion, VanityExperiment, VanityMetric, VanityMetricValue, VanityParticipant, VanityRecord
Instance Method Summary collapse
-
#ab_add_conversion(experiment, alternative, identity, count = 1, implicit = false) ⇒ Object
Records a conversion in this experiment for the given alternative.
-
#ab_add_participant(experiment, alternative, identity) ⇒ Object
Records a participant in this experiment for the given alternative.
-
#ab_assigned(experiment, identity) ⇒ Object
Returns the participant’s seen alternative in this experiment, if it exists.
-
#ab_counts(experiment, alternative) ⇒ Object
Returns counts for given A/B experiment and alternative (by index).
-
#ab_get_outcome(experiment) ⇒ Object
Returns the outcome of this experiment (if set), the index of a particular alternative.
-
#ab_not_showing(experiment, identity) ⇒ Object
Cancels previously set association between identity and alternative.
-
#ab_seen(experiment, identity, alternative_or_id) ⇒ Object
Determines if a participant already has seen this alternative in this experiment.
-
#ab_set_outcome(experiment, alternative = 0) ⇒ Object
Sets the outcome of this experiment to a particular alternative.
-
#ab_show(experiment, identity, alternative) ⇒ Object
Pick particular alternative (by index) to show to this particular participant (by identity).
-
#ab_showing(experiment, identity) ⇒ Object
Indicates which alternative to show to this participant.
- #active? ⇒ Boolean
-
#destroy_experiment(experiment) ⇒ Object
Deletes all information about this experiment.
- #destroy_metric(metric) ⇒ Object
- #disconnect! ⇒ Object
-
#experiment_persisted?(experiment) ⇒ Boolean
– Experiments –.
- #flushdb ⇒ Object
- #get_experiment_completed_at(experiment) ⇒ Object
-
#get_experiment_created_at(experiment) ⇒ Object
Return when experiment was created.
-
#get_metric_last_update_at(metric) ⇒ Object
– Metrics –.
-
#initialize(options) ⇒ ActiveRecordAdapter
constructor
rubocop:todo Lint/MissingSuper.
-
#is_experiment_completed?(experiment) ⇒ Boolean
Returns true if experiment completed.
-
#is_experiment_enabled?(experiment) ⇒ Boolean
rubocop:todo Naming/PredicateName.
- #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
Store when experiment was created (do not write over existing value).
- #set_experiment_enabled(experiment, enabled) ⇒ Object
- #to_s ⇒ Object
Constructor Details
#initialize(options) ⇒ ActiveRecordAdapter
rubocop:todo Lint/MissingSuper
124 125 126 127 128 129 130 131 132 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 124 def initialize() # rubocop:todo Lint/MissingSuper @options = .each_with_object({}) do |kv, h| h[kv.first.to_s] = kv.last end if @options["active_record_adapter"] && (@options["active_record_adapter"] != "default") # rubocop:todo Style/GuardClause @options["adapter"] = @options["active_record_adapter"] VanityRecord.establish_connection(@options) end end |
Instance Method Details
#ab_add_conversion(experiment, alternative, identity, count = 1, implicit = false) ⇒ Object
Records a conversion in this experiment for the given alternative. Associates a value with the conversion (default to 1). If implicit is true, add participant if not already recorded for this experiment. If implicit is false (default), only add conversion if participant previously recorded as participating in this experiment.
296 297 298 299 300 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 296 def ab_add_conversion(experiment, alternative, identity, count = 1, implicit = false) participant = VanityParticipant.retrieve(experiment, identity, false) # rubocop:todo Lint/UselessAssignment VanityParticipant.retrieve(experiment, identity, implicit, converted: alternative, seen: alternative) VanityExperiment.retrieve(experiment).increment_conversion(alternative, count) end |
#ab_add_participant(experiment, alternative, identity) ⇒ Object
Records a participant in this experiment for the given alternative.
273 274 275 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 273 def ab_add_participant(experiment, alternative, identity) VanityParticipant.retrieve(experiment, identity, true, seen: alternative) end |
#ab_assigned(experiment, identity) ⇒ Object
Returns the participant’s seen alternative in this experiment, if it exists
286 287 288 289 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 286 def ab_assigned(experiment, identity) participant = VanityParticipant.retrieve(experiment, identity, false) participant && participant.seen end |
#ab_counts(experiment, alternative) ⇒ Object
Returns counts for given A/B experiment and alternative (by index). Returns hash with values for the keys :participants, :converted and :conversions.
241 242 243 244 245 246 247 248 249 250 251 252 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 241 def ab_counts(experiment, alternative) record = VanityExperiment.retrieve(experiment) participants = VanityParticipant.where(experiment_id: experiment.to_s, seen: alternative).count converted = VanityParticipant.where(experiment_id: experiment.to_s, converted: alternative).count conversions = record.vanity_conversions.where(alternative: alternative).sum(:conversions) { participants: participants, converted: converted, conversions: conversions, } end |
#ab_get_outcome(experiment) ⇒ Object
Returns the outcome of this experiment (if set), the index of a particular alternative.
304 305 306 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 304 def ab_get_outcome(experiment) VanityExperiment.retrieve(experiment).outcome end |
#ab_not_showing(experiment, identity) ⇒ Object
Cancels previously set association between identity and alternative. See #ab_show.
268 269 270 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 268 def ab_not_showing(experiment, identity) VanityParticipant.retrieve(experiment, identity, true, shown: nil) end |
#ab_seen(experiment, identity, alternative_or_id) ⇒ Object
Determines if a participant already has seen this alternative in this experiment.
278 279 280 281 282 283 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 278 def ab_seen(experiment, identity, alternative_or_id) with_ab_seen_deprecation(experiment, identity, alternative_or_id) do |expt, ident, alt_id| participant = VanityParticipant.retrieve(expt, ident, false) participant && participant.seen == alt_id end end |
#ab_set_outcome(experiment, alternative = 0) ⇒ Object
Sets the outcome of this experiment to a particular alternative.
309 310 311 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 309 def ab_set_outcome(experiment, alternative = 0) VanityExperiment.retrieve(experiment).update_attribute(:outcome, alternative) end |
#ab_show(experiment, identity, alternative) ⇒ Object
Pick particular alternative (by index) to show to this particular participant (by identity).
256 257 258 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 256 def ab_show(experiment, identity, alternative) VanityParticipant.retrieve(experiment, identity, true, shown: alternative) end |
#ab_showing(experiment, identity) ⇒ Object
Indicates which alternative to show to this participant. See #ab_show.
261 262 263 264 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 261 def ab_showing(experiment, identity) participant = VanityParticipant.retrieve(experiment, identity, false) participant && participant.shown end |
#active? ⇒ Boolean
134 135 136 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 134 def active? VanityRecord.connected? && VanityRecord.connection.active? end |
#destroy_experiment(experiment) ⇒ Object
Deletes all information about this experiment.
314 315 316 317 318 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 314 def destroy_experiment(experiment) VanityParticipant.where(experiment_id: experiment.to_s).delete_all record = VanityExperiment.find_by_experiment_id(experiment.to_s) record && record.destroy end |
#destroy_metric(metric) ⇒ Object
187 188 189 190 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 187 def destroy_metric(metric) record = VanityMetric.find_by_metric_id(metric.to_s) record && record.destroy end |
#disconnect! ⇒ Object
138 139 140 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 138 def disconnect! VanityRecord.connection.disconnect! if active? end |
#experiment_persisted?(experiment) ⇒ Boolean
– Experiments –
194 195 196 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 194 def experiment_persisted?(experiment) VanityExperiment.find_by_experiment_id(experiment.to_s).present? end |
#flushdb ⇒ Object
146 147 148 149 150 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 146 def flushdb [VanityExperiment, VanityMetric, VanityParticipant, VanityMetricValue, VanityConversion].each do |klass| klass.delete_all end end |
#get_experiment_completed_at(experiment) ⇒ Object
216 217 218 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 216 def get_experiment_completed_at(experiment) VanityExperiment.retrieve(experiment).completed_at end |
#get_experiment_created_at(experiment) ⇒ Object
Return when experiment was created.
207 208 209 210 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 207 def get_experiment_created_at(experiment) record = VanityExperiment.retrieve(experiment) record && record.created_at end |
#get_metric_last_update_at(metric) ⇒ Object
– Metrics –
154 155 156 157 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 154 def get_metric_last_update_at(metric) record = VanityMetric.find_by_metric_id(metric.to_s) record && record.updated_at end |
#is_experiment_completed?(experiment) ⇒ Boolean
Returns true if experiment completed.
221 222 223 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 221 def is_experiment_completed?(experiment) # rubocop:todo Naming/PredicateName !!VanityExperiment.retrieve(experiment).completed_at end |
#is_experiment_enabled?(experiment) ⇒ Boolean
rubocop:todo Naming/PredicateName
229 230 231 232 233 234 235 236 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 229 def is_experiment_enabled?(experiment) # rubocop:todo Naming/PredicateName record = VanityExperiment.retrieve(experiment) if Vanity.configuration.experiments_start_enabled record.enabled != false else record.enabled == true end end |
#metric_track(metric, timestamp, _identity, values) ⇒ Object
159 160 161 162 163 164 165 166 167 168 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 159 def metric_track(metric, , _identity, values) record = VanityMetric.retrieve(metric) values.each_with_index do |value, index| record.vanity_metric_values.create(date: .to_date.to_s, index: index, value: value) end record.touch_with_grace_period record.save end |
#metric_values(metric, from, to) ⇒ Object
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 170 def metric_values(metric, from, to) connection = VanityMetric.connection record = VanityMetric.retrieve(metric) dates = (from.to_date..to.to_date).map(&:to_s) conditions = [connection.quote_column_name('date') + ' BETWEEN ? AND ?', from.to_date, to.to_date] order = connection.quote_column_name('date').to_s # rubocop:todo Lint/UselessAssignment select = "sum(#{connection.quote_column_name('value')}) AS value, #{connection.quote_column_name('date')}" group_by = connection.quote_column_name('date').to_s values = record.vanity_metric_values.select(select).where(conditions).group(group_by) dates.map do |date| value = values.detect { |v| v.date == date } [(value && value.value) || 0] end end |
#reconnect! ⇒ Object
142 143 144 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 142 def reconnect! VanityRecord.connection.reconnect! end |
#set_experiment_completed_at(experiment, time) ⇒ Object
212 213 214 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 212 def set_experiment_completed_at(experiment, time) VanityExperiment.retrieve(experiment).update_attribute(:completed_at, time) end |
#set_experiment_created_at(experiment, time) ⇒ Object
Store when experiment was created (do not write over existing value).
199 200 201 202 203 204 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 199 def set_experiment_created_at(experiment, time) record = VanityExperiment.find_by_experiment_id(experiment.to_s) || VanityExperiment.new(experiment_id: experiment.to_s) record.created_at ||= time record.save end |
#set_experiment_enabled(experiment, enabled) ⇒ Object
225 226 227 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 225 def set_experiment_enabled(experiment, enabled) VanityExperiment.retrieve(experiment).update_attribute(:enabled, enabled) end |
#to_s ⇒ Object
320 321 322 |
# File 'lib/vanity/adapters/active_record_adapter.rb', line 320 def to_s @options.to_s end |