web/app/models/benchmark_batch.rb
author Marcel Hlopko <marcel@hlopko.com>
Fri, 31 Oct 2014 17:50:24 +0100
changeset 249 d6e4f3690b6a
parent 235 99903c2acca1
child 300 7644dc89cdad
permissions -rw-r--r--
Fix imports page, change json archive path

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
#