Module: Eco::API::UseCases::DefaultCases::CsvToTree::NodesCleaner
- Included in:
- Helper
- Defined in:
- lib/eco/api/usecases/default_cases/csv_to_tree_case/nodes_cleaner.rb
Instance Method Summary collapse
- #done_tags ⇒ Object
- #fill_in_parents(nodes) ⇒ Object
- #repeated_tags ⇒ Object
- #tidy_nodes(nodes, prev_level: 0, main: true) ⇒ Object
- #to_rows(nodes, prev_level: 0, main: true) ⇒ Object
Instance Method Details
#done_tags ⇒ Object
7 8 9 |
# File 'lib/eco/api/usecases/default_cases/csv_to_tree_case/nodes_cleaner.rb', line 7 def @done_tags ||= [] end |
#fill_in_parents(nodes) ⇒ Object
11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/eco/api/usecases/default_cases/csv_to_tree_case/nodes_cleaner.rb', line 11 def fill_in_parents(nodes) nodes.tap do |nodes| prev_nodes = Array(1..11).zip(Array.new(11, nil)).to_h nodes.each do |node| if parent_node = prev_nodes[node.actual_level - 1] node.parentId = parent_node.id end prev_nodes[node.raw_level] = node end end end |
#repeated_tags ⇒ Object
3 4 5 |
# File 'lib/eco/api/usecases/default_cases/csv_to_tree_case/nodes_cleaner.rb', line 3 def @repeated_tags ||= [] end |
#tidy_nodes(nodes, prev_level: 0, main: true) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/eco/api/usecases/default_cases/csv_to_tree_case/nodes_cleaner.rb', line 23 def tidy_nodes(nodes, prev_level: 0, main: true) out = nodes.each_with_object([]) do |node, out| if .include?(tag = node.tag) << "#{tag} (level: #{node.level})" else level = node.actual_level if level > prev_level + 1 gap = level - (prev_level + 1) puts "(Row: #{node.row_num}) Tag '#{tag}' (lev #{level}) jumps #{gap} level(s) (expected #{prev_level + 1})." #puts " " + node.tags_array.pretty_inspect missing_nodes = node.decouple(gap) puts " Adding missing upper level(s): " + missing_nodes.map(&:raw_tag).pretty_inspect out.push(*tidy_nodes(missing_nodes, prev_level: prev_level, main: false)) # puts node.actual_level # pp node.tags_array level = prev_level + 1 end out << node << tag prev_level = level end end if main unless .empty? puts "There were #{.length} repeated tags. Only one included. These excluded:" pp end end fill_in_parents(out) end |
#to_rows(nodes, prev_level: 0, main: true) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/eco/api/usecases/default_cases/csv_to_tree_case/nodes_cleaner.rb', line 54 def to_rows(nodes, prev_level: 0, main: true) out = tidy_nodes(nodes).each_with_object([]) do |node, out| tag = node.tag level = node.actual_level out << (row = Array.new(level, nil)) row[-1..-1] = [tag.upcase] prev_level = level end if main # Normalize length max_row = out.max {|a, b| a.length <=> b.length} holder = Array.new(max_row.length, nil) out = out.map do |row| row.dup.concat(holder)[0..max_row.length-1] end end out end |