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)
# 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);
ibx_ver => $ibx->version,
}, $class;
xpfx_init($self);
- my $dir = xdir($self, 1);
- $self->{over_ro} = PublicInbox::Over->new("$dir/over.sqlite3");
$self;
}
}
# read-only
-sub query {
+sub mset {
my ($self, $query_string, $opts) = @_;
$opts ||= {};
- if ($query_string eq '' && !$opts->{mset}) {
- $self->{over_ro}->recent($opts);
- } else {
- my $qp = $self->{qp} //= qparse_new($self);
- my $qp_flags = $self->{qp_flags};
- my $query = $qp->parse_query($query_string, $qp_flags);
- $opts->{relevance} = 1 unless exists $opts->{relevance};
- _do_enquire($self, $query, $opts);
- }
+ my $qp = $self->{qp} //= qparse_new($self);
+ my $query = $qp->parse_query($query_string, $self->{qp_flags});
+ $opts->{relevance} = 1 unless exists $opts->{relevance};
+ _do_enquire($self, $query, $opts);
}
sub retry_reopen {
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;
}