Merge branch 'nurikabe-master'

Conflicts:
	Resources/doc/types.md
This commit is contained in:
Tim Nagel 2014-04-10 13:06:22 +10:00
commit a97ed80aee
5 changed files with 78 additions and 14 deletions

View file

@ -289,6 +289,11 @@ class Configuration implements ConfigurationInterface
->scalarNode('update')->defaultTrue()->end()
->scalarNode('delete')->defaultTrue()->end()
->booleanNode('immediate')->defaultFalse()->end()
->scalarNode('logger')
->defaultFalse()
->treatNullLike('fos_elastica.logger')
->treatTrueLike('fos_elastica.logger')
->end()
->scalarNode('service')->end()
->variableNode('is_indexable_callback')->defaultNull()->end()
->end()

View file

@ -432,8 +432,12 @@ class FOSElasticaExtension extends Extension
$listenerDef = new DefinitionDecorator($abstractListenerId);
$listenerDef->replaceArgument(0, new Reference($objectPersisterId));
$listenerDef->replaceArgument(1, $typeConfig['model']);
$listenerDef->replaceArgument(3, $typeConfig['identifier']);
$listenerDef->replaceArgument(2, $this->getDoctrineEvents($typeConfig));
$listenerDef->replaceArgument(3, $typeConfig['identifier']);
if (isset($typeConfig['listener']['logger'])) {
$listenerDef->replaceArgument(4, new Reference($typeConfig['listener']['logger']));
}
switch ($typeConfig['driver']) {
case 'orm': $listenerDef->addTag('doctrine.event_subscriber'); break;
case 'mongodb': $listenerDef->addTag('doctrine_mongodb.odm.event_subscriber'); break;

View file

@ -2,6 +2,7 @@
namespace FOS\ElasticaBundle\Doctrine;
use Psr\Log\LoggerInterface;
use Doctrine\Common\EventArgs;
use Doctrine\Common\EventSubscriber;
use FOS\ElasticaBundle\Persister\ObjectPersisterInterface;
@ -85,13 +86,17 @@ class Listener implements EventSubscriber
* @param array $events
* @param string $esIdentifierField
*/
public function __construct(ObjectPersisterInterface $objectPersister, $objectClass, array $events, $esIdentifierField = 'id')
public function __construct(ObjectPersisterInterface $objectPersister, $objectClass, array $events, $esIdentifierField = 'id', $logger = null)
{
$this->objectPersister = $objectPersister;
$this->objectClass = $objectClass;
$this->events = $events;
$this->esIdentifierField = $esIdentifierField;
if ($logger) {
$this->objectPersister->setLogger($logger);
}
$this->propertyAccessor = PropertyAccess::createPropertyAccessor();
}

View file

@ -2,6 +2,8 @@
namespace FOS\ElasticaBundle\Persister;
use Psr\Log\LoggerInterface;
use Elastica\Exception\BulkException;
use Elastica\Exception\NotFoundException;
use FOS\ElasticaBundle\Transformer\ModelToElasticaTransformerInterface;
use Elastica\Type;
@ -19,6 +21,7 @@ class ObjectPersister implements ObjectPersisterInterface
protected $transformer;
protected $objectClass;
protected $fields;
protected $logger;
public function __construct(Type $type, ModelToElasticaTransformerInterface $transformer, $objectClass, array $fields)
{
@ -28,6 +31,27 @@ class ObjectPersister implements ObjectPersisterInterface
$this->fields = $fields;
}
public function setLogger(LoggerInterface $logger)
{
$this->logger = $logger;
}
/**
* Log exception if logger defined for persister belonging to the current listener, otherwise re-throw
*
* @param BulkException $e
* @throws BulkException
* @return null
*/
private function log(BulkException $e)
{
if (! $this->logger) {
throw $e;
}
$this->logger->error($e);
}
/**
* Insert one object into the type
* The object will be transformed to an elastica document
@ -95,11 +119,15 @@ class ObjectPersister implements ObjectPersisterInterface
foreach ($objects as $object) {
$documents[] = $this->transformToElasticaDocument($object);
}
$this->type->addDocuments($documents);
try {
$this->type->addDocuments($documents);
} catch (BulkException $e) {
$this->log($e);
}
}
/**
* Bulk updates an array of objects in the type
* Bulk update an array of objects in the type. Create document if it does not already exist.
*
* @param array $objects array of domain model objects
*/
@ -108,16 +136,15 @@ class ObjectPersister implements ObjectPersisterInterface
$documents = array();
foreach ($objects as $object) {
$document = $this->transformToElasticaDocument($object);
try {
$this->type->getDocument($document->getId());
} catch (NotFoundException $e) {
$this->type->addDocument($document);
}
$document->setDocAsUpsert(true);
$documents[] = $document;
}
$this->type->updateDocuments($documents);
try {
$this->type->updateDocuments($documents);
} catch (BulkException $e) {
$this->log($e);
}
}
/**
@ -131,7 +158,11 @@ class ObjectPersister implements ObjectPersisterInterface
foreach ($objects as $object) {
$documents[] = $this->transformToElasticaDocument($object);
}
$this->type->deleteDocuments($documents);
try {
$this->type->deleteDocuments($documents);
} catch (BulkException $e) {
$this->log($e);
}
}
/**
@ -141,7 +172,11 @@ class ObjectPersister implements ObjectPersisterInterface
*/
public function deleteManyByIdentifiers(array $identifiers)
{
$this->type->getIndex()->getClient()->deleteIds($identifiers, $this->type->getIndex(), $this->type);
try {
$this->type->getIndex()->getClient()->deleteIds($identifiers, $this->type->getIndex(), $this->type);
} catch (BulkException $e) {
$this->log($e);
}
}
/**

View file

@ -276,3 +276,18 @@ option on a type persistence configuration to `true`.
persistence:
immediate: true
```
Logging Errors
--------------
By default FOSElasticaBundle will not catch errors thrown by Elastica/ElasticSearch.
Configure a logger per listener if you would rather catch and log these.
```yaml
persistence:
listener:
logger: true
```
Specifying `true` will use the default Elastica logger. Alternatively define your own
logger service id.