public function measure(array $collectData = []): self
{
if (!$this->isMeasureAvailable())
{
$this->addError(new BitrixMainError('', self::ERROR_MEASURE_UNAVAILABLE));
return $this;
}
$connection = BitrixMainApplication::getConnection();
$indicatorType = $connection->getSqlHelper()->forSql(static::className());
$ownerId = (string)$this->getOwner();
VolumeTable::createTemporally();
$temporallyTableName = VolumeTable::getTemporallyName();
// Scan specific folder list in a storage
$storageList = $this->getStorageList();
if (count($storageList) > 0)
{
foreach ($storageList as $storage)
{
$storageId = $storage->getId();
$parentId = $storage->getRootObjectId();
$folderIds = [];
$folderList = $this->getFolderList($storage);
if (count($folderList) > 0)
{
foreach ($folderList as $folder)
{
$folderIds[] = $folder->getId();
}
}
if (count($folderIds) > 0)
{
$agr = new VolumeFolderTree;
$agr
->setOwner($this->getOwner())
->addFilter('STORAGE_ID', $storageId)
->addFilter('@FOLDER_ID', $folderIds)
->purify()
->measure([self::DISK_FILE]);
$indicatorTypeFolder = $connection->getSqlHelper()->forSql(VolumeFolder::className());
$folderIdSql = implode(',', $folderIds);
$querySql = "
INSERT INTO {$temporallyTableName}
(
INDICATOR_TYPE,
OWNER_ID,
CREATE_TIME,
FILE_SIZE,
FILE_COUNT,
DISK_SIZE,
DISK_COUNT,
VERSION_COUNT,
ATTACHED_COUNT,
LINK_COUNT,
SHARING_COUNT,
UNNECESSARY_VERSION_SIZE,
UNNECESSARY_VERSION_COUNT
)
SELECT
'{$indicatorType}',
{$ownerId},
" . $connection->getSqlHelper()->getCurrentDateTimeFunction() . ",
SUM(FILE_SIZE),
SUM(FILE_COUNT),
SUM(DISK_SIZE),
SUM(DISK_COUNT),
SUM(VERSION_COUNT),
SUM(ATTACHED_COUNT),
SUM(LINK_COUNT),
SUM(SHARING_COUNT),
SUM(UNNECESSARY_VERSION_SIZE),
SUM(UNNECESSARY_VERSION_COUNT)
FROM
b_disk_volume
WHERE
INDICATOR_TYPE = '{$indicatorTypeFolder}'
and OWNER_ID = {$ownerId}
and STORAGE_ID = '{$storageId}'
and FOLDER_ID IN( {$folderIdSql} )
and PARENT_ID = '{$parentId}'
";
$connection->queryExecute($querySql);
}
}
$querySql = "
SELECT
INDICATOR_TYPE,
OWNER_ID,
" . $connection->getSqlHelper()->getCurrentDateTimeFunction() . ",
SUM(FILE_SIZE),
SUM(FILE_COUNT),
SUM(DISK_SIZE),
SUM(DISK_COUNT),
SUM(VERSION_COUNT),
SUM(ATTACHED_COUNT),
SUM(LINK_COUNT),
SUM(SHARING_COUNT),
SUM(UNNECESSARY_VERSION_SIZE),
SUM(UNNECESSARY_VERSION_COUNT)
FROM
{$temporallyTableName}
WHERE
INDICATOR_TYPE = '{$indicatorType}'
GROUP BY
INDICATOR_TYPE
ORDER BY NULL
";
$columnList = VolumeQueryHelper::prepareInsert(
[
'INDICATOR_TYPE',
'OWNER_ID',
'CREATE_TIME',
'FILE_SIZE',
'FILE_COUNT',
'DISK_SIZE',
'DISK_COUNT',
'VERSION_COUNT',
'ATTACHED_COUNT',
'LINK_COUNT',
'SHARING_COUNT',
'UNNECESSARY_VERSION_SIZE',
'UNNECESSARY_VERSION_COUNT',
],
$this->getSelect()
);
$tableName = VolumeTable::getTableName();
$connection->queryExecute("INSERT INTO {$tableName} ({$columnList}) {$querySql}");
VolumeTable::clearTemporally();
}
return $this;
}