# Displays search results for the web interface
package PublicInbox::SearchView;
use strict;
-use warnings;
-use URI::Escape qw(uri_unescape uri_escape);
+use v5.10.1;
+use URI::Escape qw(uri_unescape);
use PublicInbox::Smsg;
use PublicInbox::Hval qw(ascii_html obfuscate_addrs mid_href);
use PublicInbox::View;
use PublicInbox::WwwAtomStream;
use PublicInbox::WwwStream qw(html_oneshot);
use PublicInbox::SearchThread;
-our $LIM = 200;
+use PublicInbox::SearchQuery;
+use PublicInbox::Search qw(mdocid);
my %rmap_inc;
sub mbox_results {
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) {
$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;
}
}
-package PublicInbox::SearchQuery;
-use strict;
-use warnings;
-use URI::Escape qw(uri_escape);
-use PublicInbox::MID qw(MID_ESC);
-
-sub new {
- my ($class, $qp) = @_;
-
- my $r = $qp->{r};
- my ($l) = (($qp->{l} || '') =~ /([0-9]+)/);
- $l = $LIM if !$l || $l > $LIM;
- bless {
- q => $qp->{'q'},
- x => $qp->{x} || '',
- o => (($qp->{o} || '0') =~ /(-?[0-9]+)/),
- l => $l,
- r => (defined $r && $r ne '0'),
- }, $class;
-}
-
-sub qs_html {
- my ($self, %override) = @_;
-
- if (scalar(keys(%override))) {
- $self = bless { (%$self, %override) }, ref($self);
- }
-
- my $q = uri_escape($self->{'q'}, MID_ESC);
- $q =~ s/%20/+/g; # improve URL readability
- my $qs = "q=$q";
-
- if (my $o = $self->{o}) { # ignore o == 0
- $qs .= "&o=$o";
- }
- if (my $l = $self->{l}) {
- $qs .= "&l=$l" unless $l == $LIM;
- }
- if (my $r = $self->{r}) {
- $qs .= "&r";
- }
- if (my $x = $self->{x}) {
- $qs .= "&x=$x" if ($x eq 't' || $x eq 'A' || $x eq 'm');
- }
- $qs;
-}
-
1;