11# frozen_string_literal: true
22
3+ require "split/experiment_storage"
4+
35module Split
46 class Experiment
57 attr_accessor :name
@@ -26,6 +28,9 @@ def initialize(name, options = {})
2628
2729 @name = name . to_s
2830
31+ @config_storage = ExperimentStorage ::ConfigStorage . new ( name )
32+ @redis_storage = ExperimentStorage ::RedisStorage . new ( name )
33+
2934 extract_alternatives_from_options ( options )
3035 end
3136
@@ -50,23 +55,16 @@ def extract_alternatives_from_options(options)
5055
5156 if alts . length == 1
5257 if alts [ 0 ] . is_a? Hash
53- alts = alts [ 0 ] . map { |k , v | { k => v } }
54- end
55- end
56-
57- if alts . empty?
58- exp_config = Split . configuration . experiment_for ( name )
59- if exp_config
60- alts = load_alternatives_from_configuration
61- options [ :goals ] = Split ::GoalsCollection . new ( @name ) . load_from_configuration
62- options [ :metadata ] = load_metadata_from_configuration
63- options [ :resettable ] = exp_config [ :resettable ]
64- options [ :algorithm ] = exp_config [ :algorithm ]
58+ alts [ 0 ] . map! { |k , v | { k => v } }
6559 end
6660 end
6761
6862 options [ :alternatives ] = alts
6963
64+ if alts . empty? && @config_storage . exists?
65+ options . merge! ( @config_storage . load )
66+ end
67+
7068 set_alternatives_and_options ( options )
7169
7270 # calculate probability that each alternative is the winner
@@ -85,8 +83,12 @@ def save
8583 persist_experiment_configuration
8684 end
8785
88- redis . hmset ( experiment_config_key , :resettable , resettable . to_s ,
89- :algorithm , algorithm . to_s )
86+ stored_data = @redis_storage . load
87+ if stored_data [ :resettable ] != resettable . to_s ||
88+ stored_data [ :algorithm ] != algorithm . to_s
89+ redis . hmset ( experiment_config_key , :resettable , resettable . to_s ,
90+ :algorithm , algorithm . to_s )
91+ end
9092 self
9193 end
9294
@@ -99,7 +101,7 @@ def validate!
99101 end
100102
101103 def new_record?
102- ExperimentCatalog . find ( name ) . nil ?
104+ ! @redis_storage . exists ?
103105 end
104106
105107 def ==( obj )
@@ -173,7 +175,7 @@ def start
173175 end
174176
175177 def start_time
176- Split . cache ( :experiment_start_times , @name ) do
178+ @start_time ||= Split . cache ( :experiment_start_times , @name ) do
177179 t = redis . hget ( :experiment_start_times , @name )
178180 if t
179181 # Check if stored time is an integer
@@ -257,17 +259,7 @@ def delete_metadata
257259 end
258260
259261 def load_from_redis
260- exp_config = redis . hgetall ( experiment_config_key )
261-
262- options = {
263- resettable : exp_config [ "resettable" ] ,
264- algorithm : exp_config [ "algorithm" ] ,
265- alternatives : load_alternatives_from_redis ,
266- goals : Split ::GoalsCollection . new ( @name ) . load_from_redis ,
267- metadata : load_metadata_from_redis
268- }
269-
270- set_alternatives_and_options ( options )
262+ set_alternatives_and_options ( @redis_storage . load )
271263 end
272264
273265 def can_calculate_winning_alternatives?
@@ -430,37 +422,6 @@ def experiment_config_key
430422 "experiment_configurations/#{ @name } "
431423 end
432424
433- def load_metadata_from_configuration
434- Split . configuration . experiment_for ( @name ) [ :metadata ]
435- end
436-
437- def load_metadata_from_redis
438- meta = redis . get ( metadata_key )
439- JSON . parse ( meta ) unless meta . nil?
440- end
441-
442- def load_alternatives_from_configuration
443- alts = Split . configuration . experiment_for ( @name ) [ :alternatives ]
444- raise ArgumentError , "Experiment configuration is missing :alternatives array" unless alts
445- if alts . is_a? ( Hash )
446- alts . keys
447- else
448- alts . flatten
449- end
450- end
451-
452- def load_alternatives_from_redis
453- alternatives = redis . lrange ( @name , 0 , -1 )
454- alternatives . map do |alt |
455- alt = begin
456- JSON . parse ( alt )
457- rescue
458- alt
459- end
460- Split ::Alternative . new ( alt , @name )
461- end
462- end
463-
464425 private
465426 def redis
466427 Split . redis
@@ -490,11 +451,11 @@ def remove_experiment_configuration
490451 end
491452
492453 def experiment_configuration_has_changed?
493- existing_experiment = Experiment . find ( @name )
454+ stored_data = @redis_storage . load
494455
495- existing_experiment . alternatives . map ( &:to_s ) != @alternatives . map ( &:to_s ) ||
496- existing_experiment . goals != @goals ||
497- existing_experiment . metadata != @metadata
456+ stored_data [ : alternatives] . map ( &:to_s ) != @alternatives . map ( &:to_s ) ||
457+ stored_data [ : goals] != @goals ||
458+ stored_data [ : metadata] != @metadata
498459 end
499460
500461 def goals_collection
0 commit comments