# n.b. FLAG_PURE_NOT is expensive not suitable for a public
# website as it could become a denial-of-service vector
- # FLAG_PHRASE also seems to cause performance problems
- # sometimes.
+ # FLAG_PHRASE also seems to cause performance problems chert
+ # (and probably earlier Xapian DBs). glass seems fine...
# TODO: make this an option, maybe?
# or make indexlevel=medium as default
FLAG_PHRASE()|FLAG_BOOLEAN()|FLAG_LOVEHATE()|FLAG_WILDCARD();
my $dir = "$self->{mainrepo}/xap" . SCHEMA_VERSION;
return $dir if $rdonly;
- my $part = $self->{partition};
- defined $part or die "partition not given";
- $dir .= "/$part";
+ my $shard = $self->{shard};
+ defined $shard or die "shard not given";
+ $dir .= "/$shard";
}
}
+sub _xdb ($) {
+ my ($self) = @_;
+ my $dir = xdir($self, 1);
+ my ($xdb, $slow_phrase);
+ my $qpf = \($self->{qp_flags} ||= $QP_FLAGS);
+ if ($self->{version} >= 2) {
+ foreach my $shard (<$dir/*>) {
+ -d $shard && $shard =~ m!/[0-9]+\z! or next;
+ my $sub = Search::Xapian::Database->new($shard);
+ if ($xdb) {
+ $xdb->add_database($sub);
+ } else {
+ $xdb = $sub;
+ }
+ $slow_phrase ||= -f "$shard/iamchert";
+ }
+ } else {
+ $slow_phrase = -f "$dir/iamchert";
+ $xdb = Search::Xapian::Database->new($dir);
+ }
+ $$qpf |= FLAG_PHRASE() unless $slow_phrase;
+ $xdb;
+}
+
sub xdb ($) {
my ($self) = @_;
$self->{xdb} ||= do {
load_xapian();
- my $dir = xdir($self, 1);
- if ($self->{version} >= 2) {
- my $xdb;
- foreach my $part (<$dir/*>) {
- -d $part && $part =~ m!/\d+\z! or next;
- my $sub = Search::Xapian::Database->new($part);
- if ($xdb) {
- $xdb->add_database($sub);
- } else {
- $xdb = $sub;
- }
- }
- $xdb;
- } else {
- Search::Xapian::Database->new($dir);
- }
+ _xdb($self);
};
}
sub new {
- my ($class, $mainrepo, $altid) = @_;
- my $version = 1;
- my $ibx = $mainrepo;
- if (ref $ibx) {
- $version = $ibx->{version} || 1;
- $mainrepo = $ibx->{mainrepo};
- }
+ my ($class, $ibx) = @_;
+ ref $ibx or die "BUG: expected PublicInbox::Inbox object: $ibx";
my $self = bless {
- mainrepo => $mainrepo,
- altid => $altid,
- version => $version,
+ mainrepo => $ibx->{mainrepo},
+ altid => $ibx->{altid},
+ version => $ibx->{version} // 1,
}, $class;
my $dir = xdir($self, 1);
$self->{over_ro} = PublicInbox::Over->new("$dir/over.sqlite3");
$self->{over_ro}->recent($opts);
} else {
my $qp = qp($self);
- my $query = $qp->parse_query($query_string, $QP_FLAGS);
+ 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);
}
warn "reopen try #$i on $@\n";
reopen($self);
} else {
- warn "ref: ", ref($@), "\n";
+ # let caller decide how to spew, because ExtMsg queries
+ # get wonky and trigger:
+ # "something terrible happened at .../Xapian/Enquire.pm"
die;
}
}