Completed
Push — master ( f25bff...50ace1 )
by Dominik
03:54 queued 01:40
created

Importer::import()   B

Complexity

Conditions 3
Paths 4

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 8
Bugs 0 Features 4
Metric Value
c 8
b 0
f 4
dl 0
loc 24
rs 8.9713
cc 3
eloc 14
nc 4
nop 2
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
        if (null === $progress) {
48
            $progress = new NullProgress();
49
        }
50
51
        $importDate = new \DateTime();
52
53
        $this->logger->info('Import started at {importDate}', ['importDate' => $importDate]);
54
55
        $offset = 0;
56
57
        while ([] !== $readerModels = $this->reader->getReaderModels($offset, $limit)) {
58
            $this->logger->info('Read, offset: {offset}, limit: {limit}', ['offset' => $offset, 'limit' => $limit]);
59
            $this->importModels($readerModels, $importDate, $progress);
60
            $this->reader->clearReaderModels();
61
            $offset += $limit;
62
        }
63
64
        $this->writer->removeWriterModels($importDate);
65
        $this->logger->info('Removed all outdates');
66
67
        return $importDate;
68
    }
69
70
    /**
71
     * @param ReaderModelInterface[]|array $readerModels
72
     * @param \DateTime                    $importDate
73
     * @param ProgressInterface            $progress
74
     */
75
    protected function importModels(array $readerModels, \DateTime $importDate, ProgressInterface $progress)
76
    {
77
        $writerModels = [];
78
        foreach ($readerModels as $readerModel) {
79
            try {
80
                $writerModels[] = $this->importModel($readerModel, $importDate);
81
            } catch (NotImportableException $e) {
82
                $this->logger->warning(
83
                    $e->getMessage(),
84
                    ['identifier' => $readerModel->getImportIdentifier()]
85
                );
86
            }
87
            $progress->advance();
88
        }
89
90
        $this->writer->flushWriterModels($writerModels);
91
        $this->writer->clearWriterModels();
92
93
        $this->logger->info('Flushed models');
94
    }
95
96
    /**
97
     * @param ReaderModelInterface $readerModel
98
     * @param \DateTime            $importDate
99
     *
100
     * @return WriterModelInterface
101
     */
102
    protected function importModel(ReaderModelInterface $readerModel, \DateTime $importDate)
103
    {
104
        $writerModel = $this->writer->findWriterModel($readerModel);
105
        if (null === $writerModel) {
106
            $writerModel = $this->writer->createWriterModel($readerModel);
107
            $this->modelInfo($readerModel, 'created');
108
        } else {
109
            $this->writer->updateWriterModel($writerModel, $readerModel);
110
            $this->modelInfo($readerModel, 'updated');
111
        }
112
113
        $writerModel->setImportIdentifier($readerModel->getImportIdentifier());
114
        $writerModel->setLastImportDate($importDate);
115
116
        $this->writer->persistWriterModel($writerModel);
117
118
        $this->modelInfo($readerModel, 'persisted');
119
120
        return $writerModel;
121
    }
122
123
    /**
124
     * @param ReaderModelInterface $readerModel
125
     * @param string               $action
126
     */
127
    protected function modelInfo(ReaderModelInterface $readerModel, $action)
128
    {
129
        $this->logger->info(
130
            ucfirst($action).' model with identifier {identifier}',
131
            ['identifier' => $readerModel->getImportIdentifier()]
132
        );
133
    }
134
}
135