Class: FlowCore::Task

Inherits:
ApplicationRecord show all
Defined in:
app/models/flow_core/task.rb

Instance Method Summary collapse

Instance Method Details

#can_enable?Boolean

Returns:

  • (Boolean)


53
54
55
56
57
58
59
60
61
62
# File 'app/models/flow_core/task.rb', line 53

def can_enable?
  return false unless created?

  if input_free_tokens.size == transition.input_arcs.size
    return true
  end

  # Note: It's impossible of it create by a token and needs another token (AND join) to enable?
  same_origin_tasks.enabled.any?
end

#can_finish?Boolean

Returns:

  • (Boolean)


64
65
66
67
68
69
70
71
72
73
74
# File 'app/models/flow_core/task.rb', line 64

def can_finish?
  return false unless enabled?

  return false if errored? || suspended?

  if executable
    executable.finished?
  else
    true
  end
end

#can_terminate?Boolean

Returns:

  • (Boolean)


76
77
78
# File 'app/models/flow_core/task.rb', line 76

def can_terminate?
  created? || enabled?
end

#create_output_token!Object



170
171
172
173
174
175
176
177
# File 'app/models/flow_core/task.rb', line 170

def create_output_token!
  return if output_token_created

  transaction do
    transition.create_tokens_for_output(task: self)
    update! output_token_created: true
  end
end

#enableObject



80
81
82
83
84
85
86
87
88
89
90
91
# File 'app/models/flow_core/task.rb', line 80

def enable
  return false unless can_enable?

  transaction do
    input_free_tokens.each(&:lock!)
    update! stage: :enabled, enabled_at: Time.zone.now

    transition.on_task_enabled(self)
  end

  true
end

#enable!Object



124
125
126
# File 'app/models/flow_core/task.rb', line 124

def enable!
  enable || raise(FlowCore::InvalidTransition, "Can't enable Task##{id}")
end

#error!(error) ⇒ Object



136
137
138
139
140
141
142
143
# File 'app/models/flow_core/task.rb', line 136

def error!(error)
  transaction do
    update! errored_at: Time.zone.now, error_reason: error.message
    transition.on_task_errored(self, error)

    instance.error!
  end
end

#errored?Boolean

Returns:

  • (Boolean)


45
46
47
# File 'app/models/flow_core/task.rb', line 45

def errored?
  errored_at.present?
end

#finishObject



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'app/models/flow_core/task.rb', line 93

def finish
  return false unless can_finish?

  transaction do
    # terminate other racing tasks
    instance.tasks.enabled.where(created_by_token: created_by_token).find_each do |task|
      task.terminate! reason: "Same origin task #{id} finished"
    end

    input_locked_tokens.each { |token| token.consume! by: self }
    update! stage: :finished, finished_at: Time.zone.now

    transition.on_task_finished(self)
  end

  create_output_token!

  true
end

#finish!Object



128
129
130
# File 'app/models/flow_core/task.rb', line 128

def finish!
  finish || raise(FlowCore::InvalidTransition, "Can't finish Task##{id}")
end

#rescue!Object



145
146
147
148
149
150
151
152
153
154
# File 'app/models/flow_core/task.rb', line 145

def rescue!
  return unless errored?

  transaction do
    update! errored_at: nil, rescued_at: Time.zone.now
    transition.on_task_rescued(self)

    instance.rescue!
  end
end

#resume!Object



163
164
165
166
167
168
# File 'app/models/flow_core/task.rb', line 163

def resume!
  transaction do
    update! suspended_at: nil, resumed_at: Time.zone.now
    transition.on_task_resumed(self)
  end
end

#suspend!Object



156
157
158
159
160
161
# File 'app/models/flow_core/task.rb', line 156

def suspend!
  transaction do
    update! suspended_at: Time.zone.now
    transition.on_task_suspended(self)
  end
end

#suspended?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'app/models/flow_core/task.rb', line 49

def suspended?
  suspended_at.present?
end

#terminate(reason:) ⇒ Object



113
114
115
116
117
118
119
120
121
122
# File 'app/models/flow_core/task.rb', line 113

def terminate(reason:)
  return false unless can_terminate?

  transaction do
    update! stage: :terminated, terminated_at: Time.zone.now, terminate_reason: reason
    transition.on_task_terminated(self)
  end

  true
end

#terminate!(reason:) ⇒ Object



132
133
134
# File 'app/models/flow_core/task.rb', line 132

def terminate!(reason:)
  terminate(reason: reason) || raise(FlowCore::InvalidTransition, "Can't terminate Task##{id}")
end