Spaces:
No application file
No application file
| namespace Mautic\EmailBundle\Stats\Helper; | |
| use Doctrine\DBAL\ArrayParameterType; | |
| use Doctrine\DBAL\Connection; | |
| use Doctrine\DBAL\Query\QueryBuilder; | |
| use Mautic\CoreBundle\Doctrine\Provider\GeneratedColumnsProviderInterface; | |
| use Mautic\CoreBundle\Helper\Chart\ChartQuery; | |
| use Mautic\CoreBundle\Helper\Chart\DateRangeUnitTrait; | |
| use Mautic\CoreBundle\Helper\UserHelper; | |
| use Mautic\EmailBundle\Stats\FetchOptions\EmailStatOptions; | |
| use Mautic\StatsBundle\Aggregate\Collection\StatCollection; | |
| use Mautic\StatsBundle\Aggregate\Collector; | |
| abstract class AbstractHelper implements StatHelperInterface | |
| { | |
| use FilterTrait; | |
| use DateRangeUnitTrait; | |
| public function __construct( | |
| private Collector $collector, | |
| Connection $connection, | |
| protected GeneratedColumnsProviderInterface $generatedColumnsProvider, | |
| private UserHelper $userHelper | |
| ) { | |
| $this->connection = $connection; | |
| } | |
| /** | |
| * @return array | |
| * | |
| * @throws \Exception | |
| */ | |
| public function fetchStats(\DateTime $fromDateTime, \DateTime $toDateTime, EmailStatOptions $options) | |
| { | |
| $statCollection = $this->collector->fetchStats($this->getName(), $fromDateTime, $toDateTime, $options); | |
| $calculator = $statCollection->getCalculator($fromDateTime, $toDateTime); | |
| $stats = match ($this->getTimeUnitFromDateRange($fromDateTime, $toDateTime)) { | |
| 'Y' => $calculator->getSumsByYear(), | |
| 'm' => $calculator->getSumsByMonth(), | |
| 'W' => $calculator->getSumsByWeek(), | |
| 'd' => $calculator->getSumsByDay(), | |
| default => $calculator->getCountsByHour(), | |
| }; | |
| // Chart.js only care about the values | |
| return array_values($stats->getStats()); | |
| } | |
| /** | |
| * @return ChartQuery | |
| */ | |
| protected function getQuery(\DateTime $fromDateTime, \DateTime $toDateTime) | |
| { | |
| $unit = $this->getTimeUnitFromDateRange($fromDateTime, $toDateTime); | |
| if ('W' == $unit) { // We won't support week storage, we will store it by date | |
| $unit = 'd'; | |
| } | |
| $query = new ChartQuery($this->connection, $fromDateTime, $toDateTime, $unit); | |
| $query->setGeneratedColumnProvider($this->generatedColumnsProvider); | |
| return $query; | |
| } | |
| /** | |
| * Joins the email table and limits created_by to currently logged in user. | |
| * | |
| * @param string $emailIdColumn | |
| */ | |
| protected function limitQueryToCreator(QueryBuilder $q, $emailIdColumn = 't.email_id') | |
| { | |
| $q->join('t', MAUTIC_TABLE_PREFIX.'emails', 'e', 'e.id = '.$emailIdColumn) | |
| ->andWhere('e.created_by = :userId') | |
| ->setParameter('userId', $this->userHelper->getUser()->getId()); | |
| } | |
| /** | |
| * @param string $column | |
| * @param string $prefix | |
| */ | |
| protected function limitQueryToEmailIds(QueryBuilder $q, array $ids, $column, $prefix) | |
| { | |
| if (0 === count($ids)) { | |
| return; | |
| } | |
| if (1 === count($ids)) { | |
| $q->andWhere("$prefix.$column = :email_id"); | |
| $q->setParameter('email_id', $ids[0]); | |
| return; | |
| } | |
| $q->andWhere("$prefix.$column IN (:email_ids)"); | |
| $q->setParameter('email_ids', $ids, ArrayParameterType::INTEGER); | |
| } | |
| /** | |
| * @throws \Exception | |
| */ | |
| protected function fetchAndBindToCollection(QueryBuilder $q, StatCollection $statCollection) | |
| { | |
| $results = $q->executeQuery()->fetchAllAssociative(); | |
| foreach ($results as $result) { | |
| $statCollection->addStatByDateTimeStringInUTC($result['date'], $result['count']); | |
| } | |
| } | |
| } | |