DefaultPipeline::process()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 22
rs 9.568
c 0
b 0
f 0
cc 3
nc 3
nop 0
1
<?php
2
3
namespace Extraload\Pipeline;
4
5
use Extraload\Extractor\ExtractorInterface;
6
use Extraload\Transformer\TransformerInterface;
7
use Extraload\Loader\LoaderInterface;
8
use Extraload\Events;
9
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
10
use Symfony\Component\EventDispatcher\GenericEvent;
11
12
class DefaultPipeline implements PipelineInterface
13
{
14
    private $extractor;
15
    private $transformer;
16
    private $loader;
17
    private $eventDispatcher;
18
19
    public function __construct(
20
        ExtractorInterface $extractor,
21
        TransformerInterface $transformer,
22
        LoaderInterface $loader,
23
        EventDispatcherInterface $eventDispatcher = null
24
    ) {
25
        $this->extractor = $extractor;
26
        $this->transformer = $transformer;
27
        $this->loader = $loader;
28
        $this->eventDispatcher = $eventDispatcher;
29
    }
30
31
    public function process()
32
    {
33
        $this->dispatch(Events::PRE_PROCESS);
34
35
        while (null !== $extracted = $this->extractor->extract()) {
36
            $this->dispatch(Events::EXTRACT, $extracted);
37
38
            $transformed = $this->transformer->transform($extracted);
39
            $this->dispatch(Events::TRANSFORM, $transformed);
40
41
            if (null === $transformed) {
42
                continue;
43
            }
44
45
            $this->loader->load($transformed);
46
            $this->dispatch(Events::LOAD, $transformed);
47
        }
48
49
        $this->loader->flush();
50
51
        $this->dispatch(Events::POST_PROCESS);
52
    }
53
54
    private function dispatch($name, $subject = null)
55
    {
56
        if (null === $this->eventDispatcher) {
57
            return;
58
        }
59
60
        $this->eventDispatcher->dispatch($name, new GenericEvent($subject));
61
    }
62
}
63