lib/PublicInbox/SearchThread.pm | 10 ++++++++++ lib/PublicInbox/SearchView.pm | 5 +++-- lib/PublicInbox/View.pm | 4 ++-- diff --git a/lib/PublicInbox/SearchThread.pm b/lib/PublicInbox/SearchThread.pm index 24a56d2d965a4826f2d9e25fc586f5278921523d..fe70406b0cbad163f2b52f23d9bda019367e55d4 100644 --- a/lib/PublicInbox/SearchThread.pm +++ b/lib/PublicInbox/SearchThread.pm @@ -98,6 +98,16 @@ children => {}, # becomes an array when sorted by ->order(...) }, $_[0]; } +sub topmost { + my ($self) = @_; + my @q = ($self); + while (my $cont = shift @q) { + return $cont if $cont->{smsg}; + push @q, values %{$cont->{children}}; + } + undef; +} + sub add_child { my ($self, $child) = @_; croak "Cowardly refusing to become my own parent: $self" diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm index cfe6dfffa454d14e55cea7d452a1890873a43b2a..ebeb41f7a153ffbd69d137600261a85d5ea5d14e 100644 --- a/lib/PublicInbox/SearchView.pm +++ b/lib/PublicInbox/SearchView.pm @@ -155,8 +155,9 @@ my $th = PublicInbox::SearchThread->new(\@m); $th->thread; if ($q->{r}) { # order by relevance $th->order(sub { - [ sort { ( $pct{$b->{id}} || 0) <=> - ( $pct{$a->{id}} || 0) + [ sort { (eval { $pct{$b->topmost->{id}} } || 0) + <=> + (eval { $pct{$a->topmost->{id}} } || 0) } @{$_[0]} ]; }); } else { # order by time (default for threaded view) diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 0f00458eb0a68249dfa6fdc381f0e7eb32b71d0e..5d5808fad5b2176307e579d5108ad4e7284fd2db 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -852,8 +852,8 @@ } sub sort_ts { [ sort { - (eval { $a->{smsg}->ts } || 0) <=> - (eval { $b->{smsg}->ts } || 0) + (eval { $a->topmost->{smsg}->ts } || 0) <=> + (eval { $b->topmost->{smsg}->ts } || 0) } @{$_[0]} ]; }