ReadModelRecreator::getEventClassesFromMethods()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 5
cts 5
cp 1
rs 9.6666
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 1
crap 2
1
<?php
2
/******************************************************************************
3
 * Copyright (c) 2016 Constantin Galbenu <[email protected]>             *
4
 ******************************************************************************/
5
6
namespace Gica\Cqrs\ReadModel;
7
8
9
use Gica\CodeAnalysis\MethodListenerDiscovery;
10
use Gica\CodeAnalysis\MethodListenerDiscovery\ListenerClassValidator\AnyPhpClassIsAccepted;
11
use Gica\CodeAnalysis\MethodListenerDiscovery\ListenerMethod;
12
use Gica\Cqrs\Command\CodeAnalysis\ReadModelEventHandlerDetector;
13
use Gica\Cqrs\Event\EventWithMetaData;
14
use Gica\Cqrs\EventStore;
15
use Gica\Cqrs\ProgressReporting\TaskProgressCalculator;
16
use Gica\Cqrs\ProgressReporting\TaskProgressReporter;
17
use Psr\Log\LoggerInterface;
18
19
class ReadModelRecreator
20
{
21
22
    /**
23
     * @var EventStore
24
     */
25
    private $eventStore;
26
    /**
27
     * @var LoggerInterface
28
     */
29
    private $logger;
30
    /**
31
     * @var \Gica\Cqrs\ProgressReporting\TaskProgressReporter|null
32
     */
33
    private $taskProgressReporter;
34
35 1
    public function __construct(
36
        EventStore $eventStore,
37
        LoggerInterface $logger
38
    )
39
    {
40 1
        $this->eventStore = $eventStore;
41 1
        $this->logger = $logger;
42 1
    }
43
44 1
    public function setTaskProgressReporter(?TaskProgressReporter $taskProgressReporter)
45
    {
46 1
        $this->taskProgressReporter = $taskProgressReporter;
47 1
    }
48
49 1
    public function recreateRead(ReadModelInterface $readModel)
50
    {
51 1
        $discoverer = new MethodListenerDiscovery(
52 1
            new ReadModelEventHandlerDetector(),
53 1
            new AnyPhpClassIsAccepted()
54
        );
55
56 1
        $allMethods = $discoverer->findListenerMethodsInClass(get_class($readModel));
57
58 1
        $eventClasses = $this->getEventClassesFromMethods($allMethods);
59
60 1
        $this->logger->info(print_r($eventClasses, true));
61 1
        $this->logger->info("loading events...");
62
63 1
        $allEvents = $this->eventStore->loadEventsByClassNames($eventClasses);
64
65 1
        $this->logger->info("applying events...");
66
67 1
        $taskProgress = null;
68
69 1
        if ($this->taskProgressReporter) {
70 1
            $taskProgress = new TaskProgressCalculator($allEvents->countCommits());
71
        }
72
73 1
        foreach ($allEvents->fetchCommits() as $eventsCommit) {
74
75 1
            $eventsCommit = $eventsCommit->filterEventsByClass($eventClasses);
76
77 1
            foreach ($eventsCommit->getEventsWithMetadata() as $eventWithMetadata) {
78
                /** @var EventWithMetaData $eventWithMetadata */
79 1
                $methods = $this->findMethodsByEventClass(get_class($eventWithMetadata->getEvent()), $allMethods);
80
81 1
                foreach ($methods as $method) {
82 1
                    call_user_func([$readModel, $method->getMethodName()], $eventWithMetadata->getEvent(), $eventWithMetadata->getMetaData());
83
                }
84
            }
85
86 1
            if ($this->taskProgressReporter) {
87 1
                $taskProgress->increment();
88 1
                $this->taskProgressReporter->reportProgressUpdate($taskProgress->getStep(), $taskProgress->getTotalSteps(), $taskProgress->calculateSpeed(), $taskProgress->calculateEta());
89
            }
90
        }
91 1
    }
92
93
    /**
94
     * @param ListenerMethod[] $methods
95
     * @return array
96
     */
97 1
    private function getEventClassesFromMethods($methods)
98
    {
99 1
        $eventClasses = [];
100 1
        foreach ($methods as $listenerMethod) {
101 1
            $eventClasses[] = $listenerMethod->getEventClassName();
102
        }
103
104 1
        return $eventClasses;
105
    }
106
107
    /**
108
     * @param string $eventClass
109
     * @param ListenerMethod[] $allMethods
110
     * @return ListenerMethod[]
111
     */
112 1
    private function findMethodsByEventClass(string $eventClass, $allMethods)
113
    {
114 1
        $result = [];
115
116 1
        foreach ($allMethods as $listenerMethod) {
117 1
            if ($listenerMethod->getEventClassName() == $eventClass) {
118 1
                $result[] = $listenerMethod;
119
            }
120
        }
121
122 1
        return $result;
123
    }
124
}