X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FSearchThread.pm;h=38d1aa6e2c99e961b7caae4562adf840ef5e59b8;hb=4da62f284003d75abe7cb35594414eb2224f42bc;hp=be29098073cab4bd1f67884750c5ee273e572336;hpb=c204da04aa24e85236f82ba5a7c6c7e19c8a20d3;p=public-inbox.git diff --git a/lib/PublicInbox/SearchThread.pm b/lib/PublicInbox/SearchThread.pm index be290980..38d1aa6e 100644 --- a/lib/PublicInbox/SearchThread.pm +++ b/lib/PublicInbox/SearchThread.pm @@ -20,24 +20,26 @@ package PublicInbox::SearchThread; use strict; use warnings; +use PublicInbox::MID qw($MID_EXTRACT); sub thread { - my ($msgs, $ordersub, $ibx) = @_; + my ($msgs, $ordersub, $ctx) = @_; my $id_table = {}; # Sadly, we sort here anyways since the fill-in-the-blanks References: # can be shakier if somebody used In-Reply-To with multiple, disparate # messages. So, take the client Date: into account since we can't - # alway determine ordering when somebody uses multiple In-Reply-To. + # always determine ordering when somebody uses multiple In-Reply-To. # We'll trust the client Date: header here instead of the Received: # time since this is for display (and not retrieval) _add_message($id_table, $_) for sort { $a->{ds} <=> $b->{ds} } @$msgs; + my $ibx = $ctx->{-inbox}; my $rootset = [ grep { !delete($_->{parent}) && $_->visible($ibx) } values %$id_table ]; $id_table = undef; $rootset = $ordersub->($rootset); - $_->order_children($ordersub, $ibx) for @$rootset; + $_->order_children($ordersub, $ctx) for @$rootset; $rootset; } @@ -53,6 +55,11 @@ sub _add_message ($$) { my $this = _get_cont_for_id($id_table, $smsg->{mid}); $this->{smsg} = $smsg; + # saves around 4K across 1K messages + # TODO: move this to a more appropriate place, breaks tests + # if we do it during psgi_cull + delete $smsg->{num}; + # B. For each element in the message's References field: defined(my $refs = $smsg->{references}) or return; @@ -61,7 +68,7 @@ sub _add_message ($$) { # everything is perfectly referenced, only the last ref # matters. my $prev; - foreach my $ref ($refs =~ m/<([^>]+)>/g) { + foreach my $ref ($refs =~ m/$MID_EXTRACT/go) { # Find a Container object for the given Message-ID my $cont = _get_cont_for_id($id_table, $ref); @@ -146,10 +153,11 @@ sub visible ($$) { } sub order_children { - my ($cur, $ordersub, $ibx) = @_; + my ($cur, $ordersub, $ctx) = @_; my %seen = ($cur => 1); # self-referential loop prevention my @q = ($cur); + my $ibx = $ctx->{-inbox}; while (defined($cur = shift @q)) { my $c = $cur->{children}; # The hashref here...