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