class BenchmarkBatch < ActiveRecord::Base
has_many :benchmark_results, dependent: :destroy, inverse_of: :benchmark_batch
belongs_to :benchmark_configuration, inverse_of: :benchmark_batches
has_and_belongs_to_many :tags
validates_presence_of :performed_at
def self.archive_directory
File.join(Rails.root, "public", "uploads", "archive").tap do |archive_dir|
FileUtils.mkdir_p(archive_dir)
end
end
def self.for_dashboard
includes(benchmark_results: [ :benchmark_durations, :benchmark_info ]).last
end
def self.from_json(data)
batch = BenchmarkBatch.create!(
benchmark_configuration: BenchmarkConfiguration.from_json(data["configuration"]),
performed_at: DateTime.parse(data["timestamp"]),
archive_filename: archive_name_for_data(data))
data["outcomes"].each do |outcome|
bench_info = BenchmarkInfo.from_json(outcome["benchmark"])
result = BenchmarkResult.create!(
benchmark_info_id: bench_info.id,
benchmark_batch_id: batch.id
)
outcome["times"].each do |duration|
result.benchmark_durations.create!(duration: duration)
end
outcome["parameters"].each do | name, value|
result.benchmark_parameters.create!(name: name, value: value)
end
end
(data["tags"] || data["name"] || "default").split(",").each do | tag |
batch.tags.append(Tag.find_or_create_by(name: tag))
end
File.write(batch.archive_path, JSON.pretty_generate(data))
batch
end
def result_for(info_id)
benchmark_results.find_by(benchmark_info_id: info_id)
end
def all_benchmark_infos
benchmark_results.map(&:benchmark_info).flatten
end
# Returns full path to archive file
def archive_path
File.join(self.class.archive_directory, archive_filename)
end
def to_json
JSON.parse(IO.read(archive_path))
end
def performed_at_ensured
performed_at || Date.today
end
private
def self.archive_name_for_data(data)
timestamp = data["timestamp"]
name_or_tags = data["tags"] || data["name"] || "default"
nice_name_or_tags = name_or_tags.tr(",", "-")
language = data["configuration"]["language"]
os = data["configuration"]["os"]
runtime = data["configuration"]["runtime"]
archive_name = [ timestamp, nice_name_or_tags, language, os, runtime ].join("_")
"#{archive_name}.json".tr(" :/", "___")
end
end
# == Schema Information
#
# Table name: benchmark_batches
#
# id :integer not null, primary key
# performed_at :datetime
# archive_filename :text
# created_at :datetime
# updated_at :datetime
# configuration_id :integer
#