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 =
'_'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(h) ⇒ FlowExpressionId

Returns a new instance of FlowExpressionId.



68
69
70
71
72
73
74
75
76
77
# File 'lib/ruote/fei.rb', line 68

def initialize(h)

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

  sub_wfid = @h.delete('sub_wfid')
  @h['subid'] ||= sub_wfid
    #
    # TODO : for 2.2.2, remove those two lines
end

Instance Attribute Details

#hObject (readonly)

Returns the value of attribute h.



66
67
68
# File 'lib/ruote/fei.rb', line 66

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.



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

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)


181
182
183
184
185
186
187
188
189
190
# File 'lib/ruote/fei.rb', line 181

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



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

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)


205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# File 'lib/ruote/fei.rb', line 205

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.



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

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

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

.to_storage_id(hfei) ⇒ Object



107
108
109
110
111
112
113
114
115
116
# File 'lib/ruote/fei.rb', line 107

def self.to_storage_id(hfei)

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

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

Instance Method Details

#<=>(other) ⇒ Object

For proper hashing and sorting.



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

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.



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

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’.



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

def child_id

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

#engine_idObject



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

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

#expidObject



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

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

#hashObject

For proper hashing and sorting.



142
143
144
145
# File 'lib/ruote/fei.rb', line 142

def hash

  to_storage_id.hash
end

#mnemo_idObject

Returns a rufus-mnemo version of the first 9 hexdigits in the subid.



135
136
137
138
# File 'lib/ruote/fei.rb', line 135

def mnemo_id

  Rufus::Mnemo.from_i(@h['subid'][0, 9].to_i(16))
end

#short_sidObject

expid!subid[0, 5]!wfid



95
96
97
98
# File 'lib/ruote/fei.rb', line 95

def short_sid

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

#sidObject



91
92
93
94
# File 'lib/ruote/fei.rb', line 91

def to_storage_id

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

#subidObject Also known as: sub_wfid



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

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

#to_hObject



173
174
175
176
# File 'lib/ruote/fei.rb', line 173

def to_h

  @h
end

#to_sortable_idObject

wfid!!expid



102
103
104
105
# File 'lib/ruote/fei.rb', line 102

def to_sortable_id

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

#to_storage_idObject



86
87
88
89
# File 'lib/ruote/fei.rb', line 86

def to_storage_id

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

#wfidObject



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

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