]> Sergey Matveev's repositories - public-inbox.git/commitdiff
searchview: remove anonymous sub when sorting threads by relevance
authorEric Wong <e@80x24.org>
Wed, 25 Dec 2019 07:50:59 +0000 (07:50 +0000)
committerEric Wong <e@80x24.org>
Fri, 27 Dec 2019 20:00:37 +0000 (20:00 +0000)
We don't need to return a closure or have a separate hash
for sorting threads by relevance.  Instead, we can stuff
the relevance {pct} into the SearchMsg object itself and
use that.

Note: upon reviewing this code, the sort-by-relevance seems
bogus as it only considers the relevance of the topmost message.
Instead, it would make more sense to the user to sort by the
highest relevance of all messages in that particular thread.

lib/PublicInbox/SearchView.pm
lib/PublicInbox/View.pm

index 6aa815ca26e487271d48effa9e4f7806ba6d8f76..8cffdedbb33a27dce981fd4d503776de75c1b62d 100644 (file)
@@ -256,12 +256,10 @@ sub search_nav_bot {
 }
 
 sub sort_relevance {
-       my ($pct) = @_;
-       sub {
-               [ sort { (eval { $pct->{$b->topmost->{id}} } || 0)
-                               <=>
-                       (eval { $pct->{$a->topmost->{id}} } || 0)
-       } @{$_[0]} ] };
+       [ sort {
+               (eval { $b->topmost->{smsg}->{pct} } // 0) <=>
+               (eval { $a->topmost->{smsg}->{pct} } // 0)
+       } @{$_[0]} ]
 }
 
 sub get_pct ($) {
@@ -274,16 +272,15 @@ sub get_pct ($) {
 
 sub mset_thread {
        my ($ctx, $mset, $q) = @_;
-       my %pct;
        my $msgs = $ctx->{-inbox}->search->retry_reopen(sub { [ map {
                my $i = $_;
                my $smsg = PublicInbox::SearchMsg->load_doc($i->get_document);
-               $pct{$smsg->mid} = get_pct($i);
+               $smsg->{pct} = get_pct($i);
                $smsg;
        } ($mset->items) ]});
        my $r = $q->{r};
        my $rootset = PublicInbox::SearchThread::thread($msgs,
-               $r ? sort_relevance(\%pct) : \&PublicInbox::View::sort_ds,
+               $r ? \&sort_relevance : \&PublicInbox::View::sort_ds,
                $ctx);
        my $skel = search_nav_bot($mset, $q). "<pre>";
        $ctx->{-upfx} = '';
@@ -291,7 +288,7 @@ sub mset_thread {
        $ctx->{cur_level} = 0;
        $ctx->{dst} = \$skel;
        $ctx->{mapping} = {};
-       $ctx->{pct} = \%pct;
+       $ctx->{searchview} = 1;
        $ctx->{prev_attr} = '';
        $ctx->{prev_level} = 0;
        $ctx->{s_nr} = scalar(@$msgs).'+ results';
index 5c64441a8caefd26898512d31d539fd06328cc4d..6f827754f87d839910c3790ab389c25971c64593 100644 (file)
@@ -279,8 +279,8 @@ sub index_entry {
                " <a\nhref=\"${mhref}#R\">reply</a>";
 
        my $hr;
-       if (my $pct = $ctx->{pct}) { # used by SearchView.pm
-               $rv .= "\t[relevance $pct->{$mid_raw}%]";
+       if (defined(my $pct = $smsg->{pct})) { # used by SearchView.pm
+               $rv .= "\t[relevance $pct%]";
                $hr = 1;
        } elsif ($mapping) {
                my $nested = 'nested';
@@ -961,9 +961,8 @@ sub skel_dump {
 
        my $d = fmt_ts($smsg->{ds});
        my $unmatched; # if lazy-loaded by SearchThread::Msg::visible()
-       if (my $pct = $ctx->{pct}) {
-               $pct = $pct->{$smsg->{mid}};
-               if (defined $pct) {
+       if (exists $ctx->{searchview}) {
+               if (defined(my $pct = $smsg->{pct})) {
                        $d .= (sprintf(' % 2u', $pct) . '%');
                } else {
                        $unmatched = 1;
@@ -1031,7 +1030,7 @@ sub _skel_ghost {
 
        my $mid = $node->{id};
        my $d = '     [not found] ';
-       $d .= '    '  if exists $ctx->{pct};
+       $d .= '    '  if exists $ctx->{searchview};
        $d .= indent_for($level) . th_pfx($level);
        my $upfx = $ctx->{-upfx};
        my $m = PublicInbox::Hval->new_msgid($mid);