Fix parsing of {DAV:}contains element

This commit is contained in:
Daniel Kesselberg 2019-11-03 11:34:31 +01:00
commit bef5795c98
3 changed files with 83 additions and 0 deletions

View file

@ -23,6 +23,7 @@ namespace SearchDAV\XML;
use Sabre\Xml\Reader; use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable; use Sabre\Xml\XmlDeserializable;
use SearchDAV\Query\Operator as QueryOperator;
class Operator implements XmlDeserializable { class Operator implements XmlDeserializable {
/** /**
@ -63,6 +64,13 @@ class Operator implements XmlDeserializable {
$reader->next(); $reader->next();
return $operator; return $operator;
} }
if ($operator->type === QueryOperator::OPERATION_CONTAINS) {
$operator->arguments[] = $reader->readString();
$reader->next();
return $operator;
}
$reader->read(); $reader->read();
do { do {
if ($reader->nodeType === Reader::ELEMENT) { if ($reader->nodeType === Reader::ELEMENT) {

View file

@ -142,4 +142,38 @@ class QueryParserTest extends \PHPUnit_Framework_TestCase {
$limit->maxResults = 10; $limit->maxResults = 10;
$this->assertEquals($limit, $search->limit); $this->assertEquals($limit, $search->limit);
} }
public function testParseComplexQuery() {
$query = file_get_contents(__DIR__ . '/complexquery.xml');
$parser = new QueryParser();
$xml = $parser->parse($query, null, $rootElementName);
$this->assertEquals('{DAV:}searchrequest', $rootElementName);
$this->assertArrayHasKey('{DAV:}basicsearch', $xml);
/** @var BasicSearch $search */
$search = $xml['{DAV:}basicsearch'];
$this->assertInstanceOf(BasicSearch::class, $search);
$this->assertEquals(['{DAV:}getcontentlength'], $search->select);
$this->assertEquals([
new Scope('/container1/', 'infinity')
], $search->from);
$this->assertEquals(new Operator(\SearchDAV\Query\Operator::OPERATION_AND, [
new Operator(\SearchDAV\Query\Operator::OPERATION_GREATER_THAN, [
'{DAV:}getcontentlength',
new Literal(10000)
]),
new Operator(\SearchDAV\Query\Operator::OPERATION_LESS_THAN, [
'{DAV:}getcontentlength',
new Literal(90000)
]),
new Operator(\SearchDAV\Query\Operator::OPERATION_CONTAINS, [
'Peter Forsberg'
]),
]), $search->where);
$this->assertEquals([
new Order('{DAV:}getcontentlength', \SearchDAV\Query\Order::ASC)
], $search->orderBy);
}
} }

41
tests/complexquery.xml Normal file
View file

@ -0,0 +1,41 @@
<?xml version="1.0"?>
<d:searchrequest xmlns:d="DAV:">
<d:basicsearch>
<d:select>
<d:prop>
<d:getcontentlength/>
</d:prop>
</d:select>
<d:from>
<d:scope>
<d:href>/container1/</d:href>
<d:depth>infinity</d:depth>
</d:scope>
</d:from>
<d:where>
<d:and>
<d:gt>
<d:prop>
<d:getcontentlength/>
</d:prop>
<d:literal>10000</d:literal>
</d:gt>
<d:lt>
<d:prop>
<d:getcontentlength/>
</d:prop>
<d:literal>90000</d:literal>
</d:lt>
<d:contains>Peter Forsberg</d:contains>
</d:and>
</d:where>
<d:orderby>
<d:order>
<d:prop>
<d:getcontentlength/>
</d:prop>
<d:ascending/>
</d:order>
</d:orderby>
</d:basicsearch>
</d:searchrequest>