Sha256: 9bbd74c53f6f0774e76f734efb865f877079ca95308d66339d3263ffd3701ac7

Contents?: true

Size: 1.69 KB

Versions: 3

Compression:

Stored size: 1.69 KB

Contents

# -*- coding: utf-8 -*-
require 'tengine/job/runtime'

# Edgeとともにジョブネットを構成するグラフの「頂点」を表すモデルです。
# このクラスだけでツリー構造を作ることができますが、ほぼ抽象クラスであり実際には
# 派生クラスのオブジェクトによってツリー構造が作られます。
class Tengine::Job::Runtime::Vertex
  include Mongoid::Document
  include Mongoid::Timestamps
  include Tengine::Job::Structure::NamePath
  include Tengine::Job::Structure::Tree
  include Tengine::Job::Structure::Visitor::Accepter
  include Tengine::Job::Runtime::Signal::Transmittable

  field :child_index, type: Integer

  # self.cyclic = true
  with_options(class_name: self.name, foreign_key: "parent_id") do |c|
    c.belongs_to :parent  , inverse_of: :children
    c.has_many   :children, inverse_of: :parent , validate: false, order: {child_index: 1}
  end

  def template?; false; end
  def runtime?; !template?; end

  def previous_edges
    return nil unless parent
    parent.edges.select{|edge| edge.destination_id == self.id}
  end
  alias_method :prev_edges, :previous_edges

  def next_edges
    return nil unless parent
    parent.edges.select{|edge| edge.origin_id == self.id}
  end

  def ancestors_until_expansion
    if parent = self.parent
      parent.ancestors_until_expansion + [parent]
    else
      []
    end
  end

  # Tengine::Job::Runtime::Vertexは構成されるツリーのルートを保存しても、embedでないので
  # 各vertexをsaveしないと保存されないため、明示的に保存しています。
  def save_descendants!
    accept_visitor(Tengine::Job::Structure::Visitor::All.new{|v| v.save! })
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
tengine_job-1.2.2 lib/tengine/job/runtime/vertex.rb
tengine_job-1.2.1 lib/tengine/job/runtime/vertex.rb
tengine_job-1.2.0 lib/tengine/job/runtime/vertex.rb