]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/SearchView.pm
get rid of unnecessary bytes::length usage
[public-inbox.git] / lib / PublicInbox / SearchView.pm
index c482f1c9ba306efd2f1879686de2721a75b1068e..c0c801b321c6bc389ee1a28bd651e92276b9a3ca 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2015-2020 all contributors <meta@public-inbox.org>
+# Copyright (C) 2015-2021 all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 #
 # Displays search results for the web interface
@@ -14,7 +14,7 @@ use PublicInbox::WwwAtomStream;
 use PublicInbox::WwwStream qw(html_oneshot);
 use PublicInbox::SearchThread;
 use PublicInbox::SearchQuery;
-use PublicInbox::Search qw(mdocid);
+use PublicInbox::Search qw(get_pct);
 my %rmap_inc;
 
 sub mbox_results {
@@ -30,11 +30,10 @@ sub mbox_results {
 
 sub sres_top_html {
        my ($ctx) = @_;
-       my $srch = $ctx->{-inbox}->search or
+       my $srch = $ctx->{ibx}->isrch or
                return PublicInbox::WWW::need($ctx, 'Search');
        my $q = PublicInbox::SearchQuery->new($ctx->{qp});
        my $x = $q->{x};
-       my $query = $q->{'q'};
        my $o = $q->{o};
        my $asc;
        if ($o < 0) {
@@ -48,12 +47,14 @@ sub sres_top_html {
                limit => $q->{l},
                offset => $o,
                relevance => $q->{r},
-               thread => $q->{t},
+               threads => $q->{t},
                asc => $asc,
        };
        my ($mset, $total, $err, $html);
 retry:
        eval {
+               my $query = $q->{'q'};
+               $srch->query_approxidate($ctx->{ibx}->git, $query);
                $mset = $srch->mset($query, $opts);
                $total = $mset->get_matches_estimated;
        };
@@ -93,15 +94,13 @@ sub mset_summary {
        my $pad = length("$total");
        my $pfx = ' ' x $pad;
        my $res = \($ctx->{-html_tip});
-       my $ibx = $ctx->{-inbox};
+       my $ibx = $ctx->{ibx};
        my $obfs_ibx = $ibx->{obfuscate} ? $ibx : undef;
-       my @nums = @{$ibx->search->mset_to_artnums($mset)};
+       my @nums = @{$ibx->isrch->mset_to_artnums($mset)};
        my %num2msg = map { $_->{num} => $_ } @{$ibx->over->get_all(@nums)};
-       my ($min, $max);
+       my ($min, $max, %seen);
 
        foreach my $m ($mset->items) {
-               my $rank = sprintf("%${pad}d", $m->get_rank + 1);
-               my $pct = get_pct($m);
                my $num = shift @nums;
                my $smsg = delete($num2msg{$num}) or do {
                        eval {
@@ -110,7 +109,12 @@ sub mset_summary {
                        };
                        next;
                };
+               my $mid = $smsg->{mid};
+               next if $seen{$mid}++;
+               $mid = mid_href($mid);
                $ctx->{-t_max} //= $smsg->{ts};
+               my $rank = sprintf("%${pad}d", $m->get_rank + 1);
+               my $pct = get_pct($m);
 
                # only when sorting by relevance, ->items is always
                # ordered descending:
@@ -124,7 +128,6 @@ sub mset_summary {
                        obfuscate_addrs($obfs_ibx, $f);
                }
                my $date = fmt_ts($smsg->{ds});
-               my $mid = mid_href($smsg->{mid});
                $s = '(no subject)' if $s eq '';
                $$res .= qq{$rank. <b><a\nhref="$mid/">}.
                        $s . "</a></b>\n";
@@ -156,7 +159,7 @@ sub path2inc ($) {
 
 sub err_txt {
        my ($ctx, $err) = @_;
-       my $u = $ctx->{-inbox}->base_url($ctx->{env}) . '_/text/help/';
+       my $u = $ctx->{ibx}->base_url($ctx->{env}) . '_/text/help/';
        $err =~ s/^\s*Exception:\s*//; # bad word to show users :P
        $err =~ s!(\S+)!path2inc($1)!sge;
        $err = ascii_html($err);
@@ -201,7 +204,7 @@ sub search_nav_top {
        }
        my $A = $q->qs_html(x => 'A', r => undef);
        $rv .= qq{|<a\nhref="?$A">Atom feed</a>]};
-       if ($ctx->{-inbox}->search->has_threadid) {
+       if ($ctx->{ibx}->isrch->has_threadid) {
                $rv .= qq{\n\t\t\tdownload mbox.gz: } .
                        # we set name=z w/o using it since it seems required for
                        # lynx (but works fine for w3m).
@@ -216,7 +219,7 @@ sub search_nav_top {
        $rv .= qq{</pre></form><pre>};
 }
 
-sub search_nav_bot {
+sub search_nav_bot { # also used by WwwListing for searching extindex miscidx
        my ($mset, $q) = @_;
        my $total = $mset->get_matches_estimated;
        my $l = $q->{l};
@@ -276,24 +279,15 @@ sub sort_relevance {
        } @{$_[0]} ]
 }
 
-sub get_pct ($) {
-       # Capped at "99%" since "100%" takes an extra column in the
-       # thread skeleton view.  <xapian/mset.h> says the value isn't
-       # very meaningful, anyways.
-       my $n = $_[0]->get_percent;
-       $n > 99 ? 99 : $n;
-}
-
 sub mset_thread {
        my ($ctx, $mset, $q) = @_;
-       my $ibx = $ctx->{-inbox};
-       my $nshard = $ibx->search->{nshard} // 1;
-       my %pct = map { mdocid($nshard, $_) => get_pct($_) } $mset->items;
-       my $msgs = $ibx->over->get_all(keys %pct);
-       $_->{pct} = $pct{$_->{num}} for @$msgs;
+       my $ibx = $ctx->{ibx};
+       my @pct = map { get_pct($_) } $mset->items;
+       my $msgs = $ibx->isrch->mset_to_smsg($ibx, $mset);
+       my $i = 0;
+       $_->{pct} = $pct[$i++] for @$msgs;
        my $r = $q->{r};
        if ($r) { # for descriptions in search_nav_bot
-               my @pct = values %pct;
                $q->{-min_pct} = min(@pct);
                $q->{-max_pct} = max(@pct);
        }
@@ -354,7 +348,7 @@ sub ctx_prepare {
 
 sub adump {
        my ($cb, $mset, $q, $ctx) = @_;
-       $ctx->{ids} = $ctx->{-inbox}->search->mset_to_artnums($mset);
+       $ctx->{ids} = $ctx->{ibx}->isrch->mset_to_artnums($mset);
        $ctx->{search_query} = $q; # used by WwwAtomStream::atom_header
        PublicInbox::WwwAtomStream->response($ctx, 200, \&adump_i);
 }
@@ -363,7 +357,7 @@ sub adump {
 sub adump_i {
        my ($ctx) = @_;
        while (my $num = shift @{$ctx->{ids}}) {
-               my $smsg = eval { $ctx->{-inbox}->over->get_art($num) } or next;
+               my $smsg = eval { $ctx->{ibx}->over->get_art($num) } or next;
                return $smsg;
        }
 }