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 merged 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)

The ‘concat’ type merges hashes and concats arrays. The ‘union’ type behaves much like ‘concat’, but it makes sure to remove duplicates.

Warning: ‘union’ will remove duplicates that were present before the merge.



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
116
117
118
119
120
# File 'lib/ruote/exp/merge.rb', line 61

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', 'concat'
         # 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'] = compile_atts

      when 'isolate'

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

      when 'union', 'concat', 'deep'

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

          tv = target['fields'][k]

          if sv.is_a?(Array) and tv.is_a?(Array)
            tv.concat(sv)
            tv.uniq! if merge_type == 'union'
          elsif sv.is_a?(Hash) and tv.is_a?(Hash)
            merge_type == 'deep' ? deep_merge!(tv, sv) : 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
# File 'lib/ruote/exp/merge.rb', line 38

def merge_workitems(workitems, merge_type)

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