package PublicInbox::Search;
use strict;
use parent qw(Exporter);
-our @EXPORT_OK = qw(mdocid);
+our @EXPORT_OK = qw(retry_reopen);
use List::Util qw(max);
# values for searching, changing the numeric value breaks
use PublicInbox::Smsg;
use PublicInbox::Over;
-my $QP_FLAGS;
+our $QP_FLAGS;
our %X = map { $_ => 0 } qw(BoolWeight Database Enquire QueryParser Stem);
our $Xap; # 'Search::Xapian' or 'Xapian'
-my $NVRP; # '$Xap::'.('NumberValueRangeProcessor' or 'NumberRangeProcessor')
-my $ENQ_ASCENDING;
+our $NVRP; # '$Xap::'.('NumberValueRangeProcessor' or 'NumberRangeProcessor')
+our $ENQ_ASCENDING;
sub load_xapian () {
return 1 if defined $Xap;
}
}
-sub _xdb_sharded {
- my ($self, $xpfx) = @_;
- opendir(my $dh, $xpfx) or return; # not initialized yet
+sub xdb_sharded {
+ my ($self) = @_;
+ opendir(my $dh, $self->{xpfx}) or return; # not initialized yet
# We need numeric sorting so shard[0] is first for reading
# Xapian metadata, if needed
return if !defined($last);
my (@xdb, $slow_phrase);
for (0..$last) {
- my $shard_dir = "$xpfx/$_";
+ my $shard_dir = "$self->{xpfx}/$_";
if (-d $shard_dir && -r _) {
push @xdb, $X{Database}->new($shard_dir);
$slow_phrase ||= -f "$shard_dir/iamchert";
my $dir = xdir($self, 1);
$self->{qp_flags} //= $QP_FLAGS;
if ($self->{ibx_ver} >= 2) {
- _xdb_sharded($self, $dir);
+ xdb_sharded($self);
} else {
$self->{qp_flags} |= FLAG_PHRASE() if !-f "$dir/iamchert";
$X{Database}->new($dir);
}
sub retry_reopen {
- my ($self, $cb, $arg) = @_;
+ my ($self, $cb, @arg) = @_;
for my $i (1..10) {
if (wantarray) {
my @ret;
- eval { @ret = $cb->($arg) };
+ eval { @ret = $cb->($self, @arg) };
return @ret unless $@;
} else {
my $ret;
- eval { $ret = $cb->($arg) };
+ eval { $ret = $cb->($self, @arg) };
return $ret unless $@;
}
# Exception: The revision being read has been discarded -
sub _do_enquire {
my ($self, $query, $opts) = @_;
- retry_reopen($self, \&_enquire_once, [ $self, $query, $opts ]);
+ retry_reopen($self, \&_enquire_once, $query, $opts);
}
# returns true if all docs have the THREADID value
}
sub _enquire_once { # retry_reopen callback
- my ($self, $query, $opts) = @{$_[0]};
+ my ($self, $query, $opts) = @_;
my $xdb = xdb($self);
my $enquire = $X{Enquire}->new($xdb);
$enquire->set_query($query);