Module: Dataflow::Nodes::Mixin::RenameDottedFields

Included in:
SnapshotNode, UpsertNode
Defined in:
lib/dataflow/nodes/mixin/rename_dotted_fields.rb

Overview

Support tranversing the record and rename fields that contain a dot ‘.’.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

Add a mixin-specific field to the node



8
9
10
11
12
# File 'lib/dataflow/nodes/mixin/rename_dotted_fields.rb', line 8

def self.included(base)
  base.class_eval do
    field :rename_dotted_fields_in, type: Array
  end
end

Instance Method Details

#rename_dotted_fields(records:) ⇒ Object

Rename the specified dotted fields



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/dataflow/nodes/mixin/rename_dotted_fields.rb', line 15

def rename_dotted_fields(records:)
  return if rename_dotted_fields_in.blank?

  traverse_whole_record = rename_dotted_fields_in.include?('.')

  records.each do |record|
    if traverse_whole_record
      traverse_and_rename_dotted_fields(record)
    else
      rename_dotted_fields_in.each do |field|
        value = record[field]
        if value.is_a?(Array)
          traverse_and_rename_dotted_fields_in_array(value)
        elsif value.is_a?(Hash)
          traverse_and_rename_dotted_fields(value)
        end
      end
    end
  end
end

#traverse_and_rename_dotted_fields(hash) ⇒ Object

Traverse a hash and look for the fields to rename



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/dataflow/nodes/mixin/rename_dotted_fields.rb', line 37

def traverse_and_rename_dotted_fields(hash)
  return if hash.blank?

  hash.keys.each do |k|
    value = hash[k]
    if value.is_a?(Array)
      traverse_and_rename_dotted_fields_in_array(value)
    elsif value.is_a?(Hash)
      traverse_and_rename_dotted_fields(value)
    end

    next unless k.include?('.')
    hash[k.tr('.', '_')] = value
    hash.delete(k)
  end
end

#traverse_and_rename_dotted_fields_in_array(array) ⇒ Object

Looks for hashs in the array that may require a transformation



55
56
57
58
59
# File 'lib/dataflow/nodes/mixin/rename_dotted_fields.rb', line 55

def traverse_and_rename_dotted_fields_in_array(array)
  array.each do |v|
    traverse_and_rename_dotted_fields(v) if v.is_a?(Hash)
  end
end