Completed
Push — master ( 50ace1...cd6401 )
by Dominik
02:37
created

Importer::getProgress()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 8
rs 9.4285
cc 2
eloc 4
nc 2
nop 1
1
<?php
2
3
namespace Saxulum\ModelImporter;
4
5
use Psr\Log\LoggerInterface;
6
use Psr\Log\NullLogger;
7
use Saxulum\ModelImporter\Progress\NullProgress;
8
use Saxulum\ModelImporter\Progress\ProgressInterface;
9
10
class Importer
11
{
12
    /**
13
     * @var ReaderInterface
14
     */
15
    protected $reader;
16
17
    /**
18
     * @var WriterInterface
19
     */
20
    protected $writer;
21
22
    /**
23
     * @var LoggerInterface
24
     */
25
    protected $logger;
26
27
    /**
28
     * @param ReaderInterface $reader
29
     * @param WriterInterface $writer
30
     * @param LoggerInterface $logger
31
     */
32
    public function __construct(ReaderInterface $reader, WriterInterface $writer, LoggerInterface $logger = null)
33
    {
34
        $this->reader = $reader;
35
        $this->writer = $writer;
36
        $this->logger = null !== $logger ? $logger : new NullLogger();
37
    }
38
39
    /**
40
     * @param int                    $limit
41
     * @param ProgressInterface|null $progress
42
     *
43
     * @return \DateTime
44
     */
45
    public function import($limit = 100, ProgressInterface $progress = null)
46
    {
47
        $importDate = new \DateTime();
48
49
        $this->logger->info('Import started at {importDate}', ['importDate' => $importDate]);
50
51
        $progress = $this->getProgress($progress);
52
53
        $offset = 0;
54
        while ([] !== $readerModels = $this->reader->getReaderModels($offset, $limit)) {
55
            $this->logger->info('Read, offset: {offset}, limit: {limit}', ['offset' => $offset, 'limit' => $limit]);
56
            $this->importModels($readerModels, $importDate, $progress);
57
            $this->reader->clearReaderModels();
58
            $offset += $limit;
59
        }
60
61
        $this->writer->removeWriterModels($importDate);
62
        $this->logger->info('Removed all outdates');
63
64
        return $importDate;
65
    }
66
67
    /**
68
     * @param ProgressInterface|null $progress
69
     *
70
     * @return ProgressInterface
71
     */
72
    protected function getProgress(ProgressInterface $progress = null)
73
    {
74
        if (null === $progress) {
75
            $progress = new NullProgress();
76
        }
77
78
        return $progress;
79
    }
80
81
    /**
82
     * @param ReaderModelInterface[]|array $readerModels
83
     * @param \DateTime                    $importDate
84
     * @param ProgressInterface            $progress
85
     */
86
    protected function importModels(array $readerModels, \DateTime $importDate, ProgressInterface $progress)
87
    {
88
        $writerModels = [];
89
        foreach ($readerModels as $readerModel) {
90
            try {
91
                $writerModels[] = $this->importModel($readerModel, $importDate);
92
            } catch (NotImportableException $e) {
93
                $this->logger->warning(
94
                    $e->getMessage(),
95
                    ['identifier' => $readerModel->getImportIdentifier()]
96
                );
97
            }
98
            $progress->advance();
99
        }
100
101
        $this->writer->flushWriterModels($writerModels);
102
        $this->writer->clearWriterModels();
103
104
        $this->logger->info('Flushed models');
105
    }
106
107
    /**
108
     * @param ReaderModelInterface $readerModel
109
     * @param \DateTime            $importDate
110
     *
111
     * @return WriterModelInterface
112
     */
113
    protected function importModel(ReaderModelInterface $readerModel, \DateTime $importDate)
114
    {
115
        $writerModel = $this->writer->findWriterModel($readerModel);
116
        if (null === $writerModel) {
117
            $writerModel = $this->writer->createWriterModel($readerModel);
118
            $this->modelInfo($readerModel, 'created');
119
        } else {
120
            $this->writer->updateWriterModel($writerModel, $readerModel);
121
            $this->modelInfo($readerModel, 'updated');
122
        }
123
124
        $writerModel->setImportIdentifier($readerModel->getImportIdentifier());
125
        $writerModel->setLastImportDate($importDate);
126
127
        $this->writer->persistWriterModel($writerModel);
128
129
        $this->modelInfo($readerModel, 'persisted');
130
131
        return $writerModel;
132
    }
133
134
    /**
135
     * @param ReaderModelInterface $readerModel
136
     * @param string               $action
137
     */
138
    protected function modelInfo(ReaderModelInterface $readerModel, $action)
139
    {
140
        $this->logger->info(
141
            ucfirst($action).' model with identifier {identifier}',
142
            ['identifier' => $readerModel->getImportIdentifier()]
143
        );
144
    }
145
}
146