From 8feb85e10f0993bdb372d500223cf568bd3dd355 Mon Sep 17 00:00:00 2001 From: Byron Jones Date: Mon, 10 Feb 2014 16:05:16 +0800 Subject: Bug 961789: large dependency trees with lots of resolved bugs are very slow to load r=LpSolit, a=justdave --- Bugzilla/Bug.pm | 23 +++++++++++++++-------- showdependencytree.cgi | 10 ++++------ 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index 3e48312a9..a2a8827a5 100644 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -3800,17 +3800,24 @@ sub editable_bug_fields { # Join with bug_status and bugs tables to show bugs with open statuses first, # and then the others 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 $list_ref = $dbh->selectcol_arrayref( - "SELECT $targetfield + $exclude_resolved = $exclude_resolved ? 1 : 0; + my $is_open_clause = $exclude_resolved ? 'AND is_open = 1' : ''; + + $cache->{"${target_field}_sth_$exclude_resolved"} ||= $dbh->prepare( + "SELECT $target_field 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 - WHERE $myfield = ? - ORDER BY is_open DESC, $targetfield", - undef, $bug_id); - return $list_ref; + WHERE $my_field = ? $is_open_clause + ORDER BY is_open DESC, $target_field"); + + 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. diff --git a/showdependencytree.cgi b/showdependencytree.cgi index 786a0312d..fb8a59cc3 100755 --- a/showdependencytree.cgi +++ b/showdependencytree.cgi @@ -123,10 +123,8 @@ sub _generate_tree { _generate_tree($dep_id, $relationship, $depth + 1, $bugs, $ids); } - # remove bugs according to visiblity and filters - if (!Bugzilla->user->can_see_bug($dep_id) - || ($hide_resolved && !$bugs->{$dep_id}->isopened)) - { + # remove bugs according to visiblity + if (!Bugzilla->user->can_see_bug($dep_id)) { delete $ids->{$dep_id}; } elsif (!grep { $_ == $dep_id } @{ $bugs->{dependencies}->{$bug_id} }) { @@ -140,7 +138,7 @@ sub _get_dependencies { my $cache = Bugzilla->request_cache->{dependency_cache} ||= {}; return $cache->{$bug_id}->{$relationship} ||= $relationship eq 'dependson' - ? Bugzilla::Bug::EmitDependList('blocked', 'dependson', $bug_id) - : Bugzilla::Bug::EmitDependList('dependson', 'blocked', $bug_id); + ? Bugzilla::Bug::EmitDependList('blocked', 'dependson', $bug_id, $hide_resolved) + : Bugzilla::Bug::EmitDependList('dependson', 'blocked', $bug_id, $hide_resolved); } -- cgit v1.2.3-24-g4f1b