Commit 87641c84 authored by Bas de Nooijer's avatar Bas de Nooijer Committed by GitHub

Merge pull request #452 from MyHammer/nested_documents

add basic support for nested documents
parents 75113025 b6c66a86
...@@ -131,13 +131,7 @@ class RequestBuilder extends BaseRequestBuilder ...@@ -131,13 +131,7 @@ class RequestBuilder extends BaseRequestBuilder
foreach ($doc->getFields() as $name => $value) { foreach ($doc->getFields() as $name => $value) {
$boost = $doc->getFieldBoost($name); $boost = $doc->getFieldBoost($name);
$modifier = $doc->getFieldModifier($name); $modifier = $doc->getFieldModifier($name);
if (is_array($value)) { $xml .= $this->buildFieldsXml($name, $boost, $value, $modifier, $query);
foreach ($value as $multival) {
$xml .= $this->buildFieldXml($name, $boost, $multival, $modifier, $query);
}
} else {
$xml .= $this->buildFieldXml($name, $boost, $value, $modifier, $query);
}
} }
$version = $doc->getVersion(); $version = $doc->getVersion();
...@@ -164,10 +158,10 @@ class RequestBuilder extends BaseRequestBuilder ...@@ -164,10 +158,10 @@ class RequestBuilder extends BaseRequestBuilder
{ {
$xml = '<delete>'; $xml = '<delete>';
foreach ($command->getIds() as $id) { foreach ($command->getIds() as $id) {
$xml .= '<id>'.htmlspecialchars($id, ENT_NOQUOTES, 'UTF-8').'</id>'; $xml .= '<id>' . htmlspecialchars($id, ENT_NOQUOTES, 'UTF-8') . '</id>';
} }
foreach ($command->getQueries() as $query) { foreach ($command->getQueries() as $query) {
$xml .= '<query>'.htmlspecialchars($query, ENT_NOQUOTES, 'UTF-8').'</query>'; $xml .= '<query>' . htmlspecialchars($query, ENT_NOQUOTES, 'UTF-8') . '</query>';
} }
$xml .= '</delete>'; $xml .= '</delete>';
...@@ -239,7 +233,7 @@ class RequestBuilder extends BaseRequestBuilder ...@@ -239,7 +233,7 @@ class RequestBuilder extends BaseRequestBuilder
$value = $query->getHelper()->formatDate($value); $value = $query->getHelper()->formatDate($value);
} }
$xml = '<field name="'.$name.'"'; $xml = '<field name="' . $name . '"';
$xml .= $this->attrib('boost', $boost); $xml .= $this->attrib('boost', $boost);
$xml .= $this->attrib('update', $modifier); $xml .= $this->attrib('update', $modifier);
if ($value === null) { if ($value === null) {
...@@ -250,9 +244,42 @@ class RequestBuilder extends BaseRequestBuilder ...@@ -250,9 +244,42 @@ class RequestBuilder extends BaseRequestBuilder
$value = 'true'; $value = 'true';
} }
$xml .= '>'.htmlspecialchars($value, ENT_NOQUOTES, 'UTF-8'); $xml .= '>' . htmlspecialchars($value, ENT_NOQUOTES, 'UTF-8');
$xml .= '</field>'; $xml .= '</field>';
return $xml; return $xml;
} }
/**
* @param string $key
*
* @param float $boost
* @param mixed $value
* @param string $modifier
* @param UpdateQuery $query
* @return string
*/
private function buildFieldsXml($key, $boost, $value, $modifier, $query)
{
$xml = '';
if (is_array($value)) {
foreach ($value as $multival) {
if (is_array($multival)) {
$xml .= '<doc>';
foreach ($multival as $k => $v) {
$xml .= $this->buildFieldsXml($k, $boost, $v, $modifier, $query);
}
$xml .= '</doc>';
} else {
$xml .= $this->buildFieldXml($key, $boost, $multival, $modifier, $query);
}
}
} else {
$xml .= $this->buildFieldXml($key, $boost, $value, $modifier, $query);
}
return $xml;
}
} }
...@@ -31,15 +31,15 @@ ...@@ -31,15 +31,15 @@
namespace Solarium\Tests\QueryType\Update; namespace Solarium\Tests\QueryType\Update;
use Solarium\QueryType\Update\Query\Query;
use Solarium\QueryType\Update\RequestBuilder;
use Solarium\Core\Client\Request; use Solarium\Core\Client\Request;
use Solarium\QueryType\Update\Query\Command\Add as AddCommand; use Solarium\QueryType\Update\Query\Command\Add as AddCommand;
use Solarium\QueryType\Update\Query\Command\Commit as CommitCommand;
use Solarium\QueryType\Update\Query\Command\Delete as DeleteCommand; use Solarium\QueryType\Update\Query\Command\Delete as DeleteCommand;
use Solarium\QueryType\Update\Query\Command\Optimize as OptimizeCommand; use Solarium\QueryType\Update\Query\Command\Optimize as OptimizeCommand;
use Solarium\QueryType\Update\Query\Command\Commit as CommitCommand;
use Solarium\QueryType\Update\Query\Command\Rollback as RollbackCommand; use Solarium\QueryType\Update\Query\Command\Rollback as RollbackCommand;
use Solarium\QueryType\Update\Query\Document\Document; use Solarium\QueryType\Update\Query\Document\Document;
use Solarium\QueryType\Update\Query\Query;
use Solarium\QueryType\Update\RequestBuilder;
class RequestBuilderTest extends \PHPUnit_Framework_TestCase class RequestBuilderTest extends \PHPUnit_Framework_TestCase
{ {
...@@ -127,13 +127,52 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase ...@@ -127,13 +127,52 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase
$command->addDocument(new Document(array('id' => array(1, 2, 3), 'text' => 'test < 123 > test'))); $command->addDocument(new Document(array('id' => array(1, 2, 3), 'text' => 'test < 123 > test')));
$this->assertEquals( $this->assertEquals(
'<add>'. '<add>' .
'<doc>'. '<doc>' .
'<field name="id">1</field>'. '<field name="id">1</field>' .
'<field name="id">2</field>'. '<field name="id">2</field>' .
'<field name="id">3</field>'. '<field name="id">3</field>' .
'<field name="text">test &lt; 123 &gt; test</field>'. '<field name="text">test &lt; 123 &gt; test</field>' .
'</doc>'. '</doc>' .
'</add>',
$this->builder->buildAddXml($command)
);
}
public function testBuildAddXmlWithNestedDocuments()
{
$command = new AddCommand;
$command->addDocument(
new Document(
array(
'id' => array(
array(
'nested_id' => 42,
'customer_ids' => array(
15,
16
)
),
2,
'foo'
),
'text' => 'test < 123 > test'
)
)
);
$this->assertEquals(
'<add>' .
'<doc>' .
'<doc>' .
'<field name="nested_id">42</field>' .
'<field name="customer_ids">15</field>' .
'<field name="customer_ids">16</field>' .
'</doc>' .
'<field name="id">2</field>' .
'<field name="id">foo</field>' .
'<field name="text">test &lt; 123 &gt; test</field>' .
'</doc>' .
'</add>', '</add>',
$this->builder->buildAddXml($command) $this->builder->buildAddXml($command)
); );
...@@ -189,13 +228,13 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase ...@@ -189,13 +228,13 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase
$command->addDocument($doc); $command->addDocument($doc);
$this->assertEquals( $this->assertEquals(
'<add>'. '<add>' .
'<doc>'. '<doc>' .
'<field name="id">1</field>'. '<field name="id">1</field>' .
'<field name="category" update="add">123</field>'. '<field name="category" update="add">123</field>' .
'<field name="name" boost="2.5" update="set">test</field>'. '<field name="name" boost="2.5" update="set">test</field>' .
'<field name="stock" update="inc">2</field>'. '<field name="stock" update="inc">2</field>' .
'</doc>'. '</doc>' .
'</add>', '</add>',
$this->builder->buildAddXml($command) $this->builder->buildAddXml($command)
); );
...@@ -214,14 +253,14 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase ...@@ -214,14 +253,14 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase
$command->addDocument($doc); $command->addDocument($doc);
$this->assertEquals( $this->assertEquals(
'<add>'. '<add>' .
'<doc>'. '<doc>' .
'<field name="id">1</field>'. '<field name="id">1</field>' .
'<field name="category" update="add">123</field>'. '<field name="category" update="add">123</field>' .
'<field name="category" update="add">234</field>'. '<field name="category" update="add">234</field>' .
'<field name="name" boost="2.3" update="set">test</field>'. '<field name="name" boost="2.3" update="set">test</field>' .
'<field name="stock" update="inc">2</field>'. '<field name="stock" update="inc">2</field>' .
'</doc>'. '</doc>' .
'</add>', '</add>',
$this->builder->buildAddXml($command) $this->builder->buildAddXml($command)
); );
...@@ -244,7 +283,9 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase ...@@ -244,7 +283,9 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase
public function testBuildAddXmlWithDateTime() public function testBuildAddXmlWithDateTime()
{ {
$command = new AddCommand; $command = new AddCommand;
$command->addDocument(new Document(array('id' => 1, 'datetime' => new \DateTime('2013-01-15 14:41:58')))); $command->addDocument(
new Document(array('id' => 1, 'datetime' => new \DateTime('2013-01-15 14:41:58', new \DateTimeZone('Europe/London'))))
);
$this->assertEquals( $this->assertEquals(
'<add><doc><field name="id">1</field><field name="datetime">2013-01-15T14:41:58Z</field></doc></add>', '<add><doc><field name="id">1</field><field name="datetime">2013-01-15T14:41:58Z</field></doc></add>',
...@@ -262,11 +303,11 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase ...@@ -262,11 +303,11 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase
$command->addDocument($doc); $command->addDocument($doc);
$this->assertEquals( $this->assertEquals(
'<add>'. '<add>' .
'<doc>'. '<doc>' .
'<field name="employeeId">05991</field>'. '<field name="employeeId">05991</field>' .
'<field name="skills" update="set" null="true"></field>'. '<field name="skills" update="set" null="true"></field>' .
'</doc>'. '</doc>' .
'</add>', '</add>',
$this->builder->buildAddXml($command) $this->builder->buildAddXml($command)
); );
...@@ -366,7 +407,7 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase ...@@ -366,7 +407,7 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase
public function testBuildOptimizeXmlWithParams() public function testBuildOptimizeXmlWithParams()
{ {
$command = new OptimizeCommand(array('softcommit'=>true, 'waitsearcher'=>false, 'maxsegments'=>10)); $command = new OptimizeCommand(array('softcommit' => true, 'waitsearcher' => false, 'maxsegments' => 10));
$this->assertEquals( $this->assertEquals(
'<optimize softCommit="true" waitSearcher="false" maxSegments="10"/>', '<optimize softCommit="true" waitSearcher="false" maxSegments="10"/>',
...@@ -386,7 +427,7 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase ...@@ -386,7 +427,7 @@ class RequestBuilderTest extends \PHPUnit_Framework_TestCase
public function testBuildCommitXmlWithParams() public function testBuildCommitXmlWithParams()
{ {
$command = new CommitCommand(array('softcommit'=>true, 'waitsearcher'=>false, 'expungedeletes'=>true)); $command = new CommitCommand(array('softcommit' => true, 'waitsearcher' => false, 'expungedeletes' => true));
$this->assertEquals( $this->assertEquals(
'<commit softCommit="true" waitSearcher="false" expungeDeletes="true"/>', '<commit softCommit="true" waitSearcher="false" expungeDeletes="true"/>',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment