77
88use Symfony \Component \Console \Input \InputInterface ;
99use Symfony \Component \Console \Output \OutputInterface ;
10+ use Magento \Framework \Indexer ;
11+ use Magento \Framework \Mview ;
1012
1113/**
1214 * Command for displaying status of indexers.
@@ -30,21 +32,84 @@ protected function configure()
3032 */
3133 protected function execute (InputInterface $ input , OutputInterface $ output )
3234 {
35+ $ table = $ this ->getHelperSet ()->get ('table ' );
36+ $ table ->setHeaders (['Title ' , 'Status ' , 'Update On ' , 'Schedule Status ' , 'Schedule Updated ' ]);
37+
38+ $ rows = [];
39+
3340 $ indexers = $ this ->getIndexers ($ input );
3441 foreach ($ indexers as $ indexer ) {
35- $ status = 'unknown ' ;
36- switch ($ indexer ->getStatus ()) {
37- case \Magento \Framework \Indexer \StateInterface::STATUS_VALID :
38- $ status = 'Ready ' ;
39- break ;
40- case \Magento \Framework \Indexer \StateInterface::STATUS_INVALID :
41- $ status = 'Reindex required ' ;
42- break ;
43- case \Magento \Framework \Indexer \StateInterface::STATUS_WORKING :
44- $ status = 'Processing ' ;
45- break ;
42+ $ view = $ indexer ->getView ();
43+
44+ $ rowData = [
45+ 'Title ' => $ indexer ->getTitle (),
46+ 'Status ' => $ this ->getStatus ($ indexer ),
47+ 'Update On ' => $ indexer ->isScheduled () ? 'Schedule ' : 'Save ' ,
48+ 'Schedule Status ' => '' ,
49+ 'Updated ' => '' ,
50+ ];
51+
52+ if ($ indexer ->isScheduled ()) {
53+ $ state = $ view ->getState ();
54+ $ rowData ['Schedule Status ' ] = "{$ state ->getStatus ()} ( {$ this ->getPendingCount ($ view )} in backlog) " ;
55+ $ rowData ['Updated ' ] = $ state ->getUpdated ();
4656 }
47- $ output ->writeln (sprintf ('%-50s ' , $ indexer ->getTitle () . ': ' ) . $ status );
57+
58+ $ rows [] = $ rowData ;
59+ }
60+
61+ usort ($ rows , function ($ comp1 , $ comp2 ) {
62+ return strcmp ($ comp1 ['Title ' ], $ comp2 ['Title ' ]);
63+ });
64+
65+ $ table ->addRows ($ rows );
66+ $ table ->render ($ output );
67+ }
68+
69+ /**
70+ * @param Indexer\IndexerInterface $indexer
71+ * @return string
72+ */
73+ private function getStatus (Indexer \IndexerInterface $ indexer )
74+ {
75+ $ status = 'unknown ' ;
76+ switch ($ indexer ->getStatus ()) {
77+ case \Magento \Framework \Indexer \StateInterface::STATUS_VALID :
78+ $ status = 'Ready ' ;
79+ break ;
80+ case \Magento \Framework \Indexer \StateInterface::STATUS_INVALID :
81+ $ status = 'Reindex required ' ;
82+ break ;
83+ case \Magento \Framework \Indexer \StateInterface::STATUS_WORKING :
84+ $ status = 'Processing ' ;
85+ break ;
4886 }
87+ return $ status ;
88+ }
89+
90+ /**
91+ * @param Mview\ViewInterface $view
92+ * @return string
93+ */
94+ private function getPendingCount (Mview \ViewInterface $ view )
95+ {
96+ $ changelog = $ view ->getChangelog ();
97+
98+ try {
99+ $ currentVersionId = $ changelog ->getVersion ();
100+ } catch (Mview \View \ChangelogTableNotExistsException $ e ) {
101+ return '' ;
102+ }
103+
104+ $ state = $ view ->getState ();
105+
106+ $ pendingCount = count ($ changelog ->getList ($ state ->getVersionId (), $ currentVersionId ));
107+
108+ $ pendingString = "<error> $ pendingCount</error> " ;
109+ if ($ pendingCount <= 0 ) {
110+ $ pendingString = "<info> $ pendingCount</info> " ;
111+ }
112+
113+ return $ pendingString ;
49114 }
50115}
0 commit comments