• Модуль: disk
  • Путь к файлу: ~/bitrix/modules/disk/lib/volume/module/module.php
  • Класс: BitrixDiskVolumeModuleindicator
  • Вызов: indicator::prepareUserFieldQuery
protected function prepareUserFieldQuery($entityClass, array $userField, array $relation = null)
{
	$connection = Application::getConnection();

	/** @var MainORMDataDataManager $entityClass */
	$ufName = $entityClass::getUfId();
	$ufType = $userField['USER_TYPE_ID'];

	$relationSql = '';
	$relationSelectSql = '';
	$relationGroupBySql = '';
	$relationGroupSelectSql = '';
	if (is_array($relation))
	{
		$relationSelect = [];
		$relationGroupBy = [];
		$relationGroupSelect = [];
		foreach ($relation['select'] as $alias => $field)
		{
			$relationSelect[] = "REL.$field as $alias";
			$relationGroupBy[] = "flsrc.$alias";
			$relationGroupSelect[] = "flsrc.$alias";
		}
		$relationSelectSql = ', '. implode(', ', $relationSelect);
		$relationGroupBySql = 'GROUP BY '. implode(', ', $relationGroupBy);
		$relationGroupSelectSql = ', '. implode(', ', $relationGroupSelect);
		$relationSql = ' INNER JOIN '. $relation['table']. ' REL on REL.'. $relation['relation'] .' = ufsrc.VALUE_ID ';
	}

	$querySql = '';
	if ($userField['MULTIPLE'] == 'Y')
	{
		$ufId = $userField['ID'];
		$utmEntityTableName = 'b_utm_'.mb_strtolower($ufName);

		if ($connection->isTableExists($utmEntityTableName))
		{
			switch ($ufType)
			{
				case DiskUfFileUserType::USER_TYPE_ID:
				{
					$querySql = "
						SELECT
							SUM(FILE_SIZE) as FILE_SIZE,
							COUNT(*) as FILE_COUNT,
							SUM(FILE_SIZE) as DISK_SIZE,
							COUNT(*) as DISK_COUNT,
							COUNT(*) as VERSION_COUNT
							{$relationGroupSelectSql}
						FROM 
						(
							SELECT DISTINCT
								f.ID,
								f.FILE_SIZE
								{$relationSelectSql}
							FROM
								{$utmEntityTableName} ufsrc
								{$relationSql}
								INNER JOIN b_disk_attached_object attached
									ON attached.ID = ufsrc.VALUE_INT
									AND ufsrc.FIELD_ID = '{$ufId}'
								INNER JOIN b_disk_object files
									ON files.ID = attached.OBJECT_ID 
									AND files.ID = files.REAL_OBJECT_ID
									AND files.TYPE = '".ObjectTable::TYPE_FILE."'
								INNER JOIN b_file f
									ON f.ID = files.FILE_ID 
						) flsrc
						{$relationGroupBySql}
						ORDER BY NULL
					";
					break;
				}

				case DiskUfVersionUserType::USER_TYPE_ID:
				{
					$querySql = "
						SELECT
							SUM(FILE_SIZE) as FILE_SIZE,
							COUNT(*) as FILE_COUNT,
							SUM(FILE_SIZE) as DISK_SIZE,
							COUNT(*) as DISK_COUNT,
							COUNT(*) as VERSION_COUNT
							{$relationGroupSelectSql}
						FROM 
						(
							SELECT DISTINCT
								f.ID,
								f.FILE_SIZE
								{$relationSelectSql}
							FROM
								{$utmEntityTableName} ufsrc
								{$relationSql}
								INNER JOIN b_disk_attached_object attached
									ON attached.ID = ufsrc.VALUE_INT
									AND ufsrc.FIELD_ID = '{$ufId}'
								INNER JOIN b_disk_version versions
									ON versions.ID = attached.VERSION_ID 
								INNER JOIN b_disk_object files
									ON files.ID = versions.OBJECT_ID
									AND files.ID = attached.OBJECT_ID 
									AND files.ID = files.REAL_OBJECT_ID
									AND files.TYPE = '".ObjectTable::TYPE_FILE."'
								INNER JOIN b_file f
									ON f.ID = versions.FILE_ID
						) flsrc
						{$relationGroupBySql}
						ORDER BY NULL
					";
					break;
				}

				case CUserTypeFile::USER_TYPE_ID:
				{
					$querySql = "
						SELECT
							SUM(FILE_SIZE) as FILE_SIZE,
							COUNT(*) as FILE_COUNT,
							0 as DISK_SIZE,
							0 as DISK_COUNT,
							0 as VERSION_COUNT
							{$relationGroupSelectSql}
						FROM 
						(
							SELECT DISTINCT
								f.ID,
								f.FILE_SIZE
								{$relationSelectSql}
							FROM
								{$utmEntityTableName} ufsrc
								{$relationSql}
								INNER JOIN b_file f
									ON f.ID = ufsrc.VALUE_INT
									AND ufsrc.FIELD_ID = '{$ufId}'
						) flsrc
						{$relationGroupBySql}
						ORDER BY NULL
					";
					break;
				}
			}
		}
	}
	else
	{
		$ufEntityTableFieldName = $userField['FIELD_NAME'];
		$utsEntityTableName = 'b_uts_'.mb_strtolower($ufName);

		if ($connection->isTableExists($utsEntityTableName))
		{
			switch ($ufType)
			{
				case DiskUfFileUserType::USER_TYPE_ID:
				{
					$querySql = "
						SELECT
							SUM(FILE_SIZE) as FILE_SIZE,
							COUNT(*) as FILE_COUNT,
							SUM(FILE_SIZE) as DISK_SIZE,
							COUNT(*) as DISK_COUNT,
							COUNT(*) as VERSION_COUNT
							{$relationGroupSelectSql}
						FROM 
						(
							SELECT DISTINCT
								f.ID,
								f.FILE_SIZE
								{$relationSelectSql}
							FROM
								{$utsEntityTableName} ufsrc
								{$relationSql}
								INNER JOIN b_disk_attached_object attached
									ON attached.ID = cast(ufsrc.{$ufEntityTableFieldName} as UNSIGNED)
									and ufsrc.{$ufEntityTableFieldName} REGEXP '^[0-9]+$'
								INNER JOIN b_disk_object files
									ON files.ID = attached.OBJECT_ID 
									AND files.ID = files.REAL_OBJECT_ID
									AND files.TYPE = '".ObjectTable::TYPE_FILE."'
								INNER JOIN b_file f
									ON f.ID = files.FILE_ID 
						) flsrc
						{$relationGroupBySql}
						ORDER BY NULL
					";
					break;
				}

				case DiskUfVersionUserType::USER_TYPE_ID:
				{
					$querySql = "
						SELECT
							SUM(FILE_SIZE) as FILE_SIZE,
							COUNT(*) as FILE_COUNT,
							SUM(FILE_SIZE) as DISK_SIZE,
							COUNT(*) as DISK_COUNT,
							COUNT(*) as VERSION_COUNT
							{$relationGroupSelectSql}
						FROM 
						(
							SELECT DISTINCT
								f.ID,
								f.FILE_SIZE
								{$relationSelectSql}
							FROM
								{$utsEntityTableName} ufsrc
								{$relationSql}
								INNER JOIN b_disk_attached_object attached
									ON attached.ID = cast(ufsrc.{$ufEntityTableFieldName} as UNSIGNED)
									and ufsrc.{$ufEntityTableFieldName} REGEXP '^[0-9]+$'
								INNER JOIN b_disk_version versions
									ON versions.ID = attached.VERSION_ID 
								INNER JOIN b_disk_object files
									ON files.ID = versions.OBJECT_ID
									AND files.ID = attached.OBJECT_ID
									AND files.ID = files.REAL_OBJECT_ID
									AND files.TYPE = '".ObjectTable::TYPE_FILE."'
								INNER JOIN b_file f
									ON f.ID = versions.FILE_ID 
						) flsrc
						{$relationGroupBySql}
						ORDER BY NULL
					";
					break;
				}

				case CUserTypeFile::USER_TYPE_ID:
				{
					$querySql = "
						SELECT
							SUM(FILE_SIZE) as FILE_SIZE,
							COUNT(*) as FILE_COUNT,
							0 as DISK_SIZE,
							0 as DISK_COUNT,
							0 as VERSION_COUNT
							{$relationGroupSelectSql}
						FROM 
						(
							SELECT DISTINCT
								f.ID,
								f.FILE_SIZE
								{$relationSelectSql}
							FROM
								{$utsEntityTableName} ufsrc
								{$relationSql}
								INNER JOIN b_file f
									ON f.ID = cast(ufsrc.{$ufEntityTableFieldName} as UNSIGNED)
									and ufsrc.{$ufEntityTableFieldName} REGEXP '^[0-9]+$'
						) flsrc
						{$relationGroupBySql}
						ORDER BY NULL
					";
					break;
				}
			}
		}
	}

	return $querySql;
}