- Модуль: disk
- Путь к файлу: ~/bitrix/modules/disk/lib/bitrix24disk/legacy/newdiskstorage.php
- Класс: BitrixDiskBitrix24DiskLegacyNewDiskStorage
- Вызов: NewDiskStorage::buildTreeFromFirstLevelLinks
private function buildTreeFromFirstLevelLinks(array $firstLevelLinks): array
{
$maxVersion = -1;
$deepLinks = [];
if (!$firstLevelLinks)
{
return [[], $maxVersion];
}
if (count($firstLevelLinks) < self::MAX_COUNT_LINKS_FOR_CYCLE)
{
/** @var TreeNode[] $firstLevelLinks */
foreach($firstLevelLinks as $link)
{
[$tree, $version] = $this->buildTreeFromLink($link);
$deepLinks = array_merge($deepLinks, $tree);
$maxVersion = max($maxVersion, $version);
}
}
else
{
$deletedTypeNone = ObjectTable::DELETED_TYPE_NONE;
$typeFolder = ObjectTable::TYPE_FOLDER;
$storageId = $this->storage->getId();
$securityContext = $this->storage->getSecurityContext($this->userId);
$rightExists = $securityContext->getSqlExpressionForList('object.ID', 'object.CREATED_BY');
$sqlQuery = "
SELECT object_pl1.ID, object_pl1.NAME, object_pl1.REAL_OBJECT_ID, object_pl1.PARENT_ID, object_pl1.CREATE_TIME, object_pl1.SYNC_UPDATE_TIME
FROM b_disk_object object
INNER JOIN b_disk_object_path p ON p.PARENT_ID = object.REAL_OBJECT_ID
INNER JOIN b_disk_object object_pl1 ON object_pl1.ID = p.OBJECT_ID
WHERE
object.STORAGE_ID = {$storageId} AND object.DELETED_TYPE = {$deletedTypeNone} AND object.TYPE = {$typeFolder} AND
object.REAL_OBJECT_ID <> object.ID AND
object_pl1.DELETED_TYPE = {$deletedTypeNone} AND object_pl1.TYPE = {$typeFolder} AND
({$rightExists})
";
$iterator = $this->connection->query($sqlQuery);
foreach($iterator as $folderRow)
{
$node = $this->fillTreeData($folderRow);
$maxVersion = max($maxVersion, $folderRow['SYNC_UPDATE_TIME']->getTimestamp());
if ($node->isLink() && !$this->isRealObjectExists($node))
{
$deepLinks[] = $node;
}
}
}
return [$deepLinks, $maxVersion];
}