Fix indexable callbacks with alias based indexes

This commit is contained in:
Tim Nagel 2014-06-17 12:03:38 +10:00
parent e225d841ed
commit aafb8c8e89
13 changed files with 61 additions and 60 deletions

View File

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

View File

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

View File

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

View File

@ -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.
*

View File

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

View File

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

View File

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

View File

@ -9,6 +9,7 @@
<service id="fos_elastica.provider.prototype.mongodb" class="FOS\ElasticaBundle\Doctrine\MongoDB\Provider" public="true" abstract="true">
<argument /> <!-- object persister -->
<argument type="service" id="fos_elastica.indexable" />
<argument /> <!-- model -->
<argument type="collection" /> <!-- options -->
<argument type="service" id="doctrine_mongodb" />
</service>

View File

@ -9,6 +9,7 @@
<service id="fos_elastica.provider.prototype.orm" class="FOS\ElasticaBundle\Doctrine\ORM\Provider" public="true" abstract="true">
<argument /> <!-- object persister -->
<argument type="service" id="fos_elastica.indexable" />
<argument /> <!-- model -->
<argument type="collection" /> <!-- options -->
<argument type="service" id="doctrine" />
</service>

View File

@ -8,6 +8,7 @@
<service id="fos_elastica.provider.prototype.propel" class="FOS\ElasticaBundle\Propel\Provider" public="true" abstract="true">
<argument /> <!-- object persister -->
<argument type="service" id="fos_elastica.indexable" />
<argument /> <!-- model -->
<argument type="collection" /> <!-- options -->
</service>

View File

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

View File

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

View File

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