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



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

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

.flatten_errors(vertex, dest = nil) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/tengine/job/vertex.rb', line 43

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



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

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



135
136
137
# File 'lib/tengine/job/vertex.rb', line 135

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

#actual_classObject



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

def actual_class; self.class; end

#ancestorsObject



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

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

#ancestors_until_expansionObject



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

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

#generate(klass = actual_class) ⇒ Object



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/tengine/job/vertex.rb', line 118

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



111
112
113
114
# File 'lib/tengine/job/vertex.rb', line 111

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



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

def generating_children; self.children; end

#generating_edgesObject



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

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

#next_edgesObject



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

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

#previous_edgesObject Also known as: prev_edges



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

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

#rootObject



88
89
90
# File 'lib/tengine/job/vertex.rb', line 88

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

#save!(*args) ⇒ Object



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

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

#update_attributes!(*args) ⇒ Object



71
72
73
# File 'lib/tengine/job/vertex.rb', line 71

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