Spaces:
No application file
No application file
File size: 2,233 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
<?php
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);
}
}
|