Module: Ruote::Exp::MergeMixin

Included in:
ConcurrenceExpression, RestoreExpression
Defined in:
lib/ruote/exp/merge.rb

Overview

Gathering methods for merging workitems.

Instance Method Summary collapse

Instance Method Details

#merge_workitem(index, target, source, merge_type) ⇒ Object

Merge workitem ‘source’ into workitem ‘target’.

If type is ‘override’, the source will prevail and be returned.

If type is ‘mix’, the source fields will be merge into the target fields.

If type is ‘isolate’, the source fields will be placed in a separte field in the target workitem. The name of this field is the child_id of the source workitem (a string from ‘0’ to ‘99999’ and beyond)



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/ruote/exp/merge.rb', line 57

def merge_workitem(index, target, source, merge_type)

  return source if merge_type == 'override'

  if target == nil

    case merge_type

      #when 'mix'
         # do nothing

      when 'stack'
        source['fields'] = { 'stack' => [ source['fields'] ] }

      when 'isolate'
        source['fields'] = { index.to_s => source['fields'] }

      #when 'union'
         # do nothing
    end

    source

  else

    case merge_type

      when 'mix'

        target['fields'].merge!(source['fields'])

      when 'stack'

        target['fields']['stack'] << source['fields']
        target['fields']['stack_attributes'] = expand_atts

      when 'isolate'

        target['fields'][index.to_s] = source['fields']

      when 'union'

        source['fields'].each do |k, sv|

          tv = target['fields'][k]

          if sv.is_a?(Array) and tv.is_a?(Array)
            tv.concat(sv)
          elsif sv.is_a?(Hash) and tv.is_a?(Hash)
            tv.merge!(sv)
          else
            target['fields'][k] = sv
          end
        end
    end

    target
  end
end

#merge_workitems(workitems, merge_type) ⇒ Object

Given a list of workitems and a merge_type, will merge according to the merge type.

The return value is the merged workitem.



38
39
40
41
42
43
44
45
# File 'lib/ruote/exp/merge.rb', line 38

def merge_workitems(workitems, merge_type)

  rworkitems = workitems.reverse

  workitems.inject(nil) do |t, wi|
    merge_workitem(workitems.index(wi), t, wi, merge_type)
  end
end