Gathering methods for merging workitems.
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)
The ‘concat’ type merge 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.
# File lib/ruote/exp/merge.rb, line 63 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' 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) tv.merge!(sv) else target['fields'][k] = sv end end end target end end
Given a list of workitems and a merge_type, will merge according to the merge type.
The return value is the merged workitem.
# 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
Generated with the Darkfish Rdoc Generator 2.