use PublicInbox::WwwStream qw(html_oneshot);
use PublicInbox::SearchThread;
use PublicInbox::SearchQuery;
+use PublicInbox::Search qw(mdocid);
my %rmap_inc;
sub mbox_results {
my ($ctx) = @_;
my $q = PublicInbox::SearchQuery->new($ctx->{qp});
- my $x = $q->{x};
+ if ($ctx->{env}->{'psgi.input'}->read(my $buf, 3)) {
+ $q->{t} = 1 if $buf =~ /\Ax=[^0]/;
+ }
require PublicInbox::Mbox;
- return PublicInbox::Mbox::mbox_all($ctx, $q->{'q'}) if $x eq 'm';
- sres_top_html($ctx);
+ $q->{x} eq 'm' ? PublicInbox::Mbox::mbox_all($ctx, $q) :
+ sres_top_html($ctx);
}
sub sres_top_html {
offset => $o,
mset => 1,
relevance => $q->{r},
+ thread => $q->{t},
asc => $asc,
};
my ($mset, $total, $err, $html);
my $pfx = ' ' x $pad;
my $res = \($ctx->{-html_tip});
my $ibx = $ctx->{-inbox};
- my $srch = $ibx->search;
my $obfs_ibx = $ibx->{obfuscate} ? $ibx : undef;
+ my @nums = @{$ibx->search->mset_to_artnums($mset)};
+ 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) {
sub search_nav_top {
my ($mset, $q, $ctx) = @_;
- my $m = $q->qs_html(x => 'm', r => undef);
+ my $m = $q->qs_html(x => 'm', r => undef, t => undef);
my $rv = qq{<form\naction="?$m"\nmethod="post"><pre>};
my $initial_q = $ctx->{-uxs_retried};
if (defined $initial_q) {
}
my $A = $q->qs_html(x => 'A', r => undef);
$rv .= qq{|<a\nhref="?$A">Atom feed</a>]};
- $rv .= qq{\n\t\t\t\t\t\tdownload: };
- $rv .= qq{<input\ntype=submit\nvalue="mbox.gz"/></pre></form><pre>};
+ if ($ctx->{-inbox}->search->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).
+ qq{<input\ntype=submit\nname=z\n} .
+ q{value="results only"/>} .
+ qq{|<input\ntype=submit\nname=x\n} .
+ q{value="full threads"/>};
+ } else { # BOFH needs to --reindex
+ $rv .= qq{\n\t\t\t\t\t\tdownload: } .
+ qq{<input\ntype=submit\nname=z\nvalue="mbox.gz"/>}
+ }
+ $rv .= qq{</pre></form><pre>};
}
sub search_nav_bot {
$n > 99 ? 99 : $n;
}
-sub load_msgs {
- my ($mset) = @_;
- [ map {
- my $mi = $_;
- my $smsg = PublicInbox::Smsg::from_mitem($mi);
- $smsg->{pct} = get_pct($mi);
- $smsg;
- } ($mset->items) ]
-}
-
sub mset_thread {
my ($ctx, $mset, $q) = @_;
my $ibx = $ctx->{-inbox};
- my $msgs = $ibx->search->retry_reopen(\&load_msgs, $mset);
+ 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 $r = $q->{r};
my $rootset = PublicInbox::SearchThread::thread($msgs,
$r ? \&sort_relevance : \&PublicInbox::View::sort_ds,
sub adump {
my ($cb, $mset, $q, $ctx) = @_;
- $ctx->{items} = [ $mset->items ];
+ $ctx->{ids} = $ctx->{-inbox}->search->mset_to_artnums($mset);
$ctx->{search_query} = $q; # used by WwwAtomStream::atom_header
PublicInbox::WwwAtomStream->response($ctx, 200, \&adump_i);
}
# callback for PublicInbox::WwwAtomStream::getline
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, $srch);
- } or next;
+ while (my $num = shift @{$ctx->{ids}}) {
+ my $smsg = eval { $ctx->{-inbox}->over->get_art($num) } or next;
return $smsg;
}
}