fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2011-05-12 10:11 am

[dw-free] negative "load tags" result is not cached, results in large amount of queries

[commit: http://hg.dwscoalition.org/dw-free/rev/454004989469]

http://bugs.dwscoalition.org/show_bug.cgi?id=3661

Cache results when journal has no tags.

Patch by [personal profile] exor674.

Files modified:
  • cgi-bin/LJ/Tags.pm
--------------------------------------------------------------------------------
diff -r bafea8052e02 -r 454004989469 cgi-bin/LJ/Tags.pm
--- a/cgi-bin/LJ/Tags.pm	Thu May 12 18:02:17 2011 +0800
+++ b/cgi-bin/LJ/Tags.pm	Thu May 12 18:11:15 2011 +0800
@@ -171,19 +171,18 @@
         my $dbcr = ($dbcrs{$cid} ||= LJ::get_cluster_def_reader($cid))
             or next;
 
+        my @all_jids = map { $_ + 0 } keys %{$need{$cid}};
+
         # get the tags from the database
-        my $in = join(',', map { $_ + 0 } keys %{$need{$cid}});
+        my $in = join(',', @all_jids);
         my $tagrows = $dbcr->selectall_arrayref("SELECT journalid, kwid, parentkwid, display FROM usertags WHERE journalid IN ($in)");
-        next if $dbcr->err || ! $tagrows;
+        next if $dbcr->err;
 
         # break down into data structures
         my %tags; # ( jid => { kwid => display } )
         $tags{$_->[0]}->{$_->[1]} = $_->[3]
             foreach @$tagrows;
 
-        # if they have no tags...
-        next unless %tags;
-
         # now turn this into a tentative results hash: { userid => { tagid => { name => tagname, ... }, ... } }
         # this is done by combining the information we got from the tags lookup along with
         # the stuff from the keyword lookup.  we need the relevant rows from both sources
@@ -209,11 +208,14 @@
         # get security counts
         my @resjids = keys %$res;
         my $ids = join(',', map { $_+0 } @resjids);
-        next unless $ids;
+
+        my $counts = [];
 
         # populate security counts
-        my $counts = $dbcr->selectall_arrayref("SELECT journalid, kwid, security, entryct FROM logkwsum WHERE journalid IN ($ids)");
-        next if $dbcr->err || ! $counts;
+        if ( @resjids ) {
+            $counts = $dbcr->selectall_arrayref("SELECT journalid, kwid, security, entryct FROM logkwsum WHERE journalid IN ($ids)");
+            next if $dbcr->err;
+        }
 
         # setup some helper values
         my $public_mask = 1 << 63;
@@ -253,7 +255,8 @@
         }
 
         # default securities to private and store to memcache
-        foreach my $jid (@resjids) {
+        foreach my $jid (@all_jids) {
+            $res->{$jid} ||= {};
             $res->{$jid}->{$_}->{security_level} ||= 'private'
                 foreach keys %{$res->{$jid}};
 
--------------------------------------------------------------------------------

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org