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
-
#merge_workitem(index, target, source, merge_type) ⇒ Object
Merge workitem ‘source’ into workitem ‘target’.
-
#merge_workitems(workitems, merge_type) ⇒ Object
Given a list of workitems and a merge_type, will merge according to the merge type.
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'] = 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 |