lib/fertile_forest/modules/finders.rb
#
# Create nested nodes from subtree nodes.
#
# @param haystack_nodes [ActiveRecord::Relation|Array] Iteratorable nodes data.
# @return [Hash|Array] When has grove is Hash, otherwise Array.
#
Create nested nodes from subtree nodes.
Create nested nodes from subtree nodes .
def nested_nodes(haystack_nodes)
            return {} if haystack_nodes.blank?
             pick up nodes by iterator
              (1) array
              (2) query
              (3) ResultSet
             return by hash [id => node]
            sorted_nodes = ff_queue_sorted_nodes(haystack_nodes)
            return {} if sorted_nodes.blank?
             ネストがroot(=1)からじゃない場合の対応
             queueで並べた先頭のdepthを暫定root depthとする
            the_root_depth = sorted_nodes[0].ff_depth
            sorted_nodes.each do |node|
              node.nest_unset_parent
              node.nest_unset_children
            end
             遡って見えているnodesを格納する配列
            retro_nodes = {}
            if has_grove?
              sorted_nodes.each do |node|
                retro_nodes[node.ff_grove] = []
              end
            else
              retro_nodes[:singular] = []
            end
             戻り値の生成用の、IDをキーとしたhashによるnest情報
            res_nested_nodes = {}
            grove_key = :singular
            sorted_nodes.each do |node|
              the_id = node.id
              depth = node.ff_depth
              grove_key = node.ff_grove if has_grove?
              res_nested_nodes[the_id] = node;   今回のnodesを登録
              depth_index = depth - the_root_depth    ネストがroot(=1)からじゃない場合の対応
              parent_depth_index = depth_index - 1
               このnodeに親があれば、親子関係を登録
              if 0 <= parent_depth_index && retro_nodes[grove_key][parent_depth_index].present?
                parent_id = retro_nodes[grove_key][parent_depth_index]
                res_nested_nodes[parent_id].nest_set_child_id(the_id)
                res_nested_nodes[the_id].nest_set_parent_id(parent_id)
              end
               今回の深度のところまで親リストを消した上で自分を登録する
              retro_nodes[grove_key] = retro_nodes[grove_key].slice(0, depth_index)
              retro_nodes[grove_key][depth_index] = the_id
            end
            return res_nested_nodes unless has_grove?
             set grove hash
            grove_res = {}
            retro_nodes.keys.each do |grove|
              grove_res[grove] = {}
            end
            res_nested_nodes.each_pair do |id, node|
              grove_res[node.ff_grove][id] = node
            end
            grove_res
          end
def nested_nodes ( haystack_nodes ) return { } if haystack_nodes . blank? sorted_nodes = ff_queue_sorted_nodes ( haystack_nodes ) return { } if sorted_nodes . blank? the_root_depth = sorted_nodes [ 0 ] . ff_depth sorted_nodes . each do | node | node . nest_unset_parent node . nest_unset_children end retro_nodes = { } if has_grove? sorted_nodes . each do | node | retro_nodes [ node . ff_grove ] = [ ] end else retro_nodes [ :singular ] = [ ] end res_nested_nodes = { } grove_key = :singular sorted_nodes . each do | node | the_id = node . id depth = node . ff_depth grove_key = node . ff_grove if has_grove? res_nested_nodes [ the_id ] = node ; depth_index = depth - the_root_depth parent_depth_index = depth_index - 1 if 0 <= parent_depth_index && retro_nodes [ grove_key ] [ parent_depth_index ] . present? parent_id = retro_nodes [ grove_key ] [ parent_depth_index ] res_nested_nodes [ parent_id ] . nest_set_child_id ( the_id ) res_nested_nodes [ the_id ] . nest_set_parent_id ( parent_id ) end retro_nodes [ grove_key ] = retro_nodes [ grove_key ] . slice ( 0 , depth_index ) retro_nodes [ grove_key ] [ depth_index ] = the_id end return res_nested_nodes unless has_grove? grove_res = { } retro_nodes . keys . each do | grove | grove_res [ grove ] = { } end res_nested_nodes . each_pair do | id , node | grove_res [ node . ff_grove ] [ id ] = node end grove_res end
Create nested nodes from subtree nodes.
Create nested nodes from subtree nodes .
# # pick up nodes by iterator #  (1) array #  (2) query #  (3) ResultSet # return by hash [id => node] # # ネストがroot(=1)からじゃない場合の対応 # queueで並べた先頭のdepthを暫定root depthとする # 遡って見えているnodesを格納する配列 # 戻り値の生成用の、IDをキーとしたhashによるnest情報 # 今回のnodesを登録 # ネストがroot(=1)からじゃない場合の対応 # このnodeに親があれば、親子関係を登録 # 今回の深度のところまで親リストを消した上で自分を登録する # set grove hash
When has grove is Hash, otherwise Array.
When has grove is Hash otherwise Array .
Hash|Array
haystack_nodes
Iteratorable nodes data.
Iteratorable nodes data .