File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -55,10 +55,17 @@ def cleanup_old_versions!(experiment)
5555 end
5656
5757 def active_experiments
58+ experiments_by_key = keys_without_finished ( user . keys ) . each_with_object ( { } ) do |key , memo |
59+ memo [ key ] = Metric . possible_experiments ( key_without_version ( key ) )
60+ end
61+
62+ names = experiments_by_key . values . flatten . map ( &:name ) . uniq
63+ winners = names . empty? ? { } : names . zip ( Split . redis . hmget ( :experiment_winner , *names ) ) . to_h
64+
5865 experiment_pairs = { }
59- keys_without_finished ( user . keys ) . each do |key |
60- Metric . possible_experiments ( key_without_version ( key ) ) . each do |experiment |
61- if ! experiment . has_winner?
66+ experiments_by_key . each do |key , experiments |
67+ experiments . each do |experiment |
68+ unless winners [ experiment . name ]
6269 experiment_pairs [ key_without_version ( key ) ] = user [ key ]
6370 end
6471 end
Original file line number Diff line number Diff line change 118118 end
119119 end
120120
121+ context "#active_experiments" do
122+ let ( :user_keys ) { { "with_winner" => "red" , "active" => "red" } }
123+
124+ before do
125+ with_winner = Split ::ExperimentCatalog . find_or_create ( "with_winner" , "red" , "blue" )
126+ with_winner . start
127+ with_winner . winner = "red"
128+
129+ Split ::ExperimentCatalog . find_or_create ( "active" , "red" , "blue" ) . start
130+ end
131+
132+ it "excludes experiments that already have a winner" do
133+ expect ( @subject . active_experiments ) . to eq ( "active" => "red" )
134+ end
135+
136+ it "fetches every experiment's winner in a single call" do
137+ expect ( Split . redis ) . to receive ( :hmget ) . with ( :experiment_winner , any_args ) . once . and_call_original
138+ @subject . active_experiments
139+ end
140+ end
141+
121142 context "allows user to be loaded from adapter" do
122143 it "loads user from adapter (RedisAdapter)" do
123144 user = Split ::Persistence ::RedisAdapter . new ( nil , 112233 )
You can’t perform that action at this time.
0 commit comments