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
5 changes: 3 additions & 2 deletions lib/split/experiment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ class Experiment

def self.find(name)
Split.cache(:experiments, name) do
return unless Split.redis.exists?(name)
Experiment.new(name).tap { |exp| exp.load_from_redis }
experiment = Experiment.new(name)
experiment.load_from_redis
experiment unless experiment.alternatives.empty?
end
end

Expand Down
54 changes: 33 additions & 21 deletions lib/split/experiment_storage.rb
Original file line number Diff line number Diff line change
Expand Up @@ -80,29 +80,22 @@ def exists?
redis.exists?(@name)
end

def load_alternatives
alternatives = redis.lrange(@name, 0, -1)
alternatives.map do |alt|
alt = begin
JSON.parse(alt)
rescue
alt
end
Split::Alternative.new(alt, @name)
def load!
raw_config, raw_alternatives, raw_metadata, raw_goals = redis.pipelined do |pipe|
pipe.hgetall(experiment_config_key)
pipe.lrange(@name, 0, -1)
pipe.get(metadata_key)
pipe.lrange(goals_key, 0, -1)
end
end

def load_metadata
meta = redis.get(metadata_key)
JSON.parse(meta) unless meta.nil?
end

def load_goals
Split::GoalsCollection.new(@name).load_from_redis
end
config = raw_config.transform_keys(&:to_sym)

def load_experiment
redis.hgetall(experiment_config_key).transform_keys(&:to_sym)
{
resettable: config[:resettable],
algorithm: config[:algorithm],
alternatives: build_alternatives(raw_alternatives),
goals: raw_goals,
metadata: parse_metadata(raw_metadata)
}
end

def experiment_config_key
Expand All @@ -113,10 +106,29 @@ def metadata_key
"#{name}:metadata"
end

def goals_key
"#{name}:goals"
end

private
def redis
Split.redis
end

def build_alternatives(raw_alternatives)
raw_alternatives.map do |alt|
alt = begin
JSON.parse(alt)
rescue
alt
end
Split::Alternative.new(alt, @name)
end
end

def parse_metadata(raw_metadata)
JSON.parse(raw_metadata) unless raw_metadata.nil?
end
end
end
end
Loading