Module: Eco::API::Common::People::SupervisorHelpers::ClassMethods
- Included in:
- Eco::API::Common::People::SupervisorHelpers
- Defined in:
- lib/eco/api/common/people/supervisor_helpers.rb
Instance Method Summary collapse
- #print_tree(tree, lev: 0) ⇒ Object
-
#sort_by_supervisors(values, supervisors_first: true) ⇒ Object
Reorders as follows: 1.
-
#supervisors_tree(values) ⇒ Hash
Generates a
Hash
tree structure, where: * keys are nodes * values areHash
subtree structures ofkey
subordinates. - #tree_to_str(tree, lev: 0) ⇒ Object
Instance Method Details
#print_tree(tree, lev: 0) ⇒ Object
45 46 47 |
# File 'lib/eco/api/common/people/supervisor_helpers.rb', line 45 def print_tree(tree, lev: 0) puts tree_to_str(tree) end |
#sort_by_supervisors(values, supervisors_first: true) ⇒ Object
Reorders as follows:
- supervisors, people with no supervisor or where their supervisor not present
- subordinates
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/eco/api/common/people/supervisor_helpers.rb', line 18 def sort_by_supervisors(values, supervisors_first: true) raise "Expected non hash Enumerable. Given: #{values.class}" if values.is_a?(Hash) return [] unless values && values.is_a?(Enumerable) roam = Proc.new do |tree| [].tap do |out| sub_outs = tree.empty?? [] : tree.map {|sup, subtree| roam.call(subtree)} tree.each do |sup, subtree| sout = subtree.empty?? [] :roam.call(subtree) supervisors_first ? sout.unshift(sup) : sout.push(sup) out.concat(sout) end end end roam.call(supervisors_tree(values)) end |
#supervisors_tree(values) ⇒ Hash
Note:
it is resilient to cyclic supervisors (it will just add the last at the top)
Generates a Hash
tree structure, where:
- keys are nodes
- values are
Hash
subtree structures ofkey
subordinates
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/eco/api/common/people/supervisor_helpers.rb', line 56 def supervisors_tree(values) raise "Expected non hash Enumerable. Given: #{values.class}" if values.is_a?(Hash) return {} unless values && values.is_a?(Enumerable) idx = get_super_indexes(values) processed = [] subtree = Proc.new do |entry, level, toptree| if processed.include?(entry) next {} unless toptree.key?(entry) && level > 0 # needs to be moved as a child subnodes = toptree.delete(entry) processed.delete(entry) end subnodes ||= {}.tap do |tree| subs = idx[:subordinates].call(entry) processed.push(entry) next nil unless subs && !subs.empty? subs.each do |sub| sub_tree = subtree.call(sub, level + 1, toptree) tree.merge!(sub_tree) end end {entry => subnodes} end {}.tap do |tree| idx[:by_sup].keys.each do |sup_id| if sup = idx[:supers][sup_id] tree.merge!(subtree.call(sup, 0, tree)) else idx[:by_sup][sup_id].each do |sub| tree.merge!(subtree.call(sub, 0, tree)) end end end end end |
#tree_to_str(tree, lev: 0) ⇒ Object
35 36 37 38 39 40 41 42 43 |
# File 'lib/eco/api/common/people/supervisor_helpers.rb', line 35 def tree_to_str(tree, lev: 0) raise "Required Hash tree structure. Given: #{tree.class}" unless tree.is_a?(Hash) "".tap do |str| tree.each do |entry, subtree| str << "#{" " * lev}+-- #{entry.id || entry.external_id}\n" str << tree_to_str(subtree, lev: lev + 1) unless !subtree || subtree.empty? end end end |