• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/lib/helper/messageclosurestepper.php
  • Класс: BitrixMailHelperMessageClosureStepper
  • Вызов: MessageClosureStepper::execute
public function execute(array &$option)
{
	global $DB, $pPERIOD;

	$pPERIOD = 10;

	$option['count'] = MailMailMessageTable::getCount();
	$option['steps'] = MailInternalsMessageClosureTable::getList(array(
		'select' => array(
			new MainEntityExpressionField('CNT', 'COUNT(DISTINCT %s)', 'MESSAGE_ID')
		),
	))->fetch()['CNT'];

	if ($option['steps'] < $option['count'])
	{
		if (!($option['mailboxId'] > 0) || $option['stage'] < 1)
		{
			$option['mailboxId'] = $DB->query(
				'SELECT MAILBOX_ID FROM b_mail_message M WHERE NOT EXISTS (
					SELECT 1 FROM b_mail_message_closure WHERE MESSAGE_ID = M.ID
				) LIMIT 1'
			)->fetch()['MAILBOX_ID'];

			$option['stage'] = 1;
		}
	}
	else
	{
		$option['mailboxId'] = false;

		$option['stage'] = 3;
	}

	if ($option['mailboxId'] > 0 && 1 == $option['stage'])
	{
		$res = MessageClosureTable::insertIgnoreFromSelect(sprintf(
			'SELECT M.ID, M.ID FROM b_mail_message M
				WHERE M.MAILBOX_ID = %u AND (
					M.IN_REPLY_TO IS NULL OR M.IN_REPLY_TO = '' OR M.IN_REPLY_TO = M.MSG_ID OR NOT EXISTS (
						SELECT 1 FROM b_mail_message WHERE MAILBOX_ID = M.MAILBOX_ID AND MSG_ID = M.IN_REPLY_TO
					)
				) AND NOT EXISTS (SELECT 1 FROM b_mail_message_closure WHERE MESSAGE_ID = M.ID)
				LIMIT 40000',
			(int)$option['mailboxId']
		));

		$option['stage'] = $res < 40000 ? 2 : 1;
		$option['steps'] += $res;

		return self::CONTINUE_EXECUTION;
	}

	if ($option['mailboxId'] > 0 && 2 == $option['stage'])
	{
		$res = MessageClosureTable::insertIgnoreFromSelect(sprintf(
			'SELECT DISTINCT M.ID, C.PARENT_ID
				FROM b_mail_message M
					LEFT JOIN b_mail_message R ON M.MAILBOX_ID = R.MAILBOX_ID AND M.IN_REPLY_TO = R.MSG_ID
					LEFT JOIN b_mail_message_closure C ON R.ID = C.MESSAGE_ID
				WHERE M.MAILBOX_ID = %u
					AND EXISTS (SELECT 1 FROM b_mail_message_closure WHERE MESSAGE_ID = R.ID)
					AND NOT EXISTS (SELECT 1 FROM b_mail_message_closure WHERE MESSAGE_ID = M.ID)',
			(int)$option['mailboxId']
		));

		$option['stage'] = $res > 0 ? 3 : 4;

		return self::CONTINUE_EXECUTION;
	}

	if (3 == $option['stage'])
	{
		$res = MessageClosureTable::insertIgnoreFromSelect(
			'SELECT DISTINCT C.MESSAGE_ID, C.MESSAGE_ID
				FROM b_mail_message_closure C
				WHERE NOT EXISTS (SELECT 1 FROM b_mail_message_closure WHERE PARENT_ID = C.MESSAGE_ID)'
		);

		$option['stage'] = $res > 0 ? 2 : 4;
	}

	if (4 == $option['stage'])
	{
		$res = MessageClosureTable::insertIgnoreFromSelect(sprintf(
			'SELECT M.ID, M.ID FROM b_mail_message M
				WHERE M.MAILBOX_ID = %u
					AND NOT EXISTS (SELECT 1 FROM b_mail_message_closure WHERE MESSAGE_ID = M.ID)
				ORDER BY FIELD_DATE ASC LIMIT 1',
			(int)$option['mailboxId']
		));

		$option['stage'] = $res > 0 ? 2 : 0;
	}

	return $option['mailboxId'] > 0 ? self::CONTINUE_EXECUTION : self::FINISH_EXECUTION;
}