Class: Ruote::FlowExpressionId

Inherits:
Object
  • Object
show all
Defined in:
lib/ruote/fei.rb

Overview

The FlowExpressionId (fei for short) is an process expression identifier. Each expression when instantiated gets a unique fei.

Feis are also used in workitems, where the fei is the fei of the

participant

expression that emitted the workitem.

Feis can thus indicate the position of a workitem in a process tree.

Feis contain four pieces of information :

  • wfid : workflow instance id, the identifier for the process instance

  • subid : a unique identifier for expressions (useful in loops)

  • expid : the expression id, where in the process tree

  • engine_id : only relevant in multi engine scenarii (defaults to ‘engine’)

Constant Summary collapse

CHILD_SEP =
'_'
SUBS =
%w[ subid sub_wfid ]
IDS =
%w[ engine_id expid wfid ]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(h) ⇒ FlowExpressionId

Returns a new instance of FlowExpressionId.



111
112
113
114
115
116
117
118
# File 'lib/ruote/fei.rb', line 111

def initialize(h)

  @h = h
  class << h; include Ruote::HashDot; end

  @h['subid'] = @h.delete('sub_wfid') if @h['sub_wfid']
    # TODO : for 2.1.13, remove this
end

Instance Attribute Details

#hObject (readonly)

Returns the value of attribute h.



109
110
111
# File 'lib/ruote/fei.rb', line 109

def h
  @h
end

Class Method Details

.child_id(h) ⇒ Object

Returns child_id… For an expid of ‘0_1_4’, this will be 4.



196
197
198
199
# File 'lib/ruote/fei.rb', line 196

def self.child_id(h)

  h['expid'].split(CHILD_SEP).last.to_i
end

.direct_child?(parent_fei, other_fei) ⇒ Boolean

Returns true if other_fei is the fei of a child expression of parent_fei.

Returns:

  • (Boolean)


209
210
211
212
213
214
215
216
217
218
# File 'lib/ruote/fei.rb', line 209

def self.direct_child?(parent_fei, other_fei)

  %w[ wfid engine_id ].each do |k|
    return false if parent_fei[k] != other_fei[k]
  end

  pei = other_fei['expid'].split(CHILD_SEP)[0..-2].join(CHILD_SEP)

  (pei == parent_fei['expid'])
end

.extract(arg) ⇒ Object

Attempts at extracting a FlowExpressionId from the given argument (workitem, string, …)

Uses .extract_h



225
226
227
228
# File 'lib/ruote/fei.rb', line 225

def self.extract(arg)

  FlowExpressionId.new(extract_h(arg))
end

.extract_h(arg) ⇒ Object

Attempts at extracting a FlowExpressionId (as a Hash instance) from the given argument (workitem, string, …)

Raises:

  • (ArgumentError)


233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'lib/ruote/fei.rb', line 233

def self.extract_h(arg)

  if arg.is_a?(Hash)
    return arg if arg['expid']
    return arg['fei'] if arg['fei']
  end

  return extract_h(arg.fei) if arg.respond_to?(:fei)
  return arg.h if arg.is_a?(Ruote::FlowExpressionId)
  return arg.h['fei'] if arg.is_a?(Ruote::Workitem)

  if arg.is_a?(String)

    ss = arg.split('!')

    return {
      'engine_id' => ss[-4] || 'engine',
      'expid' => ss[-3],
      'subid' => ss[-2],
      'wfid' => ss[-1] }
  end

  raise ArgumentError.new(
    "couldn't extract fei out of instance of #{arg.class}")
end

.from_id(s, engine_id = 'engine') ⇒ Object

Turns the result of to_storage_id back to a FlowExpressionId instance.



149
150
151
152
# File 'lib/ruote/fei.rb', line 149

def self.from_id(s, engine_id='engine')

  extract("#{engine_id}!#{s}")
end

.is_a_fei?(h) ⇒ Boolean

Returns true if the h is a representation of a FlowExpressionId instance.

Returns:

  • (Boolean)


189
190
191
192
# File 'lib/ruote/fei.rb', line 189

def self.is_a_fei?(h)

  h.respond_to?(:keys) && (h.keys - SUBS).sort == IDS
end

.to_storage_id(hfei) ⇒ Object



138
139
140
141
142
143
144
145
# File 'lib/ruote/fei.rb', line 138

def self.to_storage_id(hfei)

  hfei.respond_to?(:to_storage_id) ?
    hfei.to_storage_id :
    "#{hfei['expid']}!#{hfei['subid'] || hfei['sub_wfid']}!#{hfei['wfid']}"

  # TODO : for 2.1.13, remove the subid || sub_wfid trick
end

Instance Method Details

#<=>(other) ⇒ Object



167
168
169
170
# File 'lib/ruote/fei.rb', line 167

def <=>(other)

  self.to_sortable_id <=> other.to_sortable_id
end

#==(other) ⇒ Object Also known as: eql?

Returns true if the other is a FlowExpressionId instance and it points to the same expression as this one.



175
176
177
178
179
180
# File 'lib/ruote/fei.rb', line 175

def ==(other)

  return false unless other.is_a?(Ruote::FlowExpressionId)

  (hash == other.hash)
end

#child_idObject

Returns the last number in the expid. For instance, if the expid is ‘0_5_7’, the child_id will be ‘7’.



157
158
159
160
# File 'lib/ruote/fei.rb', line 157

def child_id

  h.expid.split(CHILD_SEP).last.to_i
end

#engine_idObject



122
# File 'lib/ruote/fei.rb', line 122

def engine_id; @h['engine_id']; end

#expidObject



120
# File 'lib/ruote/fei.rb', line 120

def expid; @h['expid']; end

#hashObject



162
163
164
165
# File 'lib/ruote/fei.rb', line 162

def hash

  to_storage_id.hash
end

#sidObject



131
132
133
134
# File 'lib/ruote/fei.rb', line 131

def to_storage_id

  "#{@h['expid']}!#{@h['subid']}!#{@h['wfid']}"
end

#subidObject Also known as: sub_wfid



123
# File 'lib/ruote/fei.rb', line 123

def subid; @h['subid']; end

#to_hObject



201
202
203
204
# File 'lib/ruote/fei.rb', line 201

def to_h

  @h
end

#to_sortable_idObject



133
134
135
136
# File 'lib/ruote/fei.rb', line 133

def to_sortable_id

  "#{@h['wfid']}!!#{@h['expid']}"
end

#to_storage_idObject



127
128
129
130
# File 'lib/ruote/fei.rb', line 127

def to_storage_id

  "#{@h['expid']}!#{@h['subid']}!#{@h['wfid']}"
end

#wfidObject



121
# File 'lib/ruote/fei.rb', line 121

def wfid; @h['wfid']; end