Class: Tengine::Job::Vertex

Inherits:
Object
  • Object
show all
Includes:
Mongoid::Document, Mongoid::Timestamps, NamePath, Signal::Transmittable
Defined in:
lib/tengine/job/vertex.rb

Overview

Edgeとともにジョブネットを構成するグラフの「頂点」を表すモデル 自身がツリー構造を

Direct Known Subclasses

End, Job, Junction, Start

Defined Under Namespace

Classes: AllVisitor, AllVisitorWithEdge, AnyVisitor, VertexValidations

Constant Summary collapse

IGNORED_FIELD_NAMES =
["_type", "_id"].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.create!(*args, &block) ⇒ Object



54
55
56
# File 'lib/tengine/job/vertex.rb', line 54

def create!(*args, &block)
  raise_flatten_errors{ super(*args, &block) }
end

.flatten_errors(vertex, dest = nil) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/tengine/job/vertex.rb', line 34

def flatten_errors(vertex, dest = nil)
  dest ||= []
  children_errors = vertex.errors.messages.delete(:children)
  edges_errors = vertex.errors.messages.delete(:edges)
  vertex.errors.full_messages.each{|msg| dest << "#{vertex.name_path} #{msg}"}
  vertex.children.each{|child| flatten_errors(child, dest)}
  if vertex.respond_to?(:edges)
    vertex.edges.each do|edge|
      edge.errors.full_messages.each{|msg| dest << "#{edge.name_for_message} #{msg}"}
    end
  end
  dest
end

.raise_flatten_errorsObject



48
49
50
51
52
# File 'lib/tengine/job/vertex.rb', line 48

def raise_flatten_errors
  yield if block_given?
rescue Mongoid::Errors::Validations => e
  raise VertexValidations, e.document
end

Instance Method Details

#accept_visitor(visitor) ⇒ Object



126
127
128
# File 'lib/tengine/job/vertex.rb', line 126

def accept_visitor(visitor)
  visitor.visit(self)
end

#actual_classObject



101
# File 'lib/tengine/job/vertex.rb', line 101

def actual_class; self.class; end

#ancestorsObject



83
84
85
86
87
88
89
# File 'lib/tengine/job/vertex.rb', line 83

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

#ancestors_until_expansionObject



91
92
93
94
95
96
97
# File 'lib/tengine/job/vertex.rb', line 91

def ancestors_until_expansion
  if (parent = self.parent) && !self.was_expansion?
    parent.ancestors_until_expansion + [parent]
  else
    []
  end
end

#generate(klass = actual_class) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/tengine/job/vertex.rb', line 109

def generate(klass = actual_class)
  result = klass.new(generating_attrs)
  src_to_generated = {}
  generating_children.each do |child|
    generated = child.generate
    src_to_generated[child.id] = generated.id
    result.children << generated
  end
  generating_edges.each do |edge|
    generated = edge.class.new
    generated.origin_id = src_to_generated[edge.origin_id]
    generated.destination_id = src_to_generated[edge.destination_id]
    result.edges << generated
  end
  result
end

#generating_attrsObject



102
103
104
105
# File 'lib/tengine/job/vertex.rb', line 102

def generating_attrs
  field_names = self.class.fields.keys - IGNORED_FIELD_NAMES
  field_names.inject({}){|d, name| d[name] = send(name); d }
end

#generating_childrenObject



106
# File 'lib/tengine/job/vertex.rb', line 106

def generating_children; self.children; end

#generating_edgesObject



107
# File 'lib/tengine/job/vertex.rb', line 107

def generating_edges; respond_to?(:edges) ? self.edges : []; end

#next_edgesObject



74
75
76
77
# File 'lib/tengine/job/vertex.rb', line 74

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

#previous_edgesObject Also known as: prev_edges



68
69
70
71
# File 'lib/tengine/job/vertex.rb', line 68

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

#rootObject



79
80
81
# File 'lib/tengine/job/vertex.rb', line 79

def root
  (parent = self.parent) ? parent.root : self
end

#save!(*args) ⇒ Object



59
60
61
# File 'lib/tengine/job/vertex.rb', line 59

def save!(*args)
  self.class.raise_flatten_errors{ super(*args) }
end

#update_attributes!(*args) ⇒ Object



62
63
64
# File 'lib/tengine/job/vertex.rb', line 62

def update_attributes!(*args)
  self.class.raise_flatten_errors{ super(*args) }
end