• Модуль: 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];
}