autonumber

actor 利用者
boundary EvaluationView
participant ActionCable
control ApplicationController
control EvaluationsController
entity Evaluation
participant EvaluationJob
participant ModelUtil
entity Analysis
participant NetkeibaClient
participant File
participant YAML
participant FeatureUtil
entity "Denebola::Race"
entity "Denebola::Feature"
entity "Evaluation::Race"
entity "Evaluation::Race::TestDatum"

利用者 -> EvaluationView : 実行ボタン押下

activate EvaluationView
  EvaluationView -> EvaluationsController : execute

  activate EvaluationsController
    EvaluationsController -> ApplicationController : remove_old_files
    EvaluationsController -> ApplicationController : check_schema
    EvaluationsController -> EvaluationsController : check_invalid_param

    create Evaluation
    EvaluationsController -> Evaluation : new
    EvaluationsController -> Evaluation : save
    EvaluationsController -> File : write

    opt ファイル or テキストを選択した場合
      EvaluationsController -> File : puts
    end

    EvaluationsController ->> EvaluationJob : perform_later
    activate EvaluationJob

    autonumber stop
    EvaluationView <-- EvaluationsController
  deactivate EvaluationsController

  利用者 <-- EvaluationView
deactivate EvaluationView

autonumber resume
EvaluationJob -> Evaluation : start!

activate Evaluation
  Evaluation -> ActionCable : broadcast

  activate ActionCable
    autonumber stop
    EvaluationView <<- ActionCable : メッセージ送信
    Evaluation <-- ActionCable
  deactivate ActionCable

  EvaluationJob <-- Evaluation
deactivate Evaluation

autonumber resume
EvaluationJob -> ModelUtil : unzip_model
EvaluationJob -> Evaluation : set_analysis!

activate Evaluation
  Evaluation -> ModelUtil : read_analysis_id
  Evaluation -> Analysis : find_by
  Evaluation -> Evaluation : update!
deactivate Evaluation

EvaluationJob -> Evaluation : fetch_data!

activate Evaluation
  alt ランダムを選択
    Evaluation -> Evaluation : sample_race_ids
  else Top20 を選択
    create NetkeibaClient
    Evaluation -> NetkeibaClient : new
    Evaluation -> NetkeibaClient : http_get_race_top
  else
    Evaluation -> File : read
  end

  loop レースIDごとに繰り返し
    Evaluation -> "Denebola::Race" : find_by
    Evaluation -> "Denebola::Feature" : find_by

    create "Evaluation::Race"
    Evaluation -> "Evaluation::Race" : create!
  end
deactivate Evaluation

loop 評価レースごとに繰り返し
  EvaluationJob -> FeatureUtil : create_feature_from_denebola

  activate FeatureUtil
    FeatureUtil -> "Denebola::Feature" : where
  deactivate FeatureUtil

  EvaluationJob -> YAML : dump
  EvaluationJob -> EvaluationJob : execute_script
  EvaluationJob -> "Evaluation::Race" : import_prediction_results!

  activate "Evaluation::Race"
    "Evaluation::Race" -> YAML : load_file

    loop レースのエントリーの数だけ繰り返す
      create "Evaluation::Race::TestDatum"
      "Evaluation::Race" -> "Evaluation::Race::TestDatum" : create!
    end
  deactivate "Evaluation::Race"

  EvaluationJob -> Evaluation : calculate!

  activate Evaluation
    Evaluation -> ActionCable : broadcast

    activate ActionCable
      autonumber stop
      EvaluationView <<- ActionCable : メッセージ送信
      Evaluation <-- ActionCable
    deactivate ActionCable

    EvaluationJob <-- Evaluation
  deactivate Evaluation
end

autonumber resume
EvaluationJob -> Evaluation : output_race_ids

activate Evaluation
  alt Top20またはランダムを選択
    Evaluation -> "Evaluation::Race" -> pluck
    Evaluation -> File : open
  end
deactivate Evaluation

EvaluationJob -> Evaluation : complete!

activate Evaluation
  Evaluation -> ActionCable : broadcast

  activate ActionCable
    autonumber stop
    EvaluationView <<- ActionCable : メッセージ送信
    Evaluation <-- ActionCable
  deactivate ActionCable

  EvaluationJob <-- Evaluation
deactivate Evaluation
deactivate EvaluationJob
