- Модуль: seo
- Путь к файлу: ~/bitrix/modules/seo/lib/retargeting/internals/queue.php
- Класс: BitrixSeoRetargetingInternalsQueueTable
- Вызов: QueueTable::processQueue
static function processQueue($type)
{
$hasQueue = false;
$queryData = array();
$audience = Service::getAudience($type);
$maxQuantity = $audience->getMaxContactsPerPacket();
$maxQuantity = $maxQuantity > 1000 ? 1000 : $maxQuantity;
$queueDb = static::getList(array(
'filter' => array(
'=TYPE' => $type,
'=ACTION' => array(
self::ACTION_IMPORT,
self::ACTION_REMOVE,
self::ACTION_IMPORT_AND_AUTO_REMOVE,
)
),
'limit' => $maxQuantity
));
while ($queueItem = $queueDb->fetch())
{
$hasQueue = true;
$isRemove = $queueItem['ACTION'] == self::ACTION_REMOVE ? 'Y' : 'N';
$queryId = $queueItem['TYPE'];
$queryId .= '_' . $queueItem['PARENT_ID'];
$queryId .= '_' . $queueItem['CLIENT_ID'];
$queryId .= '_' . $queueItem['ACCOUNT_ID'];
$queryId .= '_' . $queueItem['AUDIENCE_ID'];
$queryId .= '_' . $isRemove;
if (!isset($queryData[$queryId]))
{
$queryData[$queryId] = array(
'CLIENT_ID' => $queueItem['CLIENT_ID'],
'ACCOUNT_ID' => $queueItem['ACCOUNT_ID'],
'AUDIENCE_ID' => $queueItem['AUDIENCE_ID'],
'PARENT_ID' => $queueItem['PARENT_ID'],
'IS_REMOVE' => $isRemove,
'CONTACTS' => array(),
'DELETE_ID_LIST' => array(),
'AUTO_REMOVE_ID_LIST' => array(),
);
}
$contactType = $queueItem['CONTACT_TYPE'];
if (!isset($queryData[$queryId]['CONTACTS'][$contactType]))
{
$queryData[$queryId]['CONTACTS'][$contactType] = array();
}
$queryData[$queryId]['CONTACTS'][$contactType][] = $queueItem['VALUE'];
if ($queueItem['ACTION'] == self::ACTION_IMPORT_AND_AUTO_REMOVE)
{
$queryData[$queryId]['AUTO_REMOVE_ID_LIST'][] = $queueItem['ID'];
}
else
{
$queryData[$queryId]['DELETE_ID_LIST'][] = $queueItem['ID'];
}
}
$lastClientId = null;
$service = null;
$authAdapter = Service::getAuthAdapter($type);
foreach ($queryData as $queryId => $query)
{
foreach ($query['CONTACTS'] as $contactType => $contacts)
{
$query['CONTACTS'][$contactType] = array_unique($contacts);
}
if ($lastClientId != $query['CLIENT_ID'] || !$service || !$authAdapter)
{
$lastClientId = $query['CLIENT_ID'];
$service = new Service();
$service->setClientId($lastClientId);
$authAdapter->setService($service);
}
$audience->setService($service);
$audience->getRequest()->setAuthAdapter($authAdapter);
$audience->disableQueueMode();
$audience->setAccountId($query['ACCOUNT_ID']);
$contactTypes = $audience->isSupportMultiTypeContacts() ? array('') : array_keys($query['CONTACTS']);
foreach ($contactTypes as $contactType)
{
if ($query['IS_REMOVE'] != 'Y')
{
$audienceImportResult = $audience->addContacts(
$query['AUDIENCE_ID'],
$query['CONTACTS'],
array(
'type' => $contactType
)
);
}
else
{
$audienceImportResult = $audience->deleteContacts(
$query['AUDIENCE_ID'],
$query['CONTACTS'],
array(
'type' => $contactType
)
);
}
if ($audienceImportResult->isSuccess())
{
if (!empty($query['DELETE_ID_LIST']))
{
$portions = self::divideListIntoPortions($query['DELETE_ID_LIST']);
foreach ($portions as $portion)
{
Application::getConnection()->query(
"DELETE FROM " . self::getTableName() . " WHERE ID IN (" . implode(',', $portion) . ")"
);
}
}
if (!empty($query['AUTO_REMOVE_ID_LIST']))
{
$portions = self::divideListIntoPortions($query['AUTO_REMOVE_ID_LIST']);
foreach ($portions as $portion)
{
Application::getConnection()->query(
"UPDATE " . self::getTableName() . " SET ACTION='" . self::ACTION_AUTO_REMOVE . "'" .
"WHERE ID IN (" . implode(',', $portion) . ")"
);
}
static::addQueueAutoRemoveAgent();
}
}
else
{
Application::getConnection()->query(
"DELETE FROM " . self::getTableName() .
" WHERE TYPE = '" . Application::getConnection()->getSqlHelper()->forSql($type) . "'" .
" AND ACTION in ('" . implode("', '", [self::ACTION_IMPORT, self::ACTION_IMPORT_AND_AUTO_REMOVE, self::ACTION_REMOVE]) . "')" .
" AND DATE_INSERT < '" . (new DateTime())->add('-1 day')->format("Y-m-d H:i:s") . "'"
);
}
}
}
return $hasQueue;
}