[Xapian-devel] Re: [Xapian-discuss] Xapian 1.0.1 released
Daniel Ménard
Daniel.Menard at bdsp.tm.fr
Tue Jun 12 16:10:07 BST 2007
Olly Betts a écrit :
> On Mon, Jun 11, 2007 at 08:11:11PM +0200, Daniel M?nard wrote:
>
>> 1. In xapian.php (php5), class XapianQuery, constants OP_AND and
>> OP_ELITE_SET are defined as integers (0 and 10)
>>
> So while this looks odd, it's harmless really (...)
>
that's ok for me,
>> 2. On windows, from the php bindings, I can't use SimpleStopper (apache
>> hangs).
> Do you have a complete (but ideally not too large) script which
> demonstrates this?
>
Trying to reproduce the bug, I think I found where it comes from...
Here is a simple script to reproduce the problem (I hope it's OK to post
here, if not, please tell me about other ways):
---[start]---
require_once dirname(__FILE__) . '/lib/xapian/xapian.php'; // the php5
OO wrapper
class Test
{
private $parser=null;
public function setup()
{
$this->parser=new XapianQueryParser();
$stopper=new XapianSimpleStopper(); // no need to add stopwords
to reproduce the bug
$this->parser->set_stopper($stopper);
}
public function parse($request)
{
return $this->parser->parse_Query($request); // hangs here when
qp tries to access stopper
}
}
$t=new test();
$t->setup();
echo $t->parse('a test of the query parser')->get_description();
echo "done\n"; // not reached
---[end]---
This script hangs under apache but also if you run it from the command
line (I'm using php 5.2.2). However, on my box, php cli gives no clue
about the problem : the only "symptoms" are that the final 'echo done'
is never reached and that an event is logged in the windows event viewer.
n.b. if the two functions are rewritten as a single one (setting up the
parser and using it just after), there's no problem.
Here is my guess about what happens:
The important point is that in setup(), $stopper is a local variable.
At the end of setup() the variable is deleted which, I think, causes
Xapian to free the underlying c++ object
(that's probably not correct as the parser still references it).
Then, $this->parser has a reference to a stopper which does no longer
exists and hangs the first time it tries to use it (in parse)...
Is-it a bug? My scenario is probably not the common usage (setting up
the query parser in one function, using it in another one).
On the other hand, the internal stopper should not be deleted if another
object still uses it, no?
A simpler way to demonstrate the problem could be:
---[start]---
$parser=new XapianQueryParser();
$parser->set_stopper(new XapianSimpleStopper());
$parser->parse_Query('a test for the query parser'); // hangs
---[end]---
Last, if my assumption is correct, perhaps there are other scenarios
where this problem can appear (like setting the weighting scheme for an
enquire in one place and using it elsewhere)? I can't easily test this
one...
>> 3. I was surprised by the precedence of the "NOT" operator:
>> QueryParser parses "a OR b NOT c" as "(a OR b) AND_NOT c"
>> I thought it would have been "a OR (b AND_NOT c)" but I'm probably wrong
>> as queryparser.lemony states that NOT has lower priority than OR...
>>
> I think you've misunderstood the comment - I believe it gives equal
> priority to NOT, OR, and XOR. All these are lower than AND.
>
you're right, I mixed up precedence and associativity... All operators
between %left and the next '.' have the same priority.
> Perhaps that's wrong - it seems like NOT should probably bind more
> tightly (...)
>
> So either most people don't notice (or care), or it's working as most
> people expect. I suspect the former, so it's probably OK to change
> this.
>
I also think that "not" should be given higher precedence, even if I was
not able to find doc from google/yahoo/others stating explicitly on that
point.
However, I'm not sure it is worth changing this if everyone is happy
with that (I was not asking for a change, just saying I was surprised)...
Cheers,
--
Daniel Ménard
More information about the Xapian-devel
mailing list