]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/SearchView.pm
searchview: speed up search summary by ~10%
[public-inbox.git] / lib / PublicInbox / SearchView.pm
index 921992a5d0c001bfe6faf2935292ad232ea30fcd..a3527057d7bbcc072401a80f0cc8bde0b5962e43 100644 (file)
@@ -4,15 +4,16 @@
 # Displays search results for the web interface
 package PublicInbox::SearchView;
 use strict;
-use warnings;
-use URI::Escape qw(uri_unescape uri_escape);
+use v5.10.1;
+use URI::Escape qw(uri_unescape);
 use PublicInbox::Smsg;
 use PublicInbox::Hval qw(ascii_html obfuscate_addrs mid_href);
 use PublicInbox::View;
 use PublicInbox::WwwAtomStream;
 use PublicInbox::WwwStream qw(html_oneshot);
 use PublicInbox::SearchThread;
-our $LIM = 200;
+use PublicInbox::SearchQuery;
+use PublicInbox::Search qw(mdocid);
 my %rmap_inc;
 
 sub mbox_results {
@@ -90,19 +91,22 @@ sub mset_summary {
        my $pfx = ' ' x $pad;
        my $res = \($ctx->{-html_tip});
        my $ibx = $ctx->{-inbox};
-       my $srch = $ibx->search;
+       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 $smsg = PublicInbox::Smsg::from_mitem($m, $srch);
-               unless ($smsg) {
+               my $num = shift @nums;
+               my $smsg = delete($num2msg{$num}) or do {
                        eval {
-                               $m = "$m ".$m->get_docid . " expired\n";
+                               $m = "$m $num expired\n";
                                $ctx->{env}->{'psgi.errors'}->print($m);
                        };
                        next;
-               }
+               };
                my $s = ascii_html($smsg->{subject});
                my $f = ascii_html($smsg->{from_name});
                if ($obfs_ibx) {
@@ -294,8 +298,7 @@ sub mset_thread {
 sub mset_thread_i {
        my ($ctx, $eml) = @_;
        $ctx->zmore($ctx->html_top) if exists $ctx->{-html_tip};
-       $eml and return PublicInbox::View::eml_entry($ctx, $ctx->{smsg}, $eml,
-                                               scalar @{$ctx->{msgs}});
+       $eml and return PublicInbox::View::eml_entry($ctx, $eml);
        my $smsg = shift @{$ctx->{msgs}} or
                $ctx->zmore(${delete($ctx->{skel})});
        $smsg;
@@ -322,7 +325,6 @@ sub adump {
        my ($cb, $mset, $q, $ctx) = @_;
        $ctx->{items} = [ $mset->items ];
        $ctx->{search_query} = $q; # used by WwwAtomStream::atom_header
-       $ctx->{srch} = $ctx->{-inbox}->search;
        PublicInbox::WwwAtomStream->response($ctx, 200, \&adump_i);
 }
 
@@ -330,58 +332,12 @@ sub adump {
 sub adump_i {
        my ($ctx) = @_;
        while (my $mi = shift @{$ctx->{items}}) {
+               my $srch = $ctx->{-inbox}->search(undef, $ctx) or return;
                my $smsg = eval {
-                       PublicInbox::Smsg::from_mitem($mi, $ctx->{srch});
+                       PublicInbox::Smsg::from_mitem($mi, $srch);
                } or next;
                return $smsg;
        }
 }
 
-package PublicInbox::SearchQuery;
-use strict;
-use warnings;
-use URI::Escape qw(uri_escape);
-use PublicInbox::MID qw(MID_ESC);
-
-sub new {
-       my ($class, $qp) = @_;
-
-       my $r = $qp->{r};
-       my ($l) = (($qp->{l} || '') =~ /([0-9]+)/);
-       $l = $LIM if !$l || $l > $LIM;
-       bless {
-               q => $qp->{'q'},
-               x => $qp->{x} || '',
-               o => (($qp->{o} || '0') =~ /(-?[0-9]+)/),
-               l => $l,
-               r => (defined $r && $r ne '0'),
-       }, $class;
-}
-
-sub qs_html {
-       my ($self, %override) = @_;
-
-       if (scalar(keys(%override))) {
-               $self = bless { (%$self, %override) }, ref($self);
-       }
-
-       my $q = uri_escape($self->{'q'}, MID_ESC);
-       $q =~ s/%20/+/g; # improve URL readability
-       my $qs = "q=$q";
-
-       if (my $o = $self->{o}) { # ignore o == 0
-               $qs .= "&o=$o";
-       }
-       if (my $l = $self->{l}) {
-               $qs .= "&l=$l" unless $l == $LIM;
-       }
-       if (my $r = $self->{r}) {
-               $qs .= "&r";
-       }
-       if (my $x = $self->{x}) {
-               $qs .= "&x=$x" if ($x eq 't' || $x eq 'A' || $x eq 'm');
-       }
-       $qs;
-}
-
 1;