IndexerStatusCommand.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Indexer\Console\Command;
  7. use Symfony\Component\Console\Input\InputInterface;
  8. use Symfony\Component\Console\Output\OutputInterface;
  9. use Magento\Framework\Indexer;
  10. use Magento\Framework\Mview;
  11. use Symfony\Component\Console\Helper\Table;
  12. /**
  13. * Command for displaying status of indexers.
  14. */
  15. class IndexerStatusCommand extends AbstractIndexerManageCommand
  16. {
  17. /**
  18. * {@inheritdoc}
  19. */
  20. protected function configure()
  21. {
  22. $this->setName('indexer:status')
  23. ->setDescription('Shows status of Indexer')
  24. ->setDefinition($this->getInputList());
  25. parent::configure();
  26. }
  27. /**
  28. * {@inheritdoc}
  29. */
  30. protected function execute(InputInterface $input, OutputInterface $output)
  31. {
  32. $table = new Table($output);
  33. $table->setHeaders(['Title', 'Status', 'Update On', 'Schedule Status', 'Schedule Updated']);
  34. $rows = [];
  35. $indexers = $this->getIndexers($input);
  36. foreach ($indexers as $indexer) {
  37. $view = $indexer->getView();
  38. $rowData = [
  39. 'Title' => $indexer->getTitle(),
  40. 'Status' => $this->getStatus($indexer),
  41. 'Update On' => $indexer->isScheduled() ? 'Schedule' : 'Save',
  42. 'Schedule Status' => '',
  43. 'Updated' => '',
  44. ];
  45. if ($indexer->isScheduled()) {
  46. $state = $view->getState();
  47. $rowData['Schedule Status'] = "{$state->getStatus()} ({$this->getPendingCount($view)} in backlog)";
  48. $rowData['Updated'] = $state->getUpdated();
  49. }
  50. $rows[] = $rowData;
  51. }
  52. usort($rows, function ($comp1, $comp2) {
  53. return strcmp($comp1['Title'], $comp2['Title']);
  54. });
  55. $table->addRows($rows);
  56. $table->render();
  57. }
  58. /**
  59. * @param Indexer\IndexerInterface $indexer
  60. * @return string
  61. */
  62. private function getStatus(Indexer\IndexerInterface $indexer)
  63. {
  64. $status = 'unknown';
  65. switch ($indexer->getStatus()) {
  66. case \Magento\Framework\Indexer\StateInterface::STATUS_VALID:
  67. $status = 'Ready';
  68. break;
  69. case \Magento\Framework\Indexer\StateInterface::STATUS_INVALID:
  70. $status = 'Reindex required';
  71. break;
  72. case \Magento\Framework\Indexer\StateInterface::STATUS_WORKING:
  73. $status = 'Processing';
  74. break;
  75. }
  76. return $status;
  77. }
  78. /**
  79. * @param Mview\ViewInterface $view
  80. * @return string
  81. */
  82. private function getPendingCount(Mview\ViewInterface $view)
  83. {
  84. $changelog = $view->getChangelog();
  85. try {
  86. $currentVersionId = $changelog->getVersion();
  87. } catch (Mview\View\ChangelogTableNotExistsException $e) {
  88. return '';
  89. }
  90. $state = $view->getState();
  91. $pendingCount = count($changelog->getList($state->getVersionId(), $currentVersionId));
  92. $pendingString = "<error>$pendingCount</error>";
  93. if ($pendingCount <= 0) {
  94. $pendingString = "<info>$pendingCount</info>";
  95. }
  96. return $pendingString;
  97. }
  98. }