diff options
author | Max Kanat-Alexander <mkanat@bugzilla.org> | 2011-01-04 03:09:42 +0100 |
---|---|---|
committer | Max Kanat-Alexander <mkanat@bugzilla.org> | 2011-01-04 03:09:42 +0100 |
commit | b6d1cc32f75d47437e382caccfccc5b2d98af765 (patch) | |
tree | 2ceff059de13f820287c0a84f248d55ef5630aff /Bugzilla/Bug.pm | |
parent | a1fa8d5f9f196d8611c64c1625e8269c9df52214 (diff) | |
download | bugzilla-b6d1cc32f75d47437e382caccfccc5b2d98af765.tar.gz bugzilla-b6d1cc32f75d47437e382caccfccc5b2d98af765.tar.xz |
Bug 595410: Make it faster to display a bug that has a lot of dependencies.
r=LpSolit, a=LpSolit
Diffstat (limited to 'Bugzilla/Bug.pm')
-rw-r--r-- | Bugzilla/Bug.pm | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index f3a28658a..398843009 100644 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -472,6 +472,26 @@ sub match { return $class->SUPER::match(@_); } +# Helps load up information for bugs for show_bug.cgi and other situations +# that will need to access info on lots of bugs. +sub preload { + my ($class, $bugs) = @_; + my $user = Bugzilla->user; + + # It would be faster but MUCH more complicated to select all the + # deps for the entire list in one SQL statement. If we ever have + # a profile that proves that that's necessary, we can switch over + # to the more complex method. + my @all_dep_ids; + foreach my $bug (@$bugs) { + push(@all_dep_ids, @{ $bug->blocked }, @{ $bug->dependson }); + } + @all_dep_ids = uniq @all_dep_ids; + # If we don't do this, can_see_bug will do one call per bug in + # the dependency lists, during get_bug_link in Bugzilla::Template. + $user->visible_bugs(\@all_dep_ids); +} + sub possible_duplicates { my ($class, $params) = @_; my $short_desc = $params->{summary}; @@ -2302,6 +2322,8 @@ sub set_dependencies { detaint_natural($_) foreach (@$dependson, @$blocked); $self->{'dependson'} = $dependson; $self->{'blocked'} = $blocked; + delete $self->{depends_on_obj}; + delete $self->{blocks_obj}; } sub _clear_dup_id { $_[0]->{dup_id} = undef; } sub set_dup_id { @@ -3003,6 +3025,12 @@ sub blocked { return $self->{'blocked'}; } +sub blocks_obj { + my ($self) = @_; + $self->{blocks_obj} ||= $self->_bugs_in_order($self->blocked); + return $self->{blocks_obj}; +} + sub bug_group { my ($self) = @_; return join(', ', (map { $_->name } @{$self->groups_in})); @@ -3096,6 +3124,12 @@ sub dependson { return $self->{'dependson'}; } +sub depends_on_obj { + my ($self) = @_; + $self->{depends_on_obj} ||= $self->_bugs_in_order($self->dependson); + return $self->{depends_on_obj}; +} + sub flag_types { my ($self) = @_; return $self->{'flag_types'} if exists $self->{'flag_types'}; @@ -3496,6 +3530,15 @@ sub EmitDependList { return $list_ref; } +# Creates a lot of bug objects in the same order as the input array. +sub _bugs_in_order { + my ($self, $bug_ids) = @_; + my $bugs = $self->new_from_list($bug_ids); + my %bug_map = map { $_->id => $_ } @$bugs; + my @result = map { $bug_map{$_} } @$bug_ids; + return \@result; +} + # Get the activity of a bug, starting from $starttime (if given). # This routine assumes Bugzilla::Bug->check has been previously called. sub GetBugActivity { |