FOSElasticaBundle/Doctrine/AbstractProvider.php

108 lines
2.9 KiB
PHP
Raw Normal View History

2011-04-17 19:56:32 +02:00
<?php
namespace FOQ\ElasticaBundle\Doctrine;
2011-04-17 19:56:32 +02:00
use FOQ\ElasticaBundle\Provider\ProviderInterface;
use FOQ\ElasticaBundle\Persister\ObjectPersisterInterface;
2011-04-17 19:56:32 +02:00
use Elastica_Type;
use Elastica_Document;
use Closure;
use InvalidArgumentException;
abstract class AbstractProvider implements ProviderInterface
2011-04-17 19:56:32 +02:00
{
/**
* Elastica type
*
* @var Elastica_Type
*/
2011-04-17 19:56:32 +02:00
protected $type;
/**
* Manager registry
*
* @var object
*/
protected $registry;
/**
* Object persister
*
* @var ObjectPersisterInterface
*/
protected $objectPersister;
/**
* Provider options
*
* @var array
*/
2011-04-17 19:56:32 +02:00
protected $options = array(
'batch_size' => 100,
'clear_object_manager' => true,
'query_builder_method' => 'createQueryBuilder'
2011-04-17 19:56:32 +02:00
);
public function __construct(Elastica_Type $type, $registry, ObjectPersisterInterface $objectPersister, $objectClass, array $options = array())
2011-04-17 19:56:32 +02:00
{
$this->type = $type;
$this->registry = $registry;
$this->objectClass = $objectClass;
$this->objectPersister = $objectPersister;
$this->options = array_merge($this->options, $options);
2011-04-17 19:56:32 +02:00
}
/**
* Insert the repository objects in the type index
*
* @param Closure $loggerClosure
*/
public function populate(Closure $loggerClosure)
{
$queryBuilder = $this->createQueryBuilder();
$nbObjects = $this->countObjects($queryBuilder);
2011-04-17 19:56:32 +02:00
for ($offset = 0; $offset < $nbObjects; $offset += $this->options['batch_size']) {
$stepStartTime = microtime(true);
$objects = $this->fetchSlice($queryBuilder, $this->options['batch_size'], $offset);
$this->objectPersister->insertMany($objects);
2011-04-17 19:56:32 +02:00
if ($this->options['clear_object_manager']) {
$this->registry->getManagerForClass($this->objectClass)->clear();
2011-04-17 19:56:32 +02:00
}
$stepNbObjects = count($objects);
$stepCount = $stepNbObjects+$offset;
$objectsPerSecond = $stepNbObjects / (microtime(true) - $stepStartTime);
$loggerClosure(sprintf('%0.1f%% (%d/%d), %d objects/s', 100*$stepCount/$nbObjects, $stepCount, $nbObjects, $objectsPerSecond));
2011-04-17 19:56:32 +02:00
}
}
/**
* Counts the objects of a query builder
*
* @param queryBuilder
* @return int
**/
protected abstract function countObjects($queryBuilder);
/**
* Fetches a slice of objects
*
* @param queryBuilder
* @param int limit
* @param int offset
* @return array of objects
**/
protected abstract function fetchSlice($queryBuilder, $limit, $offset);
2011-04-17 19:56:32 +02:00
/**
* Creates the query builder used to fetch the documents to index
2011-04-17 19:56:32 +02:00
*
* @return query builder
2011-04-17 19:56:32 +02:00
**/
protected abstract function createQueryBuilder();
2011-04-17 19:56:32 +02:00
}