Add query_builder_method option to the transformers
This commit is contained in:
parent
d5c606c64a
commit
9b6b0b0148
|
@ -171,6 +171,7 @@ class Configuration implements ConfigurationInterface
|
|||
->children()
|
||||
->scalarNode('hydrate')->defaultTrue()->end()
|
||||
->scalarNode('ignore_missing')->defaultFalse()->end()
|
||||
->scalarNode('query_builder_method')->defaultValue('createQueryBuilder')->end()
|
||||
->scalarNode('service')->end()
|
||||
->end()
|
||||
->end()
|
||||
|
@ -252,6 +253,7 @@ class Configuration implements ConfigurationInterface
|
|||
->children()
|
||||
->scalarNode('hydrate')->defaultTrue()->end()
|
||||
->scalarNode('ignore_missing')->defaultFalse()->end()
|
||||
->scalarNode('query_builder_method')->defaultValue('createQueryBuilder')->end()
|
||||
->scalarNode('service')->end()
|
||||
->end()
|
||||
->end()
|
||||
|
|
|
@ -283,7 +283,8 @@ class FOSElasticaExtension extends Extension
|
|||
$serviceDef->replaceArgument($argPos + 1, array(
|
||||
'hydrate' => $typeConfig['elastica_to_model_transformer']['hydrate'],
|
||||
'identifier' => $typeConfig['identifier'],
|
||||
'ignore_missing' => $typeConfig['elastica_to_model_transformer']['ignore_missing']
|
||||
'ignore_missing' => $typeConfig['elastica_to_model_transformer']['ignore_missing'],
|
||||
'query_builder_method' => $typeConfig['elastica_to_model_transformer']['query_builder_method']
|
||||
));
|
||||
$container->setDefinition($serviceId, $serviceDef);
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@ abstract class AbstractElasticaToModelTransformer implements ElasticaToModelTran
|
|||
'hydrate' => true,
|
||||
'identifier' => 'id',
|
||||
'ignore_missing' => false,
|
||||
'query_builder_method' => 'createQueryBuilder',
|
||||
);
|
||||
|
||||
/**
|
||||
|
|
|
@ -22,7 +22,7 @@ class ElasticaToModelTransformer extends AbstractElasticaToModelTransformer
|
|||
{
|
||||
return $this->registry
|
||||
->getManagerForClass($this->objectClass)
|
||||
->createQueryBuilder($this->objectClass)
|
||||
->{$this->options['query_builder_method']}($this->objectClass)
|
||||
->field($this->options['identifier'])->in($identifierValues)
|
||||
->hydrate($hydrate)
|
||||
->getQuery()
|
||||
|
|
|
@ -12,6 +12,8 @@ use Doctrine\ORM\Query;
|
|||
*/
|
||||
class ElasticaToModelTransformer extends AbstractElasticaToModelTransformer
|
||||
{
|
||||
const ENTITY_ALIAS = 'o';
|
||||
|
||||
/**
|
||||
* Fetch objects for theses identifier values
|
||||
*
|
||||
|
@ -25,14 +27,25 @@ class ElasticaToModelTransformer extends AbstractElasticaToModelTransformer
|
|||
return array();
|
||||
}
|
||||
$hydrationMode = $hydrate ? Query::HYDRATE_OBJECT : Query::HYDRATE_ARRAY;
|
||||
$qb = $this->registry
|
||||
->getManagerForClass($this->objectClass)
|
||||
->getRepository($this->objectClass)
|
||||
->createQueryBuilder('o');
|
||||
/* @var $qb \Doctrine\ORM\QueryBuilder */
|
||||
$qb->where($qb->expr()->in('o.'.$this->options['identifier'], ':values'))
|
||||
|
||||
$qb = $this->getEntityQueryBuilder();
|
||||
$qb->where($qb->expr()->in(static::ENTITY_ALIAS.'.'.$this->options['identifier'], ':values'))
|
||||
->setParameter('values', $identifierValues);
|
||||
|
||||
return $qb->getQuery()->setHydrationMode($hydrationMode)->execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a query builder to be used for querying by identifiers
|
||||
*
|
||||
* @return \Doctrine\ORM\QueryBuilder
|
||||
*/
|
||||
protected function getEntityQueryBuilder()
|
||||
{
|
||||
$repository = $this->registry
|
||||
->getManagerForClass($this->objectClass)
|
||||
->getRepository($this->objectClass);
|
||||
|
||||
return $repository->{$this->options['query_builder_method']}(static::ENTITY_ALIAS);
|
||||
}
|
||||
}
|
||||
|
|
130
Tests/Doctrine/ORM/ElasticaToModelTransformerTest.php
Normal file
130
Tests/Doctrine/ORM/ElasticaToModelTransformerTest.php
Normal file
|
@ -0,0 +1,130 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of the FOSElasticaBundle
|
||||
*
|
||||
* (c) Infinite Networks Pty Ltd <http://www.infinite.net.au>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace FOS\ElasticaBundle\Tests\Doctrine\ORM;
|
||||
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
use FOS\ElasticaBundle\Doctrine\ORM\ElasticaToModelTransformer;
|
||||
|
||||
class ElasticaToModelTransformerTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @var \Doctrine\Common\Persistence\ManagerRegistry|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $registry;
|
||||
|
||||
/**
|
||||
* @var \Doctrine\ORM\EntityManager|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $manager;
|
||||
|
||||
/**
|
||||
* @var \Doctrine\Common\Persistence\ObjectRepository|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $repository;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $objectClass = 'stdClass';
|
||||
|
||||
/**
|
||||
* Tests that the Transformer uses the query_builder_method configuration option
|
||||
* allowing configuration of createQueryBuilder call.
|
||||
*/
|
||||
public function testTransformUsesQueryBuilderMethodConfiguration()
|
||||
{
|
||||
$qb = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->repository->expects($this->once())
|
||||
->method('customQueryBuilderCreator')
|
||||
->with($this->equalTo(ElasticaToModelTransformer::ENTITY_ALIAS))
|
||||
->will($this->returnValue($qb));
|
||||
$this->repository->expects($this->never())
|
||||
->method('createQueryBuilder');
|
||||
|
||||
$transformer = new ElasticaToModelTransformer($this->registry, $this->objectClass, array(
|
||||
'query_builder_method' => 'customQueryBuilderCreator',
|
||||
));
|
||||
|
||||
$class = new \ReflectionClass('FOS\ElasticaBundle\Doctrine\ORM\ElasticaToModelTransformer');
|
||||
$method = $class->getMethod('getEntityQueryBuilder');
|
||||
$method->setAccessible(true);
|
||||
|
||||
$method->invokeArgs($transformer, array());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the Transformer uses the query_builder_method configuration option
|
||||
* allowing configuration of createQueryBuilder call.
|
||||
*/
|
||||
public function testTransformUsesDefaultQueryBuilderMethodConfiguration()
|
||||
{
|
||||
$qb = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->repository->expects($this->never())
|
||||
->method('customQueryBuilderCreator');
|
||||
$this->repository->expects($this->once())
|
||||
->method('createQueryBuilder')
|
||||
->with($this->equalTo(ElasticaToModelTransformer::ENTITY_ALIAS))
|
||||
->will($this->returnValue($qb));
|
||||
|
||||
$transformer = new ElasticaToModelTransformer($this->registry, $this->objectClass);
|
||||
|
||||
$class = new \ReflectionClass('FOS\ElasticaBundle\Doctrine\ORM\ElasticaToModelTransformer');
|
||||
$method = $class->getMethod('getEntityQueryBuilder');
|
||||
$method->setAccessible(true);
|
||||
|
||||
$method->invokeArgs($transformer, array());
|
||||
}
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
if (!interface_exists('Doctrine\Common\Persistence\ManagerRegistry')) {
|
||||
$this->markTestSkipped('Doctrine Common is not present');
|
||||
}
|
||||
if (!class_exists('Doctrine\ORM\EntityManager')) {
|
||||
$this->markTestSkipped('Doctrine Common is not present');
|
||||
}
|
||||
|
||||
$this->registry = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->manager = $this->getMockBuilder('Doctrine\ORM\EntityManager')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->registry->expects($this->any())
|
||||
->method('getManagerForClass')
|
||||
->with($this->objectClass)
|
||||
->will($this->returnValue($this->manager));
|
||||
|
||||
$this->repository = $this->getMock('Doctrine\Common\Persistence\ObjectRepository', array(
|
||||
'customQueryBuilderCreator',
|
||||
'createQueryBuilder',
|
||||
'find',
|
||||
'findAll',
|
||||
'findBy',
|
||||
'findOneBy',
|
||||
'getClassName'
|
||||
));
|
||||
|
||||
$this->manager->expects($this->any())
|
||||
->method('getRepository')
|
||||
->with($this->objectClass)
|
||||
->will($this->returnValue($this->repository));
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue