about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-08-20 20:24:50 +0000
committerEric Wong <e@yhbt.net>2020-08-20 21:11:18 +0000
commit5a69dffc4155c8810dd8f2f3474f7a8a5c6d16a2 (patch)
tree4f2bea8a7bd03dd46a663f5e04cccebf19977d90 /lib
parentc703745bcd09af545ef1bd320c895778081488d2 (diff)
downloadpublic-inbox-5a69dffc4155c8810dd8f2f3474f7a8a5c6d16a2.tar.gz
Instead of loading one article at-a-time from over.sqlite3, we
can use SQL to mass-load IN (?,?, ...) all results with a single
SQLite query.  Despite SQLite being in-process and having no
network latency, the reduction in SQL query executions from
loading multiple rows at once speeds things up significantly.

We'll keep the over->get_art optimizations from the previous
commit, since it still speeds up long-lived responses, slightly.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/Over.pm9
-rw-r--r--lib/PublicInbox/SearchView.pm12
2 files changed, 15 insertions, 6 deletions
diff --git a/lib/PublicInbox/Over.pm b/lib/PublicInbox/Over.pm
index 80e57e62..a055b4cd 100644
--- a/lib/PublicInbox/Over.pm
+++ b/lib/PublicInbox/Over.pm
@@ -104,6 +104,15 @@ ORDER BY num ASC
 
 }
 
+sub get_all {
+        my $self = shift;
+        my $nr = scalar(@_) or return [];
+        my $in = '?' . (',?' x ($nr - 1));
+        do_get($self, <<"", { cull => 1, limit => $nr }, @_);
+SELECT num,ds,ddd FROM over WHERE num IN ($in)
+
+}
+
 sub nothing () { wantarray ? (0, []) : [] };
 
 sub get_thread {
diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm
index 61534c25..a3527057 100644
--- a/lib/PublicInbox/SearchView.pm
+++ b/lib/PublicInbox/SearchView.pm
@@ -91,22 +91,22 @@ sub mset_summary {
         my $pfx = ' ' x $pad;
         my $res = \($ctx->{-html_tip});
         my $ibx = $ctx->{-inbox};
-        my $over = $ibx->over;
         my $nshard = $ibx->search->{nshard} // 1;
         my $obfs_ibx = $ibx->{obfuscate} ? $ibx : undef;
+        my @nums = map { mdocid($nshard, $_) } $mset->items;
+        my %num2msg = map { $_->{num} => $_ } @{$ibx->over->get_all(@nums)};
+
         foreach my $m ($mset->items) {
                 my $rank = sprintf("%${pad}d", $m->get_rank + 1);
                 my $pct = get_pct($m);
-                my $num = mdocid($nshard, $m);
-                my $smsg = $over->get_art($num, 1);
-                unless ($smsg) {
+                my $num = shift @nums;
+                my $smsg = delete($num2msg{$num}) or do {
                         eval {
                                 $m = "$m $num expired\n";
                                 $ctx->{env}->{'psgi.errors'}->print($m);
                         };
                         next;
-                }
-                PublicInbox::Smsg::psgi_cull($smsg);
+                };
                 my $s = ascii_html($smsg->{subject});
                 my $f = ascii_html($smsg->{from_name});
                 if ($obfs_ibx) {