public function getSampledStatistics(\DateTime $startDate, \DateTime $endDate, $sampleSize = 25)
{
if ($startDate->getTimestamp() > $endDate->getTimestamp()) {
// Swap both times
list($startDate, $endDate) = [$endDate, $startDate];
}
$intervalSize = intval(($endDate->getTimestamp() - $startDate->getTimestamp()) / $sampleSize);
$queryStartTime = clone $startDate;
$queryEndTime = clone $startDate;
$queryEndTime->add(new \DateInterval('PT' . $intervalSize . 'S'));
$partUnitQuery = "SELECT pu FROM PartKeepr\\PartBundle\\Entity\\PartMeasurementUnit pu";
$query = $this->entityManager->createQuery($partUnitQuery);
$aPartUnits = $query->getResult();
$dql = "SELECT AVG(sts.parts) AS parts, AVG(sts.categories) AS categories FROM PartKeepr\\StatisticBundle\\Entity\\StatisticSnapshot sts WHERE sts.dateTime >= :start AND sts.dateTime <= :end";
$mainQuery = $this->entityManager->createQuery($dql);
$dql = "SELECT AVG(stsu.stockLevel) AS stockLevel FROM PartKeepr\\StatisticBundle\\Entity\\StatisticSnapshotUnit stsu JOIN stsu.statisticSnapshot sts WHERE sts.dateTime >= :start AND sts.dateTime <= :end AND stsu.partUnit = :partUnit";
$subQuery = $this->entityManager->createQuery($dql);
$aRecords = [];
for ($i = 0; $i < $sampleSize; $i++) {
$mainQuery->setParameter('start', $queryStartTime);
$mainQuery->setParameter('end', $queryEndTime);
$result = $mainQuery->getResult();
$record = $result[0];
if ($record['parts'] !== null) {
$record['parts'] = floatval($record['parts']);
}
if ($record['categories'] !== null) {
$record['categories'] = floatval($record['categories']);
}
foreach ($aPartUnits as $partUnit) {
/*
* @var $partUnit PartMeasurementUnit
*/
$subQuery->setParameter('start', $queryStartTime);
$subQuery->setParameter('end', $queryEndTime);
$subQuery->setParameter('partUnit', $partUnit);
$aResult = $subQuery->getResult();
if ($aResult[0]['stockLevel'] !== null) {
$record['units'][$partUnit->getName()] = floatval($aResult[0]['stockLevel']);
} else {
$record['units'][$partUnit->getName()] = null;
}
}
$record['start'] = $queryStartTime->format('Y-m-d H:i:s');
if ($record['parts'] !== null) {
$aRecords[] = $record;
}
$queryStartTime->add(new \DateInterval('PT' . $intervalSize . 'S'));
$queryEndTime->add(new \DateInterval('PT' . $intervalSize . 'S'));
}
return $aRecords;
}