def self.merge_workitem(index, target, source, merge_type)
if merge_type == 'override'
return source
end
if target == nil
case merge_type
when 'stack'
source['fields'] = { 'stack' => [ source['fields'] ] }
when 'isolate'
source['fields'] = { (index || 0).to_s => source['fields'] }
end
return source
end
case merge_type
when 'mix'
target['fields'].merge!(source['fields'])
when 'stack'
target['fields']['stack'] << source['fields']
when 'isolate'
index ||= target['fields'].keys.select { |k| k.match(/^\d+$/) }.size
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