perl bindings to Xapian::Query
Olly Betts
olly at survex.com
Tue Sep 12 22:41:34 BST 2017
On Tue, Sep 12, 2017 at 04:47:52PM -0400, Alex Aminoff wrote:
> my $filterepoch = time() - ($datefilter * 60 * 60 * 24);
> my $filterquery =
> Xapian::Query->new(OP_VALUE_GE,I_DATE,$filterepoch);
I think your issue here is that $filterepoch is a number rather than
a string (a Perl scalar can have different representations internally).
In t/valuerange.t this testcase works:
| ok( $query = Xapian::Query->new(OP_VALUE_GE, 0, "two") );
But if I change that "two" to 2 then I get the same error you report.
While such sensitivity to the actual current representation of a scalar
isn't very Perl-ish, it does actually indicate a problem with your code -
OP_VALUE_GE performs a *string* >= (like Perl's own "ge"), so if you give it
variable width integers (like the above would if $filterepoch were silently
coerced to a string) then you won't in general get the correct filtering
- for example, "100" < "99".
I'd suggest formatting as a fixed width string value (left padded with
zeros or spaces) or packing into a big-endian binary value (e.g.
pack("N", $filterepoch)) or using Xapian::sortable_serialise().
Xapian::sortable_serialise() is particularly useful with floating
point values, but even with integers it produces fairly compact output
(much better than a fixed width string).
> I should say that I am using xapian-bindings-1.4.4 which I compiled and
> installed myself.
In case you missed the warning in the README:
| Perl These Perl bindings are generated by SWIG, and are intended
| to replace the hand-written Search::Xapian XS bindings.
| The current API should be regarded as experimental - we plan
| to review it, possibly make some changes and then declare it
| stable early in the 1.4.x release series. [...]
Sadly I've still not found time to sort that out.
If you're happy to potentially have to tweak your code, the SWIG-based
Perl bindings in 1.4.x certainly aren't a bad choice.
But if you prefer something that's got a stable API, then Search::Xapian
1.2.x should work with xapian-core 1.4.x (its main downside is that it
doesn't wrap the C++ API as completely as the SWIG-based bindings do).
Cheers,
Olly
More information about the Xapian-discuss
mailing list