X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FSearch.pm;h=fb35b74752c88531fe3ad0c2c8774dcf598d1b38;hb=3bf9e1e4d8e5a84a0d8c733faf49555aa84379aa;hp=546884a9a1fc4867f80a97f95494f4330470f70b;hpb=1561be76574111a53c9d7c284fd03f68d6a5208b;p=public-inbox.git diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm index 546884a9..fb35b747 100644 --- a/lib/PublicInbox/Search.pm +++ b/lib/PublicInbox/Search.pm @@ -7,6 +7,7 @@ package PublicInbox::Search; use strict; use parent qw(Exporter); our @EXPORT_OK = qw(mdocid); +use List::Util qw(max); # values for searching, changing the numeric value breaks # compatibility with old indices (so don't change them it) @@ -203,7 +204,9 @@ sub _xdb ($) { # We need numeric sorting so shard[0] is first for reading # Xapian metadata, if needed - for (sort { $a <=> $b } grep(/\A[0-9]+\z/, readdir($dh))) { + my $last = max(grep(/\A[0-9]+\z/, readdir($dh))); + return if !defined($last); + for (0..$last) { my $shard_dir = "$dir/$_"; if (-d $shard_dir && -r _) { push @xdb, $X{Database}->new($shard_dir); @@ -265,8 +268,6 @@ sub new { ibx_ver => $ibx->version, }, $class; xpfx_init($self); - my $dir = xdir($self, 1); - $self->{over_ro} = PublicInbox::Over->new("$dir/over.sqlite3"); $self; } @@ -279,7 +280,7 @@ sub reopen { } # read-only -sub query { +sub mset { my ($self, $query_string, $opts) = @_; $opts ||= {}; my $qp = $self->{qp} //= qparse_new($self); @@ -346,17 +347,17 @@ sub _enquire_once { # retry_reopen callback if ($opts->{thread} && has_threadid($self)) { $enquire->set_collapse_key(THREADID); } + $enquire->get_mset($opts->{offset} || 0, $opts->{limit} || 50); +} - my $offset = $opts->{offset} || 0; - my $limit = $opts->{limit} || 50; - my $mset = $enquire->get_mset($offset, $limit); - return $mset if $opts->{mset}; +sub mset_to_smsg { + my ($self, $ibx, $mset) = @_; my $nshard = $self->{nshard} // 1; my $i = 0; my %order = map { mdocid($nshard, $_) => ++$i } $mset->items; my @msgs = sort { $order{$a->{num}} <=> $order{$b->{num}} - } @{$self->{over_ro}->get_all(keys %order)}; + } @{$ibx->over->get_all(keys %order)}; wantarray ? ($mset->get_matches_estimated, \@msgs) : \@msgs; }