Commit 8feb85e1 authored by Byron Jones's avatar Byron Jones

Bug 961789: large dependency trees with lots of resolved bugs are very slow to load

r=LpSolit, a=justdave
parent 256930bd
...@@ -3800,17 +3800,24 @@ sub editable_bug_fields { ...@@ -3800,17 +3800,24 @@ sub editable_bug_fields {
# Join with bug_status and bugs tables to show bugs with open statuses first, # Join with bug_status and bugs tables to show bugs with open statuses first,
# and then the others # and then the others
sub EmitDependList { sub EmitDependList {
my ($myfield, $targetfield, $bug_id) = (@_); my ($my_field, $target_field, $bug_id, $exclude_resolved) = @_;
my $cache = Bugzilla->request_cache->{bug_dependency_list} ||= {};
my $dbh = Bugzilla->dbh; my $dbh = Bugzilla->dbh;
my $list_ref = $dbh->selectcol_arrayref( $exclude_resolved = $exclude_resolved ? 1 : 0;
"SELECT $targetfield my $is_open_clause = $exclude_resolved ? 'AND is_open = 1' : '';
$cache->{"${target_field}_sth_$exclude_resolved"} ||= $dbh->prepare(
"SELECT $target_field
FROM dependencies FROM dependencies
INNER JOIN bugs ON dependencies.$targetfield = bugs.bug_id INNER JOIN bugs ON dependencies.$target_field = bugs.bug_id
INNER JOIN bug_status ON bugs.bug_status = bug_status.value INNER JOIN bug_status ON bugs.bug_status = bug_status.value
WHERE $myfield = ? WHERE $my_field = ? $is_open_clause
ORDER BY is_open DESC, $targetfield", ORDER BY is_open DESC, $target_field");
undef, $bug_id);
return $list_ref; return $dbh->selectcol_arrayref(
$cache->{"${target_field}_sth_$exclude_resolved"},
undef, $bug_id);
} }
# Creates a lot of bug objects in the same order as the input array. # Creates a lot of bug objects in the same order as the input array.
......
...@@ -123,10 +123,8 @@ sub _generate_tree { ...@@ -123,10 +123,8 @@ sub _generate_tree {
_generate_tree($dep_id, $relationship, $depth + 1, $bugs, $ids); _generate_tree($dep_id, $relationship, $depth + 1, $bugs, $ids);
} }
# remove bugs according to visiblity and filters # remove bugs according to visiblity
if (!Bugzilla->user->can_see_bug($dep_id) if (!Bugzilla->user->can_see_bug($dep_id)) {
|| ($hide_resolved && !$bugs->{$dep_id}->isopened))
{
delete $ids->{$dep_id}; delete $ids->{$dep_id};
} }
elsif (!grep { $_ == $dep_id } @{ $bugs->{dependencies}->{$bug_id} }) { elsif (!grep { $_ == $dep_id } @{ $bugs->{dependencies}->{$bug_id} }) {
...@@ -140,7 +138,7 @@ sub _get_dependencies { ...@@ -140,7 +138,7 @@ sub _get_dependencies {
my $cache = Bugzilla->request_cache->{dependency_cache} ||= {}; my $cache = Bugzilla->request_cache->{dependency_cache} ||= {};
return $cache->{$bug_id}->{$relationship} ||= return $cache->{$bug_id}->{$relationship} ||=
$relationship eq 'dependson' $relationship eq 'dependson'
? Bugzilla::Bug::EmitDependList('blocked', 'dependson', $bug_id) ? Bugzilla::Bug::EmitDependList('blocked', 'dependson', $bug_id, $hide_resolved)
: Bugzilla::Bug::EmitDependList('dependson', 'blocked', $bug_id); : Bugzilla::Bug::EmitDependList('dependson', 'blocked', $bug_id, $hide_resolved);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment