Merge pull request #38 from richardmiller/adding_repositories_for_encapsulating_queries

Adding manager that returns Doctrine style repositories
This commit is contained in:
Jeremy Mikola 2011-11-14 08:18:14 -08:00
commit 2b0e09f3da
7 changed files with 218 additions and 0 deletions

View file

@ -138,6 +138,7 @@ class Configuration
->children()
->scalarNode('driver')->end()
->scalarNode('model')->end()
->scalarNode('repository')->end()
->scalarNode('identifier')->defaultValue('id')->end()
->arrayNode('provider')
->children()

View file

@ -304,6 +304,15 @@ class FOQElasticaExtension extends Extension
$finderDef->replaceArgument(1, new Reference($elasticaToModelId));
$container->setDefinition($finderId, $finderDef);
$managerDef = $container->getDefinition('foq_elastica.manager');
$arguments = array( $typeConfig['model'], new Reference($finderId));
if (isset($typeConfig['repository'])) {
$arguments[] = $typeConfig['repository'];
}
$managerDef->addMethodCall('addEntity', $arguments);
$container->setDefinition('foq_elastica.manager', $managerDef);
return $finderId;
}

57
Manager.php Normal file
View file

@ -0,0 +1,57 @@
<?php
namespace FOQ\ElasticaBundle;
use RuntimeException;
/**
* @author Richard Miller <info@limethinking.co.uk>
*
* Allows retrieval of basic or custom repository for mapped Doctrine
* entities/documents.
*/
class Manager
{
protected $entities;
protected $repositories;
public function addEntity($entityName, $finder, $repositoryName = null)
{
$this->entities[$entityName]= array();
$this->entities[$entityName]['finder'] = $finder;
$this->entities[$entityName]['repositoryName'] = $repositoryName;
}
/**
* Return repository for entity
*
* Returns custom repository if one specified otherwise
* returns a basic respository.
*/
public function getRepository($entityName)
{
if (isset($this->repositories[$entityName])) {
return $this->repositories[$entityName];
}
if (!isset($this->entities[$entityName])) {
throw new RuntimeException(sprintf('No search finder configured for %s', $entityName));
}
if (isset($this->entities[$entityName]['repositoryName'])) {
$repositoryName = $this->entities[$entityName]['repositoryName'];
if (!class_exists($repositoryName)) {
throw new RuntimeException(sprintf('%s repository for %s does not exist', $repositoryName, $entityName));
}
$repository = new $repositoryName($this->entities[$entityName]['finder']);
$this->repositories[$entityName] = $repository;
return $repository;
}
$repository = new Repository($this->entities[$entityName]['finder']);
$this->repositories[$entityName] = $repository;
return $repository;
}
}

31
Repository.php Normal file
View file

@ -0,0 +1,31 @@
<?php
namespace FOQ\ElasticaBundle;
/**
* @author Richard Miller <info@limethinking.co.uk>
*
* Basic respoitory to be extended to hold custom queries to be run
* in the finder.
*/
class Repository
{
protected $finder;
public function __construct($finder)
{
$this->finder = $finder;
}
public function find($query)
{
return $this->finder->find($query);
}
public function findPaginated($query)
{
return $this->finder->findPaginated($query);
}
}

View file

@ -10,6 +10,7 @@
<parameter key="foq_elastica.type.class">Elastica_Type</parameter>
<parameter key="foq_elastica.logger.class">FOQ\ElasticaBundle\Logger\ElasticaLogger</parameter>
<parameter key="foq_elastica.data_collector.class">FOQ\ElasticaBundle\DataCollector\ElasticaDataCollector</parameter>
<parameter key="foq_elastica.manager.class">FOQ\ElasticaBundle\Manager</parameter>
</parameters>
@ -62,6 +63,8 @@
<argument /> <!-- options -->
</service>
<service id="foq_elastica.manager" class="%foq_elastica.manager.class%" />
</services>
</container>

74
Tests/ManagerTest.php Normal file
View file

@ -0,0 +1,74 @@
<?php
namespace FOQ\ElasticaBundle\Tests;
use FOQ\ElasticaBundle\Manager;
class CustomRepository{}
/**
* @author Richard Miller <info@limethinking.co.uk>
*/
class ManagerTest extends \PHPUnit_Framework_TestCase
{
public function testThatGetRepositoryReturnsDefaultRepository()
{
$finderMock = $this->getMockBuilder('FOQ\ElasticaBundle\Finder\TransformedFinder')
->disableOriginalConstructor()
->getMock();
$entityName = 'Test Entity';
$manager = new Manager($finderMock);
$manager->addEntity($entityName, $finderMock);
$repository = $manager->getRepository($entityName);
$this->assertInstanceOf('FOQ\ElasticaBundle\Repository', $repository);
}
public function testThatGetRepositoryReturnsCustomRepository()
{
$finderMock = $this->getMockBuilder('FOQ\ElasticaBundle\Finder\TransformedFinder')
->disableOriginalConstructor()
->getMock();
$entityName = 'Test Entity';
$manager = new Manager($finderMock);
$manager->addEntity($entityName, $finderMock, 'FOQ\ElasticaBundle\Tests\CustomRepository');
$repository = $manager->getRepository($entityName);
$this->assertInstanceOf('FOQ\ElasticaBundle\Tests\CustomRepository', $repository);
}
/**
* @expectedException RuntimeException
*/
public function testThatGetRepositoryThrowsExceptionIfEntityNotConfigured()
{
$finderMock = $this->getMockBuilder('FOQ\ElasticaBundle\Finder\TransformedFinder')
->disableOriginalConstructor()
->getMock();
$entityName = 'Test Entity';
$manager = new Manager($finderMock);
$manager->addEntity($entityName, $finderMock);
$manager->getRepository('Missing Entity');
}
/**
* @expectedException RuntimeException
*/
public function testThatGetRepositoryThrowsExceptionIfCustomRepositoryNotFound()
{
$finderMock = $this->getMockBuilder('FOQ\ElasticaBundle\Finder\TransformedFinder')
->disableOriginalConstructor()
->getMock();
$entityName = 'Test Entity';
$manager = new Manager($finderMock);
$manager->addEntity($entityName, $finderMock, 'FOQ\ElasticaBundle\Tests\MissingRepository');
$manager->getRepository('Missing Entity');
}
}

43
Tests/RepositoryTest.php Normal file
View file

@ -0,0 +1,43 @@
<?php
namespace FOQ\ElasticaBundle\Tests;
use FOQ\ElasticaBundle\Repository;
/**
* @author Richard Miller <info@limethinking.co.uk>
*/
class RepositoryTest extends \PHPUnit_Framework_TestCase
{
public function testThatFindCallsFindOnFinder()
{
$testQuery = 'Test Query';
$finderMock = $this->getMockBuilder('FOQ\ElasticaBundle\Finder\TransformedFinder')
->disableOriginalConstructor()
->getMock();
$finderMock->expects($this->once())
->method('find')
->with($this->equalTo($testQuery));
$repository = new Repository($finderMock);
$repository->find($testQuery);
}
public function testThatFindPaginatedCallsFindPaginatedOnFinder()
{
$testQuery = 'Test Query';
$finderMock = $this->getMockBuilder('FOQ\ElasticaBundle\Finder\TransformedFinder')
->disableOriginalConstructor()
->getMock();
$finderMock->expects($this->once())
->method('findPaginated')
->with($this->equalTo($testQuery));
$repository = new Repository($finderMock);
$repository->findPaginated($testQuery);
}
}