Do not break performance when no postponed date exists

Some sites do not use postponed_date at all.
It would be a massive performance issue to still search for them for
each and every date instance that is created.

This small addition will solve the issue for those pages.
It will still once at least one internal reference is added.

We could then try to add proxies which are build and added, but don't
use the DB. That way the performance would still be okay, and data will
only be fetched when used.
This commit is contained in:
Daniel Siepmann 2021-09-06 16:11:04 +02:00
parent 8816eca99e
commit d0cb951550

View file

@ -38,17 +38,32 @@ class AddSpecialProperties
*/ */
private $dataMapper; private $dataMapper;
/**
* Internal info to speed things up if we know there are none.
* @var bool
*/
private $doPostponedDatesExist = true;
public function __construct( public function __construct(
ConnectionPool $connectionPool, ConnectionPool $connectionPool,
DataMapper $dataMapper DataMapper $dataMapper
) { ) {
$this->connectionPool = $connectionPool; $this->connectionPool = $connectionPool;
$this->dataMapper = $dataMapper; $this->dataMapper = $dataMapper;
$qb = $this->connectionPool->getQueryBuilderForTable('tx_events_domain_model_date');
$qb->count('uid');
$qb->from('tx_events_domain_model_date');
$qb->where($qb->expr()->gt('postponed_date', $qb->createNamedParameter(0)));
$this->doPostponedDatesExist = $qb->execute()->fetchColumn() > 0;
} }
public function __invoke(AfterObjectThawedEvent $event): void public function __invoke(AfterObjectThawedEvent $event): void
{ {
if ($event->getObject() instanceof Date) { if (
$this->doPostponedDatesExist
&& $event->getObject() instanceof Date
) {
/** @var Date $date */ /** @var Date $date */
$date = $event->getObject(); $date = $event->getObject();
$date->_setProperty('originalDate', $this->getOriginalDate($date->_getProperty('_localizedUid'))); $date->_setProperty('originalDate', $this->getOriginalDate($date->_getProperty('_localizedUid')));