PartKeepr\StatisticBundle\Services\StatisticService::getSampledStatistics PHP Method

getSampledStatistics() public method

Gets the sampled statistics.
public getSampledStatistics ( DateTime $startDate, DateTime $endDate, integer $sampleSize = 25 ) : array
$startDate DateTime
$endDate DateTime
$sampleSize integer
return array
    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;
    }