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
48 changes: 34 additions & 14 deletions lib/split/experiment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -176,19 +176,29 @@ def start
end

def start_time
@start_time ||= Split.cache(:experiment_start_times, @name) do
t = redis.hget(:experiment_start_times, @name)
if t
# Check if stored time is an integer
if t =~ /^[-+]?[0-9]+$/
Time.at(t.to_i)
else
Time.parse(t)
end
end
return @start_time if defined?(@start_time)

@start_time = Split.cache(:experiment_start_times, @name) do
parse_start_time(redis.hget(:experiment_start_times, @name))
end
end

def prefetch_trial_state!
winner_name, raw_start_time, raw_version, raw_cohorting =
redis.pipelined do |pipe|
pipe.hget(:experiment_winner, name)
pipe.hget(:experiment_start_times, @name)
pipe.get("#{name}:version")
pipe.hget(experiment_config_key, :cohorting)
end

@has_winner = !winner_name.nil?
@start_time = parse_start_time(raw_start_time)
@version = raw_version.to_i
@cohorting_disabled = raw_cohorting.nil? ? false : raw_cohorting.downcase == "true"
self
end

def next_alternative
winner || random_alternative
end
Expand Down Expand Up @@ -402,10 +412,9 @@ def jstring(goal = nil)
end

def cohorting_disabled?
@cohorting_disabled ||= begin
value = redis.hget(experiment_config_key, :cohorting)
value.nil? ? false : value.downcase == "true"
end
return @cohorting_disabled if defined?(@cohorting_disabled)
value = redis.hget(experiment_config_key, :cohorting)
@cohorting_disabled = value.nil? ? false : value.downcase == "true"
end

def disable_cohorting
Expand All @@ -424,6 +433,17 @@ def experiment_config_key
end

private
def parse_start_time(t)
return if t.nil?

# Check if stored time is an integer
if t =~ /^[-+]?[0-9]+$/
Time.at(t.to_i)
else
Time.parse(t)
end
end

def redis
Split.redis
end
Expand Down
2 changes: 2 additions & 0 deletions lib/split/trial.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ def choose!(context = nil)
# Only run the process once
return alternative if @alternative_chosen

@experiment.prefetch_trial_state!

new_participant = @user[@experiment.key].nil?
if override_is_alternative?
self.alternative = @options[:override]
Expand Down
Loading