Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions lib/split/dashboard/views/_experiment.erb
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
<% experiment_class = "experiment" %>
<% end %>

<% unless experiment.calc_time == Time.now.day %>
<% experiment.estimate_winning_alternative %>
<% end %>
<% experiment.calc_winning_alternatives %>

<div class="<%= experiment_class %>">
<div class="experiment-header">
Expand Down
23 changes: 14 additions & 9 deletions lib/split/experiment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -274,17 +274,22 @@ def load_from_redis
end

def calc_winning_alternatives
if goals.empty?
self.estimate_winning_alternative
else
goals.each do |goal|
self.estimate_winning_alternative(goal)
# Super simple cache so that we only recalculate winning alternatives once per day
days_since_epoch = Time.now.utc.to_i / 86400

if self.calc_time != days_since_epoch
if goals.empty?
self.estimate_winning_alternative
else
goals.each do |goal|
self.estimate_winning_alternative(goal)
end
end
end

calc_time = Time.now.day
self.calc_time = days_since_epoch

self.save
self.save
end
end

def estimate_winning_alternative(goal = nil)
Expand Down Expand Up @@ -390,7 +395,7 @@ def calc_time=(time)
end

def calc_time
Split.redis.hget(experiment_config_key, :calc_time)
Split.redis.hget(experiment_config_key, :calc_time).to_i
end

def jstring(goal = nil)
Expand Down
7 changes: 7 additions & 0 deletions spec/experiment_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,13 @@ def same_but_different_goals
p_goal2 = alt.p_winner(goal2)
expect(p_goal1).not_to be_within(0.04).of(p_goal2)
end

it "should return nil and not re-calculate probabilities if they have already been calculated today" do
experiment = Split::ExperimentCatalog.find_or_create({'link_color3' => ["purchase", "refund"]}, 'blue', 'red', 'green')
experiment_calc_time = Time.now.utc.to_i / 86400
experiment.calc_time = experiment_calc_time
expect(experiment.calc_winning_alternatives).to be nil
end
end

end