Passed
Pull Request — master (#33)
by
unknown
12:06 queued 08:51
created

NodeEventRepository::findUniqueDimensions()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 7
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 9
rs 10
1
<?php
2
namespace AE\History\Domain\Repository;
3
4
use Neos\Flow\Annotations as Flow;
5
use Neos\Flow\Persistence\QueryResultInterface;
6
use Neos\Neos\EventLog\Domain\Model\NodeEvent;
7
use Neos\Neos\EventLog\Domain\Repository\EventRepository;
8
9
/**
10
 * The repository for events
11
 *
12
 * @Flow\Scope("singleton")
13
 */
14
class NodeEventRepository extends EventRepository
15
{
16
    const ENTITY_CLASSNAME = NodeEvent::class;
17
18
    /**
19
     * Find all events which are "top-level" and in a given workspace (or are not NodeEvents)
20
     *
21
     * @param int $offset
22
     * @param int $limit
23
     * @param string $workspaceName
24
     * @param string|null $siteIdentifier
25
     * @param string|null $nodeIdentifier
26
     * @param string|null $accountIdentifier
27
     * @param string|null $dimensionsHash
28
     * @return QueryResultInterface
29
     */
30
    public function findRelevantEventsByWorkspace(
31
        $offset,
32
        $limit,
33
        $workspaceName,
34
        string $siteIdentifier = null,
35
        string $nodeIdentifier = null,
36
        string $accountIdentifier = null,
37
        string $dimensionsHash = null
38
    ) : QueryResultInterface {
39
        $query = $this->prepareRelevantEventsQuery();
40
        $queryBuilder = $query->getQueryBuilder();
41
        $queryBuilder
42
            ->andWhere('e.workspaceName = :workspaceName AND e.eventType = :eventType')
43
            ->setParameter('workspaceName', $workspaceName)
44
            ->setParameter('eventType', 'Node.Published')
45
        ;
46
        if ($siteIdentifier !== null) {
47
            $siteCondition = '%' . trim(json_encode(['site' => $siteIdentifier], JSON_PRETTY_PRINT), "{}\n\t ") . '%';
48
            $queryBuilder
49
                ->andWhere('NEOSCR_TOSTRING(e.data) LIKE :site')
50
                ->setParameter('site', $siteCondition)
51
            ;
52
        }
53
        if ($nodeIdentifier !== null) {
54
            $queryBuilder
55
                ->andWhere('e.nodeIdentifier = :nodeIdentifier')
56
                ->setParameter('nodeIdentifier', $nodeIdentifier)
57
            ;
58
        }
59
        if ($accountIdentifier !== null) {
60
            $queryBuilder
61
                ->andWhere('e.accountIdentifier = :accountIdentifier')
62
                ->setParameter('accountIdentifier', $accountIdentifier)
63
            ;
64
        }
65
        if ($dimensionsHash !== null) {
66
            $queryBuilder
67
                ->andWhere('e.dimensionsHash = :dimensionsHash')
68
                ->setParameter('dimensionsHash', $dimensionsHash)
69
            ;
70
        }
71
        $queryBuilder->setFirstResult($offset);
72
        $queryBuilder->setMaxResults($limit);
73
74
        return $query->execute();
75
    }
76
77
    /**
78
     * Find all account identifiers that modified a specific site
79
     *
80
     * @param string $workspaceName
81
     * @param string|null $siteIdentifier
82
     * @param string|null $nodeIdentifier
83
     *
84
     * @return array
85
     */
86
    public function findAccountIdentifiers(
87
        string $workspaceName,
88
        string $siteIdentifier = null,
89
        string $nodeIdentifier = null
90
    ) : array {
91
        $query = $this->prepareRelevantEventsQuery();
92
        $queryBuilder = $query->getQueryBuilder();
93
        $queryBuilder
94
            ->andWhere('e.workspaceName = :workspaceName AND e.eventType = :eventType')
95
            ->setParameter('workspaceName', $workspaceName)
96
            ->setParameter('eventType', 'Node.Published')
97
        ;
98
        if ($siteIdentifier !== null) {
99
            $siteCondition = '%' . trim(json_encode(['site' => $siteIdentifier], JSON_PRETTY_PRINT), "{}\n\t ") . '%';
100
            $queryBuilder
101
                ->andWhere('NEOSCR_TOSTRING(e.data) LIKE :site')
102
                ->setParameter('site', $siteCondition)
103
            ;
104
        }
105
        if ($nodeIdentifier !== null) {
106
            $queryBuilder
107
                ->andWhere('e.nodeIdentifier = :nodeIdentifier')
108
                ->setParameter('nodeIdentifier', $nodeIdentifier)
109
            ;
110
        }
111
112
        $queryBuilder->groupBy('e.accountIdentifier');
113
        $queryBuilder->orderBy(null);
114
115
        $dql = str_replace('SELECT e', 'SELECT e.accountIdentifier', rtrim($queryBuilder->getDql(), ' ORDER BY '));
116
117
        $dqlQuery = $this->createDqlQuery($dql);
118
        $dqlQuery->setParameters($query->getParameters());
119
120
        return array_map(static function ($result) {
121
            return $result['accountIdentifier'];
122
        }, $dqlQuery->execute());
123
    }
124
125
    public function findUniqueDimensions(): array
126
    {
127
        $queryBuilder = $this->createQueryBuilder('event');
128
        $queryBuilder
129
            ->select('event.dimension')
130
            ->addSelect('event.dimensionsHash')
131
            ->where($queryBuilder->expr()->isNotNull('event.dimension'));
132
        $queryBuilder->groupBy('event.dimensionsHash');
133
        return $queryBuilder->getQuery()->getArrayResult();
134
    }
135
}
136