diff --git a/Command/PopulateCommand.php b/Command/PopulateCommand.php index f17ca4c..6f27e5b 100644 --- a/Command/PopulateCommand.php +++ b/Command/PopulateCommand.php @@ -11,6 +11,7 @@ use FOS\ElasticaBundle\IndexManager; use FOS\ElasticaBundle\Provider\ProviderRegistry; use FOS\ElasticaBundle\Resetter; use FOS\ElasticaBundle\Provider\ProviderInterface; +use Symfony\Component\Console\Helper\ProgressBar; /** * Populate the search index @@ -109,20 +110,34 @@ class PopulateCommand extends ContainerAwareCommand */ private function populateIndex(OutputInterface $output, $index, $reset, $options) { + + /** @var $providers ProviderInterface[] */ + $providers = $this->providerRegistry->getIndexProviders($index); + if ($reset) { $output->writeln(sprintf('Resetting %s', $index)); $this->resetter->resetIndex($index, true); } - /** @var $providers ProviderInterface[] */ - $providers = $this->providerRegistry->getIndexProviders($index); - foreach ($providers as $type => $provider) { - $loggerClosure = function($message) use ($output, $index, $type) { - $output->writeln(sprintf('Populating %s/%s, %s', $index, $type, $message)); - }; + if (class_exists('Symfony\Component\Console\Helper\ProgressBar')) { + $output->writeln(sprintf('Populating %s/%s', $index, $type)); + $progressBar = new ProgressBar($output, $provider->getTotalObjects()); + $progressBar->setFormat('debug'); + $progressBar->start(); + $loggerClosure = function($number) use ($progressBar) { + $progressBar->advance($number); + }; + } else { + $loggerClosure = function($message) use ($output, $index, $type) { + $output->writeln(sprintf('Populating %s/%s, %s', $index, $type, $message)); + }; + } + $options['progress-bar'] = true; $provider->populate($loggerClosure, $options); + + if (isset($progressBar)) $progressBar->finish(); } $output->writeln(sprintf('Refreshing %s', $index)); diff --git a/Doctrine/AbstractProvider.php b/Doctrine/AbstractProvider.php index 92be6ce..9901fef 100644 --- a/Doctrine/AbstractProvider.php +++ b/Doctrine/AbstractProvider.php @@ -7,6 +7,7 @@ use Elastica\Exception\Bulk\ResponseException as BulkResponseException; use FOS\ElasticaBundle\Persister\ObjectPersisterInterface; use FOS\ElasticaBundle\Provider\AbstractProvider as BaseAbstractProvider; use FOS\ElasticaBundle\Provider\IndexableInterface; +use Symfony\Component\Console\Helper\ProgressBar; abstract class AbstractProvider extends BaseAbstractProvider { @@ -53,6 +54,7 @@ abstract class AbstractProvider extends BaseAbstractProvider $sleep = isset($options['sleep']) ? intval($options['sleep']) : 0; $batchSize = isset($options['batch-size']) ? intval($options['batch-size']) : $this->options['batch_size']; $ignoreErrors = isset($options['ignore-errors']) ? $options['ignore-errors'] : $this->options['ignore_errors']; + $progressBar = isset($options['progress-bar']) ? boolval($options['progress-bar']) : false; $manager = $this->managerRegistry->getManagerForClass($this->objectClass); for (; $offset < $nbObjects; $offset += $batchSize) { @@ -94,12 +96,14 @@ abstract class AbstractProvider extends BaseAbstractProvider usleep($sleep); - if ($loggerClosure) { + if ($loggerClosure && !$progressBar) { $stepCount = $stepNbObjects + $offset; $percentComplete = 100 * $stepCount / $nbObjects; $timeDifference = microtime(true) - $stepStartTime; $objectsPerSecond = $timeDifference ? ($stepNbObjects / $timeDifference) : $stepNbObjects; $loggerClosure(sprintf('%0.1f%% (%d/%d), %d objects/s %s', $percentComplete, $stepCount, $nbObjects, $objectsPerSecond, $this->getMemoryUsage())); + } else if ($loggerClosure && $progressBar) { + $loggerClosure($stepNbObjects); } } @@ -108,6 +112,14 @@ abstract class AbstractProvider extends BaseAbstractProvider } } + /** + * @return int|mixed + */ + public function getTotalObjects() + { + return $this->countObjects($this->createQueryBuilder()); + } + /** * Counts objects that would be indexed using the query builder. * diff --git a/Propel/Provider.php b/Propel/Provider.php index 38f7a61..f4966da 100644 --- a/Propel/Provider.php +++ b/Propel/Provider.php @@ -20,6 +20,7 @@ class Provider extends AbstractProvider $nbObjects = $queryClass::create()->count(); $offset = isset($options['offset']) ? intval($options['offset']) : 0; $sleep = isset($options['sleep']) ? intval($options['sleep']) : 0; + $progressBar = isset($options['progress-bar']) ? boolval($options['progress-bar']) : false; $batchSize = isset($options['batch-size']) ? intval($options['batch-size']) : $this->options['batch_size']; for (; $offset < $nbObjects; $offset += $batchSize) { @@ -46,11 +47,13 @@ class Provider extends AbstractProvider usleep($sleep); - if ($loggerClosure) { + if ($loggerClosure && !$progressBar) { $stepCount = $stepNbObjects + $offset; $percentComplete = 100 * $stepCount / $nbObjects; $objectsPerSecond = $stepNbObjects / (microtime(true) - $stepStartTime); $loggerClosure(sprintf('%0.1f%% (%d/%d), %d objects/s %s', $percentComplete, $stepCount, $nbObjects, $objectsPerSecond, $this->getMemoryUsage())); + } else if ($loggerClosure && $progressBar) { + $loggerClosure($stepNbObjects); } } }