exports: improve activity DateAggregator

- put orderby at the end
- addSelect with TO_CHAR() function (cancel EXRACT())
- uniformize addSelect cases
- orderBy with variable
- improve getLabels
This commit is contained in:
Mathieu Jaumotte 2022-08-25 14:10:06 +02:00
parent f5baa2c152
commit b5139ec460

View File

@ -34,31 +34,26 @@ class DateAggregator implements AggregatorInterface
public function getLabels($key, array $values, $data)
{
return function ($value) use ($data): string {
if ($value === '_header') {
return 'by '. $data['frequency'];
}
switch ($data['frequency']) {
case 'month':
if ($value === '_header') {
return 'by month';
}
$month = \DateTime::createFromFormat('!m', $value);
return
sprintf("%02d", $value) .'/'.
$month->format('F') // TODO translation ?!?
;
return sprintf(
"%02d (%s)",
$value,
$month->format('M')
);
case 'week':
if ($value === '_header') {
return 'by week';
}
return $this->translator->trans('for week') .' '. $value ;
//return $this->translator->trans('for week') .' '. $value ;
case 'year':
if ($value === '_header') {
return 'by year';
}
return $this->translator->trans('in year') .' '. $value ;
//return $this->translator->trans('in year') .' '. $value ;
default:
throw new RuntimeException(sprintf('The value %s is not valid', $value));
return $value;
}
};
}
@ -91,34 +86,24 @@ class DateAggregator implements AggregatorInterface
public function alterQuery(QueryBuilder $qb, $data)
{
$order = null;
switch ($data['frequency']) {
case 'month':
$qb
//->addSelect("TO_CHAR(activity.date,'Mon') AS MON")
->addSelect('EXTRACT(month FROM activity.date) AS date_aggregator')
//->orderBy('date_aggregator')
;
break;
$fmt = 'MM'; break;
case 'week':
$qb
->addSelect("TO_CHAR(activity.date, 'IW') AS date_aggregator")
//->orderBy('date_aggregator')
;
break;
$fmt = 'IW'; break;
case 'year':
$qb
//->addSelect("TO_CHAR(activity.date, 'YYYY') AS date_aggregator")
->addSelect('EXTRACT(year FROM activity.date) AS date_aggregator')
//->orderBy('date_aggregator', 'ASC')
;
break;
$fmt = 'YYYY'; $order = 'DESC'; break;
default:
throw new RuntimeException(sprintf("The frequency data '%s' is invalid.", $data['frequency']));
}
$qb->addSelect(sprintf("TO_CHAR(activity.date, '%s') AS date_aggregator", $fmt));
$groupBy = $qb->getDQLPart('groupBy');
if (!empty($groupBy)) {
@ -126,6 +111,14 @@ class DateAggregator implements AggregatorInterface
} else {
$qb->groupBy('date_aggregator');
}
$orderBy = $qb->getDQLPart('orderBy');
if (!empty($orderBy)) {
$qb->addOrderBy('date_aggregator', $order);
} else {
$qb->orderBy('date_aggregator', $order);
}
}
public function applyOn(): string