public function measure(array $collectData = []): self
{
if (!$this->isMeasureAvailable())
{
$this->addError(new BitrixMainError('', self::ERROR_MEASURE_UNAVAILABLE));
return $this;
}
$connection = BitrixMainApplication::getConnection();
$sqlHelper = $connection->getSqlHelper();
$indicatorType = $sqlHelper->forSql(static::className());
$ownerId = (string)$this->getOwner();
$excludeIblockIds = [];
// Exclude webdav iblocks
$webdav = new VolumeModuleWebdav();
$webdavIblockList = $webdav->getIblockList();
if (count($webdavIblockList) > 0)
{
foreach ($webdavIblockList as $iblock)
{
$excludeIblockIds[] = $iblock['ID'];
}
}
$filter = $this->getFilter($excludeIblockIds ? ['!@IBLOCK_ID' => $excludeIblockIds] : []);
$includeIblockIds = [];
if (isset($filter['@IBLOCK_ID']))
{
$includeIblockIds = $filter['@IBLOCK_ID'];
}
elseif (isset($filter['IBLOCK_ID']))
{
$includeIblockIds[] = $filter['IBLOCK_ID'];
}
elseif (isset($filter['=IBLOCK_ID']))
{
$includeIblockIds[] = $filter['@IBLOCK_ID'];
}
$groupSelectSql = '';
$groupBySql = '';
$groupColumns = [];
if (count($includeIblockIds) > 0)
{
$groupColumns[] = 'IBLOCK_ID';
$groupBySql = 'GROUP BY src.IBLOCK_ID';
$groupSelectSql = ', src.IBLOCK_ID';
}
// iblock filter
$filterIblockSql = '1 = 1';
$filterSectionSql = '1 = 1';
$filterElementSql = '1 = 1';
if (!empty($excludeIblockIds))
{
$filterIblockSql = VolumeQueryHelper::prepareWhere(
$this->getFilter(['!@IBLOCK_ID' => $excludeIblockIds]),
['IBLOCK_ID' => 'iblock.ID']
);
// section filter
$filterSectionSql = VolumeQueryHelper::prepareWhere(
$this->getFilter(['!@IBLOCK_ID' => $excludeIblockIds]),
['IBLOCK_ID' => 'section.IBLOCK_ID']
);
// element filter
$filterElementSql = VolumeQueryHelper::prepareWhere(
$this->getFilter(['!@IBLOCK_ID' => $excludeIblockIds]),
['IBLOCK_ID' => 'element.IBLOCK_ID']
);
}
// Scan User fields specific to module
$entityUserFieldSource = $this->prepareUserFieldSourceSql([
'table' => 'b_iblock_element',
'relation' => 'ID',
'select' => ['IBLOCK_ID' => 'ID'],
]);
if ($entityUserFieldSource != '')
{
$entityUserFieldSource = " UNION {$entityUserFieldSource} ";
}
// language=SQL
$querySql = "
SELECT
'{$indicatorType}' as INDICATOR_TYPE,
{$ownerId} as OWNER_ID,
". $connection->getSqlHelper()->getCurrentDateTimeFunction(). " as CREATE_TIME,
SUM(src.FILE_SIZE) as FILE_SIZE,
SUM(src.FILE_COUNT) as FILE_COUNT
{$groupSelectSql}
FROM
(
/*-- iblock --*/
(
SELECT
COUNT(f.ID) as FILE_COUNT,
SUM(f.FILE_SIZE) as FILE_SIZE,
0 as DISK_SIZE,
0 as DISK_COUNT,
0 as VERSION_COUNT,
iblock.ID as IBLOCK_ID
FROM
b_file f
INNER JOIN b_iblock iblock on iblock.PICTURE = f.ID
WHERE
{$filterIblockSql}
GROUP BY
iblock.ID
ORDER BY NULL
)
/*-- section --*/
UNION
(
SELECT
COUNT(f.ID) as FILE_COUNT,
SUM(f.FILE_SIZE) as FILE_SIZE,
0 as DISK_SIZE,
0 as DISK_COUNT,
0 as VERSION_COUNT,
section.IBLOCK_ID
FROM
b_file f
INNER JOIN b_iblock_section section
on section.PICTURE = f.ID
WHERE
{$filterSectionSql}
GROUP BY
section.IBLOCK_ID
ORDER BY NULL
)
UNION
(
SELECT
COUNT(f.ID) as FILE_COUNT,
SUM(f.FILE_SIZE) as FILE_SIZE,
0 as DISK_SIZE,
0 as DISK_COUNT,
0 as VERSION_COUNT,
section.IBLOCK_ID
FROM
b_file f
INNER JOIN b_iblock_section section
on section.DETAIL_PICTURE = f.ID
WHERE
{$filterSectionSql}
GROUP BY
section.IBLOCK_ID
ORDER BY NULL
)
/*-- element --*/
UNION
(
SELECT
COUNT(f.ID) as FILE_COUNT,
SUM(f.FILE_SIZE) as FILE_SIZE,
0 as DISK_SIZE,
0 as DISK_COUNT,
0 as VERSION_COUNT,
element.IBLOCK_ID
FROM
b_file f
INNER JOIN b_iblock_element element
on element.PREVIEW_PICTURE = f.ID
WHERE
{$filterElementSql}
GROUP BY
element.IBLOCK_ID
ORDER BY NULL
)
UNION
(
SELECT
COUNT(f.ID) as FILE_COUNT,
SUM(f.FILE_SIZE) as FILE_SIZE,
0 as DISK_SIZE,
0 as DISK_COUNT,
0 as VERSION_COUNT,
element.IBLOCK_ID
FROM
b_file f
INNER JOIN b_iblock_element element
on element.DETAIL_PICTURE = f.ID
WHERE
{$filterElementSql}
GROUP BY
element.IBLOCK_ID
ORDER BY NULL
)
/*-- property --*/
UNION
(
SELECT
COUNT(f.ID) as FILE_COUNT,
SUM(f.FILE_SIZE) as FILE_SIZE,
0 as DISK_SIZE,
0 as DISK_COUNT,
0 as VERSION_COUNT,
element.IBLOCK_ID
FROM
b_iblock_element element
INNER JOIN b_iblock_element_property property
on element.ID = property.IBLOCK_ELEMENT_ID
and property.IBLOCK_PROPERTY_ID in(
SELECT id
FROM b_iblock_property
WHERE PROPERTY_TYPE = '". PropertyTable::TYPE_FILE ."' or USER_TYPE = 'FileMan'
)
INNER JOIN b_file f
on f.ID = property.VALUE_NUM
and property.VALUE_NUM > 0
WHERE
{$filterElementSql}
GROUP BY
element.IBLOCK_ID
ORDER BY NULL
)
{$entityUserFieldSource}
) src
{$groupBySql}
ORDER BY NULL
";
$columnList = VolumeQueryHelper::prepareInsert(
array_merge(
[
'INDICATOR_TYPE',
'OWNER_ID',
'CREATE_TIME',
'FILE_SIZE',
'FILE_COUNT',
],
$groupColumns
),
$this->getSelect()
);
$tableName = VolumeTable::getTableName();
$connection->queryExecute("INSERT INTO {$tableName} ({$columnList}) {$querySql}");
return $this;
}