]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1143874: Improve load time of bug comments
authorFrédéric Buclin <LpSolit@gmail.com>
Sun, 5 Apr 2015 19:46:33 +0000 (21:46 +0200)
committerFrédéric Buclin <LpSolit@gmail.com>
Sun, 5 Apr 2015 19:46:33 +0000 (21:46 +0200)
r=dkl a=sgreen

Bugzilla/BugMail.pm
Bugzilla/Comment.pm
template/en/default/bug/comments.html.tmpl

index f655c4ae6b3adb60c7afeef9c7741a5fc45b8819..bfb57f1589557c64aadd6be76d8b794f48807368 100644 (file)
@@ -38,9 +38,6 @@ sub relationships {
     return %relationships;
 }
 
-# This is a bit of a hack, basically keeping the old system()
-# cmd line interface. Should clean this up at some point.
-#
 # args: bug_id, and an optional hash ref which may have keys for:
 # changer, owner, qa, reporter, cc
 # Optional hash contains values of people which will be forced to those
@@ -88,6 +85,8 @@ sub Send {
         @diffs = _get_new_bugmail_fields($bug);
     }
 
+    my $comments = [];
+
     if ($params->{dep_only}) {
         push(@diffs, { field_name => 'bug_status',
                        old        => $params->{changes}->{bug_status}->[0],
@@ -104,14 +103,14 @@ sub Send {
     }
     else {
         push(@diffs, _get_diffs($bug, $end, \%user_cache));
-    }
 
-    my $comments = $bug->comments({ after => $start, to => $end });
-    # Skip empty comments.
-    @$comments = grep { $_->type || $_->body =~ /\S/ } @$comments;
+        $comments = $bug->comments({ after => $start, to => $end });
+        # Skip empty comments.
+        @$comments = grep { $_->type || $_->body =~ /\S/ } @$comments;
 
-    # If no changes have been made, there is no need to process further.
-    return {'sent' => []} unless scalar(@diffs) || scalar(@$comments);
+        # If no changes have been made, there is no need to process further.
+        return {'sent' => []} unless scalar(@diffs) || scalar(@$comments);
+    }
 
     ###########################################################################
     # Start of email filtering code
index 3dabe67028d7bfa84d12e0fd740d3f34b6ca3e63..8232f5ac100ff3402d652c4e4fe083268fe2619d 100644 (file)
@@ -162,11 +162,15 @@ sub preload {
         my $rows = $dbh->selectall_arrayref(
             "SELECT comment_id, " . $dbh->sql_group_concat('tag', "','") . "
                FROM longdescs_tags
-              WHERE " . $dbh->sql_in('comment_id', \@comment_ids) . "
-              GROUP BY comment_id");
+              WHERE " . $dbh->sql_in('comment_id', \@comment_ids) . ' ' .
+              $dbh->sql_group_by('comment_id'));
         foreach my $row (@$rows) {
             $comment_map{$row->[0]}->{tags} = [ split(/,/, $row->[1]) ];
         }
+        # Also sets the 'tags' attribute for comments which have no entry
+        # in the longdescs_tags table, else calling $comment->tags will
+        # trigger another SQL query again.
+        $comment_map{$_}->{tags} ||= [] foreach @comment_ids;
     }
 }
 
@@ -190,7 +194,8 @@ sub extra_data  { return $_[0]->{'extra_data'} }
 
 sub tags {
     my ($self) = @_;
-    return [] unless Bugzilla->params->{'comment_taggers_group'};
+    state $comment_taggers_group = Bugzilla->params->{'comment_taggers_group'};
+    return [] unless $comment_taggers_group;
     $self->{'tags'} ||= Bugzilla->dbh->selectcol_arrayref(
         "SELECT tag
            FROM longdescs_tags
@@ -202,11 +207,14 @@ sub tags {
 
 sub collapsed {
     my ($self) = @_;
-    return 0 unless Bugzilla->params->{'comment_taggers_group'};
+    state $comment_taggers_group = Bugzilla->params->{'comment_taggers_group'};
+    return 0 unless $comment_taggers_group;
     return $self->{collapsed} if exists $self->{collapsed};
+
+    state $collapsed_comment_tags = Bugzilla->params->{'collapsed_comment_tags'};
     $self->{collapsed} = 0;
     Bugzilla->request_cache->{comment_tags_collapsed}
-            ||= [ split(/\s*,\s*/, Bugzilla->params->{'collapsed_comment_tags'}) ];
+            ||= [ split(/\s*,\s*/, $collapsed_comment_tags) ];
     my @collapsed_tags = @{ Bugzilla->request_cache->{comment_tags_collapsed} };
     foreach my $my_tag (@{ $self->tags }) {
         $my_tag = lc($my_tag);
index 63196a1cea20a9514df520c4e01e1346def477d1..fdefa9b199b9dcf70c8d365a07464304d3d99e95 100644 (file)
@@ -19,6 +19,7 @@
 [% DEFAULT mode = "show" %]
 [% user_cache = template_cache.users %]
 [% markdown_enabled = feature_enabled('jsonrpc') AND user.settings.use_markdown.value == "on" %]
+[% can_edit_comments = bug.check_can_change_field('longdesc', 0, 1) %]
 
 <!-- This auto-sizes the comments and positions the collapse/expand links 
      to the right. -->
@@ -26,9 +27,7 @@
 <tr>
 <td>
 
-[% FOREACH comment = comments %]
-  [% PROCESS a_comment %]
-[% END %]
+[% PROCESS display_comments %]
 
 [% IF mode == "edit" && user.id
       && user.settings.comment_box_position.value == "before_comments" %]
 [%# Block for individual comments                                            #%]
 [%############################################################################%]
 
-[% BLOCK a_comment %]
-  [% RETURN IF comment.is_private AND NOT (user.is_insider || user.id == comment.author.id) %]
-  [% comment_text = comment.body_full %]
-  [% RETURN IF comment_text == '' AND (comment.work_time - 0) != 0 AND !user.is_timetracker %]
+[% BLOCK display_comments %]
+  [% FOREACH comment = comments %]
+    [% NEXT IF comment.is_private AND NOT (user.is_insider || user.id == comment.author.id) %]
+    [% comment_text = comment.body_full %]
+    [% NEXT IF comment_text == '' AND (comment.work_time - 0) != 0 AND !user.is_timetracker %]
 
     <div id="c[% comment.count %]" class="bz_comment[% " bz_private" IF comment.is_private %]
                 [% " bz_default_collapsed" IF comment.collapsed %]
@@ -92,7 +92,7 @@
             [% IF comment.collapsed %]
               <span class="bz_collapsed_actions">
             [% END %]
-            [% IF bug.check_can_change_field('longdesc', 0, 1) %]
+            [% IF can_edit_comments %]
               [% IF user.can_tag_comments %]
                 [<a href="#"
                     onclick="YAHOO.bugzilla.commentTagging.toggle([% comment.id %], [% comment.count %]);return false">tag</a>]
           </span>
         [% END %]
 
-        [% IF mode == "edit" && user.is_insider && bug.check_can_change_field('longdesc', 0, 1) %]
+        [% IF mode == "edit" && can_edit_comments && user.is_insider %]
           <div class="bz_private_checkbox">
             <input type="hidden" value="1"
                    name="defined_isprivate_[% comment.id %]">
 </[% user.use_markdown(comment) ? "div" : "pre" %]>
     [% Hook.process('a_comment-end', 'bug/comments.html.tmpl') %]
     </div>
+  [% END %]
 [% END %]