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
*/