Module: GroupDescendant
Class Method Summary collapse
-
.build_hierarchy(descendants, hierarchy_top = nil, opts = {}) ⇒ Object
Merges all hierarchies of the given groups or projects into an array of hashes.
Instance Method Summary collapse
-
#hierarchy(hierarchy_top = nil, preloaded = nil, opts = {}) ⇒ Object
Returns the hierarchy of a project or group in the from of a hash upto a given top.
Class Method Details
.build_hierarchy(descendants, hierarchy_top = nil, opts = {}) ⇒ Object
Merges all hierarchies of the given groups or projects into an array of
hashes. All ancestors need to be loaded into the given descendants to avoid
queries down the line.
Options:
upto_preloaded_ancestors_only: boolean - When true, the hierarchy expansions stops at the
highest level preloaded ancestor. The hierarchy isn't
guaranteed to reach the hierarchy_top.
GroupDescendant.merge_hierarchy([project, child_group, child_group2, parent]) => { parent => [{ child_group => project}, child_group2] }
30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'app/models/concerns/group_descendant.rb', line 30 def self.build_hierarchy(descendants, hierarchy_top = nil, opts = {}) descendants = Array.wrap(descendants).uniq return [] if descendants.empty? unless descendants.all?(GroupDescendant) raise ArgumentError, _('element is not a hierarchy') end all_hierarchies = descendants.map do |descendant| descendant.hierarchy(hierarchy_top, descendants, opts) end Gitlab::Utils::MergeHash.merge(all_hierarchies) end |
Instance Method Details
#hierarchy(hierarchy_top = nil, preloaded = nil, opts = {}) ⇒ Object
Returns the hierarchy of a project or group in the from of a hash upto a given top.
Options:
upto_preloaded_ancestors_only: boolean - When true, the hierarchy expansions stops at the
highest level preloaded ancestor. The hierarchy isn't
guaranteed to reach the hierarchy_top.
project.hierarchy => { parent_group => { child_group => project } }
14 15 16 17 |
# File 'app/models/concerns/group_descendant.rb', line 14 def hierarchy(hierarchy_top = nil, preloaded = nil, opts = {}) preloaded ||= ancestors_upto(hierarchy_top) (self, self, hierarchy_top, preloaded, opts) end |