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);
    }
}