Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\CoreBundle\Cache; | |
use Doctrine\Common\Cache\CacheProvider; | |
use Doctrine\Common\Cache\Psr6\DoctrineProvider; | |
use Doctrine\DBAL\Cache\QueryCacheProfile; | |
use Doctrine\DBAL\Configuration; | |
use Doctrine\DBAL\Connection; | |
use Doctrine\DBAL\Query\QueryBuilder; | |
use Doctrine\DBAL\Result; | |
use Doctrine\ORM\Query; | |
class ResultCacheHelper | |
{ | |
/** | |
* @return bool Returns true if cache was available and enabled on the $query | |
*/ | |
public static function enableOrmQueryCache(Query $query, ResultCacheOptions $resultCacheOptions): bool | |
{ | |
$cache = self::getCache($query->getEntityManager()->getConfiguration()); | |
if (!$cache) { | |
return false; | |
} | |
$query->setResultCacheProfile(self::createCacheProfile($resultCacheOptions, $cache)); | |
return true; | |
} | |
/** | |
* Executes the query using cache (if available) and returns its result. | |
*/ | |
public static function executeCachedDbalQuery(Connection $connection, QueryBuilder $queryBuilder, ResultCacheOptions $resultCacheOptions): Result | |
{ | |
$cache = self::getCache($connection->getConfiguration()); | |
if (!$cache) { | |
return $queryBuilder->executeQuery(); | |
} | |
return $connection->executeCacheQuery( | |
$queryBuilder->getSQL(), | |
$queryBuilder->getParameters(), | |
$queryBuilder->getParameterTypes(), | |
self::createCacheProfile($resultCacheOptions, $cache) | |
); | |
} | |
public static function getCache(Configuration $configuration): ?CacheProvider | |
{ | |
$cache = $configuration->getResultCache(); | |
if (!$cache) { | |
return null; | |
} | |
$cache = DoctrineProvider::wrap($cache); | |
if (!$cache instanceof CacheProvider) { | |
return null; | |
} | |
return $cache; | |
} | |
private static function createCacheProfile(ResultCacheOptions $resultCacheOptions, CacheProvider $cache): QueryCacheProfile | |
{ | |
$cache = clone $cache; | |
$cache->setNamespace($resultCacheOptions->getNamespace()); | |
return new QueryCacheProfile((int) $resultCacheOptions->getTtl(), $resultCacheOptions->getId(), $cache); | |
} | |
} | |