Merge pull request #399 from merk/query-builder-transformers

Add query_builder_method option to the transformers
This commit is contained in:
Tim Nagel 2013-11-10 18:19:22 -08:00
commit 7464625566
6 changed files with 155 additions and 8 deletions

View file

@ -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()

View file

@ -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);

View file

@ -35,6 +35,7 @@ abstract class AbstractElasticaToModelTransformer implements ElasticaToModelTran
'hydrate' => true,
'identifier' => 'id',
'ignore_missing' => false,
'query_builder_method' => 'createQueryBuilder',
);
/**

View file

@ -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()

View file

@ -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);
}
}

View 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));
}
}