24 if (!Loader::includeModule(self::$moduleId))
26 return self::CONTINUE_EXECUTION;
29 $numOfIterations = (int)Option::get(self::$moduleId, self::OPTION_NAME_ITERATION_COUNT, self::ITERATION_COUNT_DEFAULT);
31 $result = self::CONTINUE_EXECUTION;
32 for (
$i = 0;
$i < $numOfIterations; ++
$i)
36 if (
$result === self::FINISH_EXECUTION)
42 if (!$this->hasMoreViewedMessages(
$option[
'lastId'] ?? 0))
44 return self::FINISH_EXECUTION;
50 private function makeMigrationIteration(
array &
$option): bool
57 return self::FINISH_EXECUTION;
61 $viewedMessageIds = $this->getViewedMessageIds(
$messages);
62 $this->setViewedFlag($viewedMessageIds);
64 return self::CONTINUE_EXECUTION;
67 private function getViewedMessageIds(EO_Message_Collection
$messages):
array
82 private function getMessages(
int $lastId): EO_Message_Collection
84 $subQuery = MessageViewedTable::query()
86 ->where(
'MESSAGE_ID',
new \Bitrix\Main\DB\SqlExpression(
'%s'))
88 $expression =
new ExpressionField(
'IS_VIEWED',
"EXISTS({$subQuery->getQuery()})", [
'ID']);
89 $expression->configureValueType(BooleanField::class);
90 $query = MessageTable::query()
91 ->setSelect([
'ID',
'IS_VIEWED'])
92 ->registerRuntimeField(
'IS_VIEWED', $expression)
93 ->setOrder([
'ID' =>
'DESC'])
94 ->setLimit((
int)Option::get(self::$moduleId, self::OPTION_NAME_LIMIT, self::LIMIT_DEFAULT))
102 return $query->fetchCollection();
105 private function hasMoreViewedMessages(
int $lastId): bool
112 $result = MessageViewedTable::query()
113 ->setSelect([
'MESSAGE_ID'])
114 ->setOrder([
'MESSAGE_ID' =>
'DESC'])
115 ->where(
'MESSAGE_ID',
'<',
$lastId)
123 private function setViewedFlag(
array $messageIds): void
125 if (empty($messageIds))
130 MessageTable::updateMulti($messageIds, [
'NOTIFY_READ' =>
'Y'],
true);