lib/embulk/input/jira/issue.rb in embulk-input-jira-0.0.3 vs lib/embulk/input/jira/issue.rb in embulk-input-jira-0.0.4

- old
+ new

@@ -18,49 +18,115 @@ return id when "key" return key end - chunk = fields - attribute.split('.').each do |key| - chunk = chunk[key] - return chunk if chunk.nil? - end + attribute_keys = attribute.split('.') - if chunk.is_a?(Array) || chunk.is_a?(Hash) - chunk.to_json.to_s - else - chunk - end + fetch(fields, attribute_keys) end def to_record - record = {} + @record = {} - record["id"] = id - record["key"] = key + @record["id"] = id + @record["key"] = key - fields.each_pair do |key, value| - record_key = key - record_value = value.to_json.to_s + generate_record(fields, "") - case value - when String - record_value = value + @record + end + + private + + def fetch(fields, keys) + return fields if fields.nil? || (fields.is_a?(Array) && fields.empty?) + + if keys.empty? + case fields + when Array + values = fields.map do |field| + if field.is_a?(String) + field.to_s + else + field.to_json + end + end + + return values.join(",") when Hash - if value.keys.include?("name") - record_key += ".name" - record_value = value["name"] - elsif value.keys.include?("id") - record_key += ".id" - record_value = value["id"] + return fields.to_json + else + return fields + end + end + + target_key = keys.shift + if fields.is_a?(Array) + values = fields.map do |field| + if field.is_a?(Hash) + field[target_key] + else + field.to_json end end - record[record_key] = record_value + fetch(values, keys) + else + fetch(fields[target_key], keys) end + end - record + def generate_record(value, prefix_key) + case value + when Hash + # NOTE: If you want to flatten JSON completely, please + # remove this if...end and #add_heuristic_value. + if prefix_key.count(".") > 1 + add_heuristic_value(value, prefix_key) + return + end + + value.each_pair do |_key, _value| + generate_record(_value, record_key(prefix_key, _key)) + end + when Array + if value.empty? || value.any? {|v| !v.is_a?(Hash) } + @record[prefix_key] = "\"#{value.map(&:to_s).join(',')}\"" + return + end + + # gathering values from each Hash + keys = value.map(&:keys).inject([]) {|sum, key| sum + key }.uniq + values = value.inject({}) do |sum, elem| + keys.each {|key| sum[key] = (sum[key] || []) << elem[key] } + sum + end + + generate_record(values, prefix_key) + else + @record[prefix_key] = value + end + end + + def record_key(prefix, key) + return key if prefix.empty? + + "#{prefix}.#{key}" + end + + def add_heuristic_value(hash, prefix_key) + heuristic_values = hash.select do |key, value| + ["name", "key", "id"].include?(key) && !value.nil? + end + + if heuristic_values.empty? + @record[prefix_key] = hash.to_json + else + heuristic_values.each do |key, value| + @record[record_key(prefix_key, key)] = value + end + end end end end end end