Parent

Included Modules

Class/Module Index [+]

Quicksearch

Ruote::Exp::ConcurrentIteratorExpression

This expression is a cross between 'concurrence' and 'iterator'.

pdef = Ruote.process_definition :name => 'test' do
  concurrent_iterator :on_val => 'alice, bob, charly', :to_var => 'v' do
    participant '${v:v}'
  end
end

will be equivalent to

pdef = Ruote.process_definition :name => 'test' do
  concurrence do
    participant 'alice'
    participant 'bob'
    participant 'charly'
  end
end

The 'on' and the 'to' attributes follow exactly the ones for the iterator expression.

When there is no 'to', the current iterated value is placed in the variable named 'i'.

The variable named 'ii' contains the current iterated index (an int bigger or egal to 0).

'concurrent_iterator' does not understand commands like rewind/break/jump/... like 'iterator' does, since it fires all its branches when applied.

:times and :branches

Similarly to the iterator expression, the :times or the :branches attribute may be used in stead of the 'on' attribute.

pdef = Ruote.process_definition :name => 'test' do
  concurrent_iterator :times => 3 do
    participant 'user${v:i}'
  end
end

is equivalent to

pdef = Ruote.process_definition :name => 'test' do
  concurrence do
    participant 'user0'
    participant 'user1'
    participant 'user2'
  end
end

options

the concurrent_iterator accepts the same options for merging as its bigger brother, the concurrence expression.

:count, :merge (override, mix, isolate), remaining (cancel, forget) and :over.

add branches

The 'add_branches'/'add_branch' expression can be used to add branches to a concurrent-iterator while it is running.

concurrent_iterator :on => 'a, b, c' do
  sequence do
    participant :ref => 'worker_${v:i}'
    add_branches 'd, e', :if => '${v:/not_sufficient}'
  end
end

In this example, if the process level variable 'not_sufficient' is set to true, workers d and e will be added to the iterated elements.

Read more at the 'add_branches' expression description.

Constants

ADD_BRANCHES_FIELD

Public Instance Methods

add_branches(list) click to toggle source
# File lib/ruote/exp/fe_concurrent_iterator.rb, line 128
def add_branches (list)

  if h.times_iterator && list.size == 1

    count = (list.first.to_i rescue nil)

    list = (h.list_size + 1..h.list_size + count) if count
  end

  list.each do |val|

    h.list_size += 1

    workitem = Ruote.fulldup(h.applied_workitem)

    variables = { 'ii' => h.list_size - 1 }

    if h.to_v
      variables[h.to_v] = val
    else #if to_f
      workitem['fields'][h.to_f] = val
    end

    launch_sub(
      "#{h.fei['expid']}_0",
      tree_children[0],
      :workitem => workitem,
      :variables => variables)
  end
end
register_child(fei) click to toggle source

Overrides FlowExpression#register_child to make sure that persist is not called.

# File lib/ruote/exp/fe_concurrent_iterator.rb, line 123
def register_child (fei)

  h.children << fei
end
reply(workitem) click to toggle source
# File lib/ruote/exp/fe_concurrent_iterator.rb, line 159
def reply (workitem)

  if ab = workitem['fields'].delete(ADD_BRANCHES_FIELD)

    add_branches(ab)

    if h.fei['wfid'] != workitem['fei']['wfid'] ||
       ( ! workitem['fei']['expid'].match(/^#{h.fei['expid']}_\d+$/))

      do_persist
      return
    end
  end

  super(workitem)
end

Protected Instance Methods

apply_children() click to toggle source
# File lib/ruote/exp/fe_concurrent_iterator.rb, line 178
def apply_children

  return reply_to_parent(h.applied_workitem) unless tree_children[0]

  list = determine_list

  return reply_to_parent(h.applied_workitem) if list.empty?

  h.to_v, h.to_f = determine_tos
  h.to_v = 'i' if h.to_v.nil? && h.to_f.nil?

  h.list_size = 0

  add_branches(list)

  persist_or_raise
end
expected_count() click to toggle source

Overrides the implementation found in ConcurrenceExpression

# File lib/ruote/exp/fe_concurrent_iterator.rb, line 198
def expected_count

  h.ccount ? [ h.ccount, h.list_size ].min : h.list_size
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.