From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 6B1D21F66E for ; Wed, 26 Aug 2020 22:02:57 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] search: allow testing with current xapian.git and 1.5.x Date: Wed, 26 Aug 2020 22:02:57 +0000 Message-Id: <20200826220257.1340-1-e@yhbt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: A `PI_XAPIAN' environment variable is now exposed for testing purposes. We'll also deal with the removal of `NumberValueRangeProcessor' and use `NumberRangeProcessor' in its place, but continue favoring the old Search::Xapian since that's all that's packaged for Debian 10.x stable. --- lib/PublicInbox/Search.pm | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm index 01bbe73d..b739faf1 100644 --- a/lib/PublicInbox/Search.pm +++ b/lib/PublicInbox/Search.pm @@ -54,19 +54,33 @@ use constant { use PublicInbox::Smsg; use PublicInbox::Over; my $QP_FLAGS; -our %X = map { $_ => 0 } qw(BoolWeight Database Enquire - NumberValueRangeProcessor QueryParser Stem); +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; sub load_xapian () { return 1 if defined $Xap; - for my $x (qw(Search::Xapian Xapian)) { + # n.b. PI_XAPIAN is intended for development use only. We still + # favor Search::Xapian since that's what's available in current + # Debian stable (10.x) and derived distros. + for my $x (($ENV{PI_XAPIAN} // 'Search::Xapian'), 'Xapian') { eval "require $x"; next if $@; $x->import(qw(:standard)); $Xap = $x; + + # `version_string' was added in Xapian 1.1 + my $xver = eval('v'.eval($x.'::version_string()')) // + eval('v'.eval($x.'::xapian_version_string()')); + + # NumberRangeProcessor was added in Xapian 1.3.6, + # NumberValueRangeProcessor was removed for 1.5.0+, + # favor the older /Value/ variant since that's what our + # (currently) preferred Search::Xapian supports + $NVRP = $x.'::'.($x eq 'Xapian' && $xver ge v1.5 ? + 'NumberRangeProcessor' : 'NumberValueRangeProcessor'); $X{$_} = $Xap.'::'.$_ for (keys %X); # ENQ_ASCENDING doesn't seem exported by SWIG Xapian.pm, @@ -364,15 +378,18 @@ sub qparse_new ($) { $qp->set_database($xdb); $qp->set_stemmer(stemmer($self)); $qp->set_stemming_strategy(STEM_SOME()); - $qp->set_max_wildcard_expansion(100); - my $nvrp = $X{NumberValueRangeProcessor}; - $qp->add_valuerangeprocessor($nvrp->new(YYYYMMDD, 'd:')); - $qp->add_valuerangeprocessor($nvrp->new(DT, 'dt:')); + my $cb = $qp->can('set_max_wildcard_expansion') // + $qp->can('set_max_expansion'); # Xapian 1.5.0+ + $cb->($qp, 100); + $cb = $qp->can('add_valuerangeprocessor') // + $qp->can('add_rangeprocessor'); # Xapian 1.5.0+ + $cb->($qp, $NVRP->new(YYYYMMDD, 'd:')); + $cb->($qp, $NVRP->new(DT, 'dt:')); # for IMAP, undocumented for WWW and may be split off go away - $qp->add_valuerangeprocessor($nvrp->new(BYTES, 'bytes:')); - $qp->add_valuerangeprocessor($nvrp->new(TS, 'ts:')); - $qp->add_valuerangeprocessor($nvrp->new(UID, 'uid:')); + $cb->($qp, $NVRP->new(BYTES, 'bytes:')); + $cb->($qp, $NVRP->new(TS, 'ts:')); + $cb->($qp, $NVRP->new(UID, 'uid:')); while (my ($name, $prefix) = each %bool_pfx_external) { $qp->add_boolean_prefix($name, $_) foreach split(/ /, $prefix);