1919 */
2020class Mage_Index_Model_Observer
2121{
22+ public const OLD_INDEX_EVENT_THRESHOLD_SECONDS = 24 * 60 * 60 ;
23+ public const OLD_INDEX_EVENT_DELETE_COUNT = 1000 ;
24+
2225 /**
2326 * Indexer model
2427 *
@@ -35,6 +38,7 @@ public function __construct()
3538 * Store after commit observer. Process store related indexes
3639 *
3740 * @param Varien_Event_Observer $observer
41+ * @throws Throwable
3842 */
3943 public function processStoreSave (Varien_Event_Observer $ observer )
4044 {
@@ -50,6 +54,7 @@ public function processStoreSave(Varien_Event_Observer $observer)
5054 * Store group after commit observer. Process store group related indexes
5155 *
5256 * @param Varien_Event_Observer $observer
57+ * @throws Throwable
5358 */
5459 public function processStoreGroupSave (Varien_Event_Observer $ observer )
5560 {
@@ -65,6 +70,7 @@ public function processStoreGroupSave(Varien_Event_Observer $observer)
6570 * Website save after commit observer. Process website related indexes
6671 *
6772 * @param Varien_Event_Observer $observer
73+ * @throws Throwable
6874 */
6975 public function processWebsiteSave (Varien_Event_Observer $ observer )
7076 {
@@ -80,6 +86,7 @@ public function processWebsiteSave(Varien_Event_Observer $observer)
8086 * Store after commit observer. Process store related indexes
8187 *
8288 * @param Varien_Event_Observer $observer
89+ * @throws Throwable
8390 */
8491 public function processStoreDelete (Varien_Event_Observer $ observer )
8592 {
@@ -95,6 +102,7 @@ public function processStoreDelete(Varien_Event_Observer $observer)
95102 * Store group after commit observer. Process store group related indexes
96103 *
97104 * @param Varien_Event_Observer $observer
105+ * @throws Throwable
98106 */
99107 public function processStoreGroupDelete (Varien_Event_Observer $ observer )
100108 {
@@ -110,6 +118,7 @@ public function processStoreGroupDelete(Varien_Event_Observer $observer)
110118 * Website save after commit observer. Process website related indexes
111119 *
112120 * @param Varien_Event_Observer $observer
121+ * @throws Throwable
113122 */
114123 public function processWebsiteDelete (Varien_Event_Observer $ observer )
115124 {
@@ -125,6 +134,7 @@ public function processWebsiteDelete(Varien_Event_Observer $observer)
125134 * Config data after commit observer.
126135 *
127136 * @param Varien_Event_Observer $observer
137+ * @throws Throwable
128138 */
129139 public function processConfigDataSave (Varien_Event_Observer $ observer )
130140 {
@@ -135,4 +145,57 @@ public function processConfigDataSave(Varien_Event_Observer $observer)
135145 Mage_Index_Model_Event::TYPE_SAVE
136146 );
137147 }
148+
149+ /**
150+ * Clean old index events for indexers in manual mode
151+ *
152+ * @return void
153+ * @throws Exception
154+ */
155+ public function cleanOutdatedEvents ()
156+ {
157+ $ manualIndexProcessCollection = Mage::getSingleton ('index/indexer ' )
158+ ->getProcessesCollection ()
159+ ->addFieldToFilter ('mode ' , Mage_Index_Model_Process::MODE_MANUAL );
160+
161+ $ now = new DateTime ();
162+ /** @noinspection PhpUnhandledExceptionInspection */
163+ $ dateInterval = new DateInterval ('PT ' . self ::OLD_INDEX_EVENT_THRESHOLD_SECONDS . 'S ' );
164+ $ oldEventsThreshold = $ now
165+ ->sub ($ dateInterval )
166+ ->format (Varien_Db_Adapter_Pdo_Mysql::TIMESTAMP_FORMAT );
167+
168+ $ coreResource = Mage::getSingleton ('core/resource ' );
169+ $ writeConnection = $ coreResource ->getConnection ('core_write ' );
170+ $ indexEventTableName = $ coreResource ->getTableName ('index/event ' );
171+
172+ /** @var Mage_Index_Model_Process $process */
173+ foreach ($ manualIndexProcessCollection as $ process ) {
174+ $ unprocessedEventsCollection = $ process
175+ ->getUnprocessedEventsCollection ()
176+ ->addFieldToFilter ('created_at ' , ['lt ' => $ oldEventsThreshold ])
177+ ->load ();
178+
179+ $ i = 0 ;
180+ $ eventList = [];
181+ /** @var Mage_Index_Model_Event $unprocessedEvent */
182+ foreach ($ unprocessedEventsCollection as $ unprocessedEvent ) {
183+ $ i ++;
184+ $ eventList [] = $ unprocessedEvent ->getId ();
185+ if ($ i === self ::OLD_INDEX_EVENT_DELETE_COUNT ) {
186+ break ;
187+ }
188+ }
189+
190+ if (!empty ($ eventList )) {
191+ $ where = new Zend_Db_Expr (
192+ sprintf (
193+ 'event_id in (%s) ' ,
194+ implode (', ' , $ eventList )
195+ )
196+ );
197+ $ writeConnection ->delete ($ indexEventTableName , $ where );
198+ }
199+ }
200+ }
138201}
0 commit comments