Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
57bd3bb3
Commit
57bd3bb3
authored
Oct 04, 2017
by
Bob Van Landuyt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Force parents to be preloaded for building a hierarchy
parent
06e00913
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
38 additions
and
24 deletions
+38
-24
app/models/concerns/group_descendant.rb
app/models/concerns/group_descendant.rb
+11
-5
spec/models/concerns/group_descendant_spec.rb
spec/models/concerns/group_descendant_spec.rb
+23
-15
spec/serializers/group_child_serializer_spec.rb
spec/serializers/group_child_serializer_spec.rb
+4
-4
No files found.
app/models/concerns/group_descendant.rb
View file @
57bd3bb3
...
@@ -22,16 +22,22 @@ module GroupDescendant
...
@@ -22,16 +22,22 @@ module GroupDescendant
private
private
def
ancestors_upto
(
hierarchy_top
=
nil
)
def
ancestors_upto
(
hierarchy_top
=
nil
)
if
hierarchy_top
if
self
.
is_a?
(
Group
)
Gitlab
::
GroupHierarchy
.
new
(
Group
.
where
(
id:
hierarchy_top
)).
base_and_descendants
Gitlab
::
GroupHierarchy
.
new
(
Group
.
where
(
id:
id
))
.
ancestors
(
upto:
hierarchy_top
)
else
else
Gitlab
::
GroupHierarchy
.
new
(
Group
.
where
(
id:
self
)).
all_groups
Gitlab
::
GroupHierarchy
.
new
(
Group
.
where
(
id:
parent_id
))
.
base_and_ancestors
(
upto:
hierarchy_top
)
end
end
end
end
def
expand_hierarchy_for_child
(
child
,
hierarchy
,
hierarchy_top
,
preloaded
)
def
expand_hierarchy_for_child
(
child
,
hierarchy
,
hierarchy_top
,
preloaded
)
parent
=
preloaded
.
detect
{
|
possible_parent
|
possible_parent
.
is_a?
(
Group
)
&&
possible_parent
.
id
==
child
.
parent_id
}
parent
=
hierarchy_top
if
hierarchy_top
&&
child
.
parent_id
==
hierarchy_top
.
id
parent
||=
child
.
parent
parent
||=
preloaded
.
detect
{
|
possible_parent
|
possible_parent
.
is_a?
(
Group
)
&&
possible_parent
.
id
==
child
.
parent_id
}
if
parent
.
nil?
&&
!
child
.
parent_id
.
nil?
raise
ArgumentError
.
new
(
'parent was not preloaded'
)
end
if
parent
.
nil?
&&
hierarchy_top
.
present?
if
parent
.
nil?
&&
hierarchy_top
.
present?
raise
ArgumentError
.
new
(
'specified top is not part of the tree'
)
raise
ArgumentError
.
new
(
'specified top is not part of the tree'
)
...
...
spec/models/concerns/group_descendant_spec.rb
View file @
57bd3bb3
...
@@ -5,6 +5,10 @@ describe GroupDescendant, :nested_groups do
...
@@ -5,6 +5,10 @@ describe GroupDescendant, :nested_groups do
let
(
:subgroup
)
{
create
(
:group
,
parent:
parent
)
}
let
(
:subgroup
)
{
create
(
:group
,
parent:
parent
)
}
let
(
:subsub_group
)
{
create
(
:group
,
parent:
subgroup
)
}
let
(
:subsub_group
)
{
create
(
:group
,
parent:
subgroup
)
}
def
all_preloaded_groups
(
*
groups
)
groups
+
[
parent
,
subgroup
,
subsub_group
]
end
context
'for a group'
do
context
'for a group'
do
describe
'#hierarchy'
do
describe
'#hierarchy'
do
it
'only queries once for the ancestors'
do
it
'only queries once for the ancestors'
do
...
@@ -19,9 +23,8 @@ describe GroupDescendant, :nested_groups do
...
@@ -19,9 +23,8 @@ describe GroupDescendant, :nested_groups do
it
'only queries once for the ancestors when a top is given'
do
it
'only queries once for the ancestors when a top is given'
do
test_group
=
create
(
:group
,
parent:
subsub_group
).
reload
test_group
=
create
(
:group
,
parent:
subsub_group
).
reload
query_count
=
ActiveRecord
::
QueryRecorder
.
new
{
test_group
.
hierarchy
(
subgroup
)
}.
count
recorder
=
ActiveRecord
::
QueryRecorder
.
new
{
test_group
.
hierarchy
(
subgroup
)
}
expect
(
recorder
.
count
).
to
eq
(
1
)
expect
(
query_count
).
to
eq
(
1
)
end
end
it
'builds a hierarchy for a group'
do
it
'builds a hierarchy for a group'
do
...
@@ -37,7 +40,8 @@ describe GroupDescendant, :nested_groups do
...
@@ -37,7 +40,8 @@ describe GroupDescendant, :nested_groups do
end
end
it
'raises an error if specifying a base that is not part of the tree'
do
it
'raises an error if specifying a base that is not part of the tree'
do
expect
{
subsub_group
.
hierarchy
(
build_stubbed
(
:group
))
}.
to
raise_error
(
'specified top is not part of the tree'
)
expect
{
subsub_group
.
hierarchy
(
build_stubbed
(
:group
))
}
.
to
raise_error
(
'specified top is not part of the tree'
)
end
end
end
end
...
@@ -46,7 +50,7 @@ describe GroupDescendant, :nested_groups do
...
@@ -46,7 +50,7 @@ describe GroupDescendant, :nested_groups do
other_subgroup
=
create
(
:group
,
parent:
parent
)
other_subgroup
=
create
(
:group
,
parent:
parent
)
other_subsub_group
=
create
(
:group
,
parent:
subgroup
)
other_subsub_group
=
create
(
:group
,
parent:
subgroup
)
groups
=
[
other_subgroup
,
subsub_group
,
other_subsub_group
]
groups
=
all_preloaded_groups
(
other_subgroup
,
subsub_group
,
other_subsub_group
)
expected_hierarchy
=
{
parent
=>
[
other_subgroup
,
{
subgroup
=>
[
subsub_group
,
other_subsub_group
]
}]
}
expected_hierarchy
=
{
parent
=>
[
other_subgroup
,
{
subgroup
=>
[
subsub_group
,
other_subsub_group
]
}]
}
...
@@ -58,9 +62,9 @@ describe GroupDescendant, :nested_groups do
...
@@ -58,9 +62,9 @@ describe GroupDescendant, :nested_groups do
other_subsub_group
=
create
(
:group
,
parent:
subgroup
)
other_subsub_group
=
create
(
:group
,
parent:
subgroup
)
groups
=
[
other_subgroup
,
subsub_group
,
other_subsub_group
]
groups
=
[
other_subgroup
,
subsub_group
,
other_subsub_group
]
groups
<<
subgroup
# Add the parent as if it was preloaded
expected_hierarchy
=
[
other_subgroup
,
{
subgroup
=>
[
subsub_group
,
other_subsub_group
]
}]
expected_hierarchy
=
[
other_subgroup
,
{
subgroup
=>
[
subsub_group
,
other_subsub_group
]
}]
expect
(
described_class
.
build_hierarchy
(
groups
,
parent
)).
to
eq
(
expected_hierarchy
)
expect
(
described_class
.
build_hierarchy
(
groups
,
parent
)).
to
eq
(
expected_hierarchy
)
end
end
...
@@ -69,11 +73,16 @@ describe GroupDescendant, :nested_groups do
...
@@ -69,11 +73,16 @@ describe GroupDescendant, :nested_groups do
other_subgroup2
=
create
(
:group
,
parent:
parent
)
other_subgroup2
=
create
(
:group
,
parent:
parent
)
other_subsub_group
=
create
(
:group
,
parent:
other_subgroup
)
other_subsub_group
=
create
(
:group
,
parent:
other_subgroup
)
groups
=
[
subsub_group
,
other_subgroup2
,
other_subsub_group
]
groups
=
all_preloaded_groups
(
subsub_group
,
other_subgroup2
,
other_subsub_group
,
other_subgroup
)
expected_hierarchy
=
{
parent
=>
[{
subgroup
=>
subsub_group
},
other_subgroup2
,
{
other_subgroup
=>
other_subsub_group
}]
}
expected_hierarchy
=
{
parent
=>
[{
subgroup
=>
subsub_group
},
other_subgroup2
,
{
other_subgroup
=>
other_subsub_group
}]
}
expect
(
described_class
.
build_hierarchy
(
groups
)).
to
eq
(
expected_hierarchy
)
expect
(
described_class
.
build_hierarchy
(
groups
)).
to
eq
(
expected_hierarchy
)
end
end
it
'raises an error if not all elements were preloaded'
do
expect
{
described_class
.
build_hierarchy
([
subsub_group
])
}
.
to
raise_error
(
'parent was not preloaded'
)
end
end
end
end
end
...
@@ -81,7 +90,7 @@ describe GroupDescendant, :nested_groups do
...
@@ -81,7 +90,7 @@ describe GroupDescendant, :nested_groups do
let
(
:project
)
{
create
(
:project
,
namespace:
subsub_group
)
}
let
(
:project
)
{
create
(
:project
,
namespace:
subsub_group
)
}
describe
'#hierarchy'
do
describe
'#hierarchy'
do
it
'builds a hierarchy for a
group
'
do
it
'builds a hierarchy for a
project
'
do
expected_hierarchy
=
{
parent
=>
{
subgroup
=>
{
subsub_group
=>
project
}
}
}
expected_hierarchy
=
{
parent
=>
{
subgroup
=>
{
subsub_group
=>
project
}
}
}
expect
(
project
.
hierarchy
).
to
eq
(
expected_hierarchy
)
expect
(
project
.
hierarchy
).
to
eq
(
expected_hierarchy
)
...
@@ -92,10 +101,6 @@ describe GroupDescendant, :nested_groups do
...
@@ -92,10 +101,6 @@ describe GroupDescendant, :nested_groups do
expect
(
project
.
hierarchy
(
subgroup
)).
to
eq
(
expected_hierarchy
)
expect
(
project
.
hierarchy
(
subgroup
)).
to
eq
(
expected_hierarchy
)
end
end
it
'raises an error if specifying a base that is not part of the tree'
do
expect
{
project
.
hierarchy
(
build_stubbed
(
:group
))
}.
to
raise_error
(
'specified top is not part of the tree'
)
end
end
end
describe
'.build_hierarchy'
do
describe
'.build_hierarchy'
do
...
@@ -103,7 +108,7 @@ describe GroupDescendant, :nested_groups do
...
@@ -103,7 +108,7 @@ describe GroupDescendant, :nested_groups do
other_project
=
create
(
:project
,
namespace:
parent
)
other_project
=
create
(
:project
,
namespace:
parent
)
other_subgroup_project
=
create
(
:project
,
namespace:
subgroup
)
other_subgroup_project
=
create
(
:project
,
namespace:
subgroup
)
elements
=
[
other_project
,
subsub_group
,
other_subgroup_project
]
elements
=
all_preloaded_groups
(
other_project
,
subsub_group
,
other_subgroup_project
)
expected_hierarchy
=
{
parent
=>
[
other_project
,
{
subgroup
=>
[
subsub_group
,
other_subgroup_project
]
}]
}
expected_hierarchy
=
{
parent
=>
[
other_project
,
{
subgroup
=>
[
subsub_group
,
other_subgroup_project
]
}]
}
...
@@ -115,6 +120,7 @@ describe GroupDescendant, :nested_groups do
...
@@ -115,6 +120,7 @@ describe GroupDescendant, :nested_groups do
other_subgroup_project
=
create
(
:project
,
namespace:
subgroup
)
other_subgroup_project
=
create
(
:project
,
namespace:
subgroup
)
elements
=
[
other_project
,
subsub_group
,
other_subgroup_project
]
elements
=
[
other_project
,
subsub_group
,
other_subgroup_project
]
elements
<<
subgroup
# Added as if it was preloaded
expected_hierarchy
=
[
other_project
,
{
subgroup
=>
[
subsub_group
,
other_subgroup_project
]
}]
expected_hierarchy
=
[
other_project
,
{
subgroup
=>
[
subsub_group
,
other_subgroup_project
]
}]
...
@@ -136,7 +142,9 @@ describe GroupDescendant, :nested_groups do
...
@@ -136,7 +142,9 @@ describe GroupDescendant, :nested_groups do
other_subgroup
=
create
(
:group
,
parent:
parent
)
other_subgroup
=
create
(
:group
,
parent:
parent
)
other_subproject
=
create
(
:project
,
namespace:
other_subgroup
)
other_subproject
=
create
(
:project
,
namespace:
other_subgroup
)
projects
=
[
project
,
subsubsub_project
,
sub_project
,
other_subproject
,
subsub_project
]
elements
=
[
project
,
subsubsub_project
,
sub_project
,
other_subproject
,
subsub_project
]
# Add parent groups as if they were preloaded
elements
+=
[
other_subgroup
,
subsubsub_group
,
subsub_group
,
subgroup
]
expected_hierarchy
=
[
expected_hierarchy
=
[
project
,
project
,
...
@@ -149,7 +157,7 @@ describe GroupDescendant, :nested_groups do
...
@@ -149,7 +157,7 @@ describe GroupDescendant, :nested_groups do
{
other_subgroup
=>
other_subproject
}
{
other_subgroup
=>
other_subproject
}
]
]
actual_hierarchy
=
described_class
.
build_hierarchy
(
projec
ts
,
parent
)
actual_hierarchy
=
described_class
.
build_hierarchy
(
elemen
ts
,
parent
)
expect
(
actual_hierarchy
).
to
eq
(
expected_hierarchy
)
expect
(
actual_hierarchy
).
to
eq
(
expected_hierarchy
)
end
end
...
...
spec/serializers/group_child_serializer_spec.rb
View file @
57bd3bb3
...
@@ -27,7 +27,7 @@ describe GroupChildSerializer do
...
@@ -27,7 +27,7 @@ describe GroupChildSerializer do
subgroup
=
create
(
:group
,
parent:
parent
)
subgroup
=
create
(
:group
,
parent:
parent
)
subsub_group
=
create
(
:group
,
parent:
subgroup
)
subsub_group
=
create
(
:group
,
parent:
subgroup
)
json
=
serializer
.
represent
(
subsub_group
)
json
=
serializer
.
represent
(
[
subgroup
,
subsub_group
]).
first
subsub_group_json
=
json
[
:children
].
first
subsub_group_json
=
json
[
:children
].
first
expect
(
json
[
:id
]).
to
eq
(
subgroup
.
id
)
expect
(
json
[
:id
]).
to
eq
(
subgroup
.
id
)
...
@@ -41,7 +41,7 @@ describe GroupChildSerializer do
...
@@ -41,7 +41,7 @@ describe GroupChildSerializer do
subgroup2
=
create
(
:group
,
parent:
parent
)
subgroup2
=
create
(
:group
,
parent:
parent
)
subsub_group2
=
create
(
:group
,
parent:
subgroup2
)
subsub_group2
=
create
(
:group
,
parent:
subgroup2
)
json
=
serializer
.
represent
([
sub
sub_group1
,
subsub_
group2
])
json
=
serializer
.
represent
([
sub
group1
,
subsub_group1
,
subgroup1
,
sub
group2
])
subgroup1_json
=
json
.
first
subgroup1_json
=
json
.
first
subsub_group1_json
=
subgroup1_json
[
:children
].
first
subsub_group1_json
=
subgroup1_json
[
:children
].
first
...
@@ -58,7 +58,7 @@ describe GroupChildSerializer do
...
@@ -58,7 +58,7 @@ describe GroupChildSerializer do
it
'can render a tree'
do
it
'can render a tree'
do
subgroup
=
create
(
:group
,
parent:
parent
)
subgroup
=
create
(
:group
,
parent:
parent
)
json
=
serializer
.
represent
([
subgroup
])
json
=
serializer
.
represent
([
parent
,
subgroup
])
parent_json
=
json
.
first
parent_json
=
json
.
first
expect
(
parent_json
[
:id
]).
to
eq
(
parent
.
id
)
expect
(
parent_json
[
:id
]).
to
eq
(
parent
.
id
)
...
@@ -89,7 +89,7 @@ describe GroupChildSerializer do
...
@@ -89,7 +89,7 @@ describe GroupChildSerializer do
subgroup2
=
create
(
:group
,
parent:
parent
)
subgroup2
=
create
(
:group
,
parent:
parent
)
project2
=
create
(
:project
,
namespace:
subgroup2
)
project2
=
create
(
:project
,
namespace:
subgroup2
)
json
=
serializer
.
represent
([
project1
,
project2
])
json
=
serializer
.
represent
([
project1
,
project2
,
subgroup1
,
subgroup2
])
project1_json
,
project2_json
=
json
.
map
{
|
group_json
|
group_json
[
:children
].
first
}
project1_json
,
project2_json
=
json
.
map
{
|
group_json
|
group_json
[
:children
].
first
}
expect
(
json
.
size
).
to
eq
(
2
)
expect
(
json
.
size
).
to
eq
(
2
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment