diff --git a/DependencyInjection/FOSElasticaExtension.php b/DependencyInjection/FOSElasticaExtension.php index 9e50c0b..66a2cef 100644 --- a/DependencyInjection/FOSElasticaExtension.php +++ b/DependencyInjection/FOSElasticaExtension.php @@ -419,9 +419,12 @@ class FOSElasticaExtension extends Extension $providerDef = new DefinitionDecorator('fos_elastica.provider.prototype.' . $typeConfig['driver']); $providerDef->addTag('fos_elastica.provider', array('index' => $indexName, 'type' => $typeName)); $providerDef->replaceArgument(0, new Reference($objectPersisterId)); - $providerDef->replaceArgument(1, $typeConfig['model']); + $providerDef->replaceArgument(2, $typeConfig['model']); // Propel provider can simply ignore Doctrine-specific options - $providerDef->replaceArgument(2, array_diff_key($typeConfig['provider'], array('service' => 1))); + $providerDef->replaceArgument(3, array_merge(array_diff_key($typeConfig['provider'], array('service' => 1)), array( + 'indexName' => $indexName, + 'typeName' => $typeName, + ))); $container->setDefinition($providerId, $providerDef); return $providerId; @@ -440,7 +443,11 @@ class FOSElasticaExtension extends Extension $listenerDef = new DefinitionDecorator($abstractListenerId); $listenerDef->replaceArgument(0, new Reference($objectPersisterId)); $listenerDef->replaceArgument(1, $this->getDoctrineEvents($typeConfig)); - $listenerDef->replaceArgument(3, $typeConfig['identifier']); + $listenerDef->replaceArgument(3, array( + 'identifier' => $typeConfig['identifier'], + 'indexName' => $indexName, + 'typeName' => $typeName, + )); if ($typeConfig['listener']['logger']) { $listenerDef->replaceArgument(4, new Reference($typeConfig['listener']['logger'])); } diff --git a/Doctrine/Listener.php b/Doctrine/Listener.php index 4a01aa1..73a271d 100644 --- a/Doctrine/Listener.php +++ b/Doctrine/Listener.php @@ -31,11 +31,11 @@ class Listener implements EventSubscriber protected $events; /** - * Name of domain model field used as the ES identifier + * Configuration for the listener * * @var string */ - protected $esIdentifierField; + private $config; /** * Objects scheduled for insertion and replacement @@ -66,17 +66,19 @@ class Listener implements EventSubscriber * @param ObjectPersisterInterface $objectPersister * @param array $events * @param IndexableInterface $indexable - * @param string $esIdentifierField + * @param array $config * @param null $logger */ public function __construct( ObjectPersisterInterface $objectPersister, array $events, IndexableInterface $indexable, - $esIdentifierField = 'id', + array $config = array(), $logger = null ) { - $this->esIdentifierField = $esIdentifierField; + $this->config = array_merge(array( + 'identifier' => 'id', + ), $config); $this->events = $events; $this->indexable = $indexable; $this->objectPersister = $objectPersister; @@ -196,7 +198,7 @@ class Listener implements EventSubscriber */ protected function scheduleForDeletion($object) { - if ($identifierValue = $this->propertyAccessor->getValue($object, $this->esIdentifierField)) { + if ($identifierValue = $this->propertyAccessor->getValue($object, $this->config['identifier'])) { $this->scheduledForDeletion[] = $identifierValue; } } @@ -210,8 +212,8 @@ class Listener implements EventSubscriber private function isObjectIndexable($object) { return $this->indexable->isObjectIndexable( - $this->objectPersister->getType()->getIndex()->getName(), - $this->objectPersister->getType()->getName(), + $this->config['indexName'], + $this->config['typeName'], $object ); } diff --git a/DynamicIndex.php b/DynamicIndex.php index cbec8e9..f890234 100644 --- a/DynamicIndex.php +++ b/DynamicIndex.php @@ -11,18 +11,31 @@ use Elastica\Index; */ class DynamicIndex extends Index { + private $originalName; + /** * Reassign index name * - * While it's technically a regular setter for name property, it's specifically named overrideName, but not setName - * since it's used for a very specific case and normally should not be used + * While it's technically a regular setter for name property, it's specifically named + * overrideName, but not setName since it's used for a very specific case and normally + * should not be used. * * @param string $name Index name - * - * @return void */ public function overrideName($name) { + $this->originalName = $this->_name; $this->_name = $name; } + + /** + * Returns the original name of the index if the index has been renamed for reindexing + * or realiasing purposes. + * + * @return string + */ + public function getOriginalName() + { + return $this->originalName ?: $this->_name; + } } diff --git a/Persister/ObjectPersister.php b/Persister/ObjectPersister.php index 2b6a8af..54d5fd1 100644 --- a/Persister/ObjectPersister.php +++ b/Persister/ObjectPersister.php @@ -31,16 +31,6 @@ class ObjectPersister implements ObjectPersisterInterface $this->fields = $fields; } - /** - * @internal Temporary method that will be removed. - * - * @return Type - */ - public function getType() - { - return $this->type; - } - /** * If the ObjectPersister handles a given object. * diff --git a/Persister/ObjectPersisterInterface.php b/Persister/ObjectPersisterInterface.php index 5953d5a..2b4c8ee 100644 --- a/Persister/ObjectPersisterInterface.php +++ b/Persister/ObjectPersisterInterface.php @@ -68,11 +68,4 @@ interface ObjectPersisterInterface * @param array $identifiers array of domain model object identifiers */ public function deleteManyByIdentifiers(array $identifiers); - - /** - * Returns the elastica type used by this persister - * - * @return \Elastica\Type - */ - public function getType(); } diff --git a/Provider/AbstractProvider.php b/Provider/AbstractProvider.php index 8642be8..82ea914 100644 --- a/Provider/AbstractProvider.php +++ b/Provider/AbstractProvider.php @@ -60,10 +60,11 @@ abstract class AbstractProvider implements ProviderInterface */ protected function isObjectIndexable($object) { - $typeName = $this->objectPersister->getType()->getName(); - $indexName = $this->objectPersister->getType()->getIndex()->getName(); - - return $this->indexable->isObjectIndexable($indexName, $typeName, $object); + return $this->indexable->isObjectIndexable( + $this->options['indexName'], + $this->options['typeName'], + $object + ); } /** diff --git a/Provider/Indexable.php b/Provider/Indexable.php index b388c58..09168a1 100644 --- a/Provider/Indexable.php +++ b/Provider/Indexable.php @@ -94,7 +94,7 @@ class Indexable implements IndexableInterface private function buildCallback($type, $object) { if (!array_key_exists($type, $this->callbacks)) { - throw new \InvalidArgumentException(sprintf('Callback for type "%s" is not configured', $type)); + return null; } $callback = $this->callbacks[$type]; diff --git a/Resources/config/mongodb.xml b/Resources/config/mongodb.xml index 73b70c5..df2d2cc 100644 --- a/Resources/config/mongodb.xml +++ b/Resources/config/mongodb.xml @@ -9,6 +9,7 @@ + diff --git a/Resources/config/orm.xml b/Resources/config/orm.xml index 807a5bf..0cd6c42 100644 --- a/Resources/config/orm.xml +++ b/Resources/config/orm.xml @@ -9,6 +9,7 @@ + diff --git a/Resources/config/propel.xml b/Resources/config/propel.xml index cbc8cd7..962cb09 100644 --- a/Resources/config/propel.xml +++ b/Resources/config/propel.xml @@ -8,6 +8,7 @@ + diff --git a/Tests/Doctrine/AbstractListenerTest.php b/Tests/Doctrine/AbstractListenerTest.php index de5ba0c..1f238d6 100644 --- a/Tests/Doctrine/AbstractListenerTest.php +++ b/Tests/Doctrine/AbstractListenerTest.php @@ -16,7 +16,7 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase $eventArgs = $this->createLifecycleEventArgs($entity, $this->getMockObjectManager()); $indexable = $this->getMockIndexable('index', 'type', $entity, true); - $listener = $this->createListener($persister, array(), $indexable); + $listener = $this->createListener($persister, array(), $indexable, array('indexName' => 'index', 'typeName' => 'type')); $listener->postPersist($eventArgs); $this->assertEquals($entity, current($listener->scheduledForInsertion)); @@ -35,7 +35,7 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase $eventArgs = $this->createLifecycleEventArgs($entity, $this->getMockObjectManager()); $indexable = $this->getMockIndexable('index', 'type', $entity, false); - $listener = $this->createListener($persister, array(), $indexable); + $listener = $this->createListener($persister, array(), $indexable, array('indexName' => 'index', 'typeName' => 'type')); $listener->postPersist($eventArgs); $this->assertEmpty($listener->scheduledForInsertion); @@ -55,7 +55,7 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase $eventArgs = $this->createLifecycleEventArgs($entity, $this->getMockObjectManager()); $indexable = $this->getMockIndexable('index', 'type', $entity, true); - $listener = $this->createListener($persister, array(), $indexable); + $listener = $this->createListener($persister, array(), $indexable, array('indexName' => 'index', 'typeName' => 'type')); $listener->postUpdate($eventArgs); $this->assertEquals($entity, current($listener->scheduledForUpdate)); @@ -89,7 +89,7 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase ->with($entity, 'id') ->will($this->returnValue($entity->getId())); - $listener = $this->createListener($persister, array(), $indexable); + $listener = $this->createListener($persister, array(), $indexable, array('indexName' => 'index', 'typeName' => 'type')); $listener->postUpdate($eventArgs); $this->assertEmpty($listener->scheduledForUpdate); @@ -124,7 +124,7 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase ->with($entity, 'id') ->will($this->returnValue($entity->getId())); - $listener = $this->createListener($persister, array(), $indexable); + $listener = $this->createListener($persister, array(), $indexable, array('indexName' => 'index', 'typeName' => 'type')); $listener->preRemove($eventArgs); $this->assertEquals($entity->getId(), current($listener->scheduledForDeletion)); @@ -157,7 +157,7 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase ->with($entity, 'identifier') ->will($this->returnValue($entity->getId())); - $listener = $this->createListener($persister, array(), $indexable, 'identifier'); + $listener = $this->createListener($persister, array(), $indexable, array('identifier' => 'identifier', 'indexName' => 'index', 'typeName' => 'type')); $listener->preRemove($eventArgs); $this->assertEquals($entity->identifier, current($listener->scheduledForDeletion)); diff --git a/Tests/Doctrine/AbstractProviderTest.php b/Tests/Doctrine/AbstractProviderTest.php index e5f9735..cd0a58c 100644 --- a/Tests/Doctrine/AbstractProviderTest.php +++ b/Tests/Doctrine/AbstractProviderTest.php @@ -21,29 +21,13 @@ class AbstractProviderTest extends \PHPUnit_Framework_TestCase } $this->objectClass = 'objectClass'; - $this->options = array('debug_logging' => true); + $this->options = array('debug_logging' => true, 'indexName' => 'index', 'typeName' => 'type'); $this->objectPersister = $this->getMockObjectPersister(); $this->managerRegistry = $this->getMockManagerRegistry(); $this->objectManager = $this->getMockObjectManager(); $this->indexable = $this->getMockIndexable(); - $index = $this->getMockBuilder('Elastica\Index')->disableOriginalConstructor()->getMock(); - $index->expects($this->any()) - ->method('getName') - ->will($this->returnValue('index')); - $type = $this->getMockBuilder('Elastica\Type')->disableOriginalConstructor()->getMock(); - $type->expects($this->any()) - ->method('getName') - ->will($this->returnValue('type')); - $type->expects($this->any()) - ->method('getIndex') - ->will($this->returnValue($index)); - - $this->objectPersister->expects($this->any()) - ->method('getType') - ->will($this->returnValue($type)); - $this->managerRegistry->expects($this->any()) ->method('getManagerForClass') ->with($this->objectClass) diff --git a/Tests/Provider/IndexableTest.php b/Tests/Provider/IndexableTest.php index 61d7f87..aae6484 100644 --- a/Tests/Provider/IndexableTest.php +++ b/Tests/Provider/IndexableTest.php @@ -15,6 +15,14 @@ use FOS\ElasticaBundle\Provider\Indexable; class IndexableTest extends \PHPUnit_Framework_TestCase { + public function testIndexableUnknown() + { + $indexable = new Indexable(array()); + $index = $indexable->isObjectIndexable('index', 'type', new Entity); + + $this->assertTrue($index); + } + /** * @dataProvider provideIsIndexableCallbacks */