From 131a65e411e1800f78daedb6723cec6c5c012638 Mon Sep 17 00:00:00 2001 From: Richard Miller Date: Wed, 25 Jan 2012 12:10:35 +0000 Subject: [PATCH 1/6] Allowed repositories for Propel driver --- DependencyInjection/FOQElasticaExtension.php | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/DependencyInjection/FOQElasticaExtension.php b/DependencyInjection/FOQElasticaExtension.php index c039302..e6e7926 100644 --- a/DependencyInjection/FOQElasticaExtension.php +++ b/DependencyInjection/FOQElasticaExtension.php @@ -345,18 +345,16 @@ class FOQElasticaExtension extends Extension $finderDef->replaceArgument(1, new Reference($elasticaToModelId)); $container->setDefinition($finderId, $finderDef); - if ('propel' !== $typeConfig['driver']) { - $managerId = sprintf('foq_elastica.manager.%s', $typeConfig['driver']); - $managerDef = $container->getDefinition($managerId); - $arguments = array( $typeConfig['model'], new Reference($finderId)); - if (isset($typeConfig['repository'])) { - $arguments[] = $typeConfig['repository']; - } - - $managerDef->addMethodCall('addEntity', $arguments); - $container->setDefinition($managerId, $managerDef); + $managerId = sprintf('foq_elastica.manager.%s', $typeConfig['driver']); + $managerDef = $container->getDefinition($managerId); + $arguments = array( $typeConfig['model'], new Reference($finderId)); + if (isset($typeConfig['repository'])) { + $arguments[] = $typeConfig['repository']; } + $managerDef->addMethodCall('addEntity', $arguments); + $container->setDefinition($managerId, $managerDef); + return $finderId; } From e00aa3a0779d71168e527e8d542b1a90cf098e75 Mon Sep 17 00:00:00 2001 From: Richard Miller Date: Wed, 25 Jan 2012 12:14:20 +0000 Subject: [PATCH 2/6] Removed unnecessary definition setting --- DependencyInjection/FOQElasticaExtension.php | 1 - 1 file changed, 1 deletion(-) diff --git a/DependencyInjection/FOQElasticaExtension.php b/DependencyInjection/FOQElasticaExtension.php index e6e7926..7b149a4 100644 --- a/DependencyInjection/FOQElasticaExtension.php +++ b/DependencyInjection/FOQElasticaExtension.php @@ -353,7 +353,6 @@ class FOQElasticaExtension extends Extension } $managerDef->addMethodCall('addEntity', $arguments); - $container->setDefinition($managerId, $managerDef); return $finderId; } From 9c0d7dd62250230de221a34a017178922216cd53 Mon Sep 17 00:00:00 2001 From: Richard Miller Date: Wed, 25 Jan 2012 12:42:02 +0000 Subject: [PATCH 3/6] Extracted method in RepositoryManager --- Manager/RepositoryManager.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Manager/RepositoryManager.php b/Manager/RepositoryManager.php index 261aaef..96865c0 100644 --- a/Manager/RepositoryManager.php +++ b/Manager/RepositoryManager.php @@ -45,11 +45,7 @@ class RepositoryManager implements RepositoryManagerInterface throw new RuntimeException(sprintf('No search finder configured for %s', $entityName)); } - $repositoryName = $this->getRepositoryName($entityName); - if (!class_exists($repositoryName)) { - throw new RuntimeException(sprintf('%s repository for %s does not exist', $repositoryName, $entityName)); - } - $repository = new $repositoryName($this->entities[$entityName]['finder']); + $repository = $this->createRepository($entityName); $this->repositories[$entityName] = $repository; return $repository; @@ -72,4 +68,13 @@ class RepositoryManager implements RepositoryManagerInterface return 'FOQ\ElasticaBundle\Repository'; } + private function createRepository($entityName) + { + $repositoryName = $this->getRepositoryName($entityName); + if (!class_exists($repositoryName)) { + throw new RuntimeException(sprintf('%s repository for %s does not exist', $repositoryName, $entityName)); + } + return new $repositoryName($this->entities[$entityName]['finder']); + } + } From d78ed342d4eabf2e1639e0c3288d4528fd7569f2 Mon Sep 17 00:00:00 2001 From: Richard Miller Date: Wed, 25 Jan 2012 12:45:08 +0000 Subject: [PATCH 4/6] Renamed variable in RepositoryManager --- Manager/RepositoryManager.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Manager/RepositoryManager.php b/Manager/RepositoryManager.php index 96865c0..3682a2b 100644 --- a/Manager/RepositoryManager.php +++ b/Manager/RepositoryManager.php @@ -51,16 +51,16 @@ class RepositoryManager implements RepositoryManagerInterface return $repository; } - protected function getRepositoryName($realEntityName) + protected function getRepositoryName($entityName) { - if (isset($this->entities[$realEntityName]['repositoryName'])) { - return $this->entities[$realEntityName]['repositoryName']; + if (isset($this->entities[$entityName]['repositoryName'])) { + return $this->entities[$entityName]['repositoryName']; } - $refClass = new \ReflectionClass($realEntityName); + $refClass = new \ReflectionClass($entityName); $annotation = $this->reader->getClassAnnotation($refClass, 'FOQ\\ElasticaBundle\\Configuration\\Search'); if ($annotation) { - $this->entities[$realEntityName]['repositoryName'] + $this->entities[$entityName]['repositoryName'] = $annotation->repositoryClass; return $annotation->repositoryClass; } From 452781bdece1920078833b1206e0cc5874b04de4 Mon Sep 17 00:00:00 2001 From: Richard Miller Date: Wed, 25 Jan 2012 13:46:15 +0000 Subject: [PATCH 5/6] Added search repositories to the README --- README.md | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 122 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a443ab5..45b769c 100644 --- a/README.md +++ b/README.md @@ -253,7 +253,7 @@ Its class must implement `FOQ\ElasticaBundle\Provider\ProviderInterface`. } } -You will find a more complete implementation example in `src/FOQ/ElasticaBundle/Provider/Doctrine/ORM/Provider.php`. +You will find a more complete implementation example in `src/FOQ/ElasticaBundle/Doctrine/AbstractProvider.php`. ### Search @@ -265,7 +265,7 @@ You can just use the index and type Elastica objects, provided as services, to p /** var Elastica_ResultSet */ $resultSet = $userType->search('bob'); -#### Doctrine finder +#### Doctrine/Propel finder If your elasticsearch type is bound to a Doctrine entity repository or a Propel query, you can get your entities instead of Elastica results when you perform a search. @@ -322,6 +322,125 @@ You can now use the index wide finder service `foq_elastica.finder.website`: // Returns a mixed array of any objects mapped $results = $finder->find('bob'); +#### Repositories + +As well as using the finder service for a particular Doctrine/Propel entity you +can use a manager service for each driver and get a repository for an entity to search +against. This allows you to use the same service rather than the particular finder. For +example: + + /** var FOQ\ElasticaBundle\Manager\RepositoryManager */ + $repositoryManager = $container->get('foq_elastica.manager.orm'); + + /** var FOQ\ElasticaBundle\Repository */ + $repository = $repositoryManager->getRepository('UserBundle:User'); + + /** var array of Acme\UserBundle\Entity\User */ + $users = $finder->find('bob'); + +You can also specify the full name of the entity instead of the shortcut syntax: + + /** var FOQ\ElasticaBundle\Repository */ + $repository = $repositoryManager->getRepository('Application\UserBundle\Entity\User'); + +> The **2.0** branch doesn't support using `UserBundle:User` style syntax and you must use the full name of the entity. . + +##### Default Manager + +If you are only using one driver then its manager service is automatically aliased +to `foq_elastica.manager`. So the above example could be simplified to: + + /** var FOQ\ElasticaBundle\Manager\RepositoryManager */ + $repositoryManager = $container->get('foq_elastica.manager'); + + /** var FOQ\ElasticaBundle\Repository */ + $repository = $repositoryManager->getRepository('UserBundle:User'); + + /** var array of Acme\UserBundle\Entity\User */ + $users = $finder->find('bob'); + +If you use multiple drivers then you can choose which one is aliased to `foq_elastica.manager` +using the `default_manager` parameter: + + foq_elastica: + default_manager: mongodb #defauults to orm + clients: + default: { host: localhost, port: 9200 } + #-- + +##### Custom Repositories + +As well as the default repository you can create a custom repository for an entity and add +methods for particular searches. These need to extend `FOQ\ElasticaBundle\Repository` to have +access to the finder: + +``` +find($query); + } +} +``` + +To use the custom repository specify it in the mapping for the entity: + +foq_elastica: + clients: + default: { host: localhost, port: 9200 } + indexes: + website: + client: default + types: + user: + mappings: + # your mappings + persistence: + driver: orm + model: Application\UserBundle\Entity\User + provider: + finder: + repository: Acme\ElasticaBundle\SearchRepository\UserRepository + +Then the custom queries will be available when using the repository returned from the manager: + + /** var FOQ\ElasticaBundle\Manager\RepositoryManager */ + $repositoryManager = $container->get('foq_elastica.manager'); + + /** var FOQ\ElasticaBundle\Repository */ + $repository = $repositoryManager->getRepository('UserBundle:User'); + + /** var array of Acme\UserBundle\Entity\User */ + $users = $finder->findWithCustomQuery('bob'); + +Alternatively you can specify the custom repository using an annotation in the entity: + +``` + Date: Wed, 25 Jan 2012 13:49:26 +0000 Subject: [PATCH 6/6] Renamed phpunit.dist.xml to phpunit.xml.dist --- phpunit.dist.xml => phpunit.xml.dist | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename phpunit.dist.xml => phpunit.xml.dist (100%) diff --git a/phpunit.dist.xml b/phpunit.xml.dist similarity index 100% rename from phpunit.dist.xml rename to phpunit.xml.dist