Completed
Push — master ( 34b479...d7130a )
by Luc
15s
created

Projector::updateLabelRelationFromCdbItem()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 34
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 34
rs 8.8571
cc 2
eloc 20
nc 2
nop 2
1
<?php
2
3
namespace CultuurNet\UDB3\Label\ReadModels\Relations;
4
5
use Broadway\Domain\Metadata;
6
use CultuurNet\UDB3\Cdb\ActorItemFactory;
7
use CultuurNet\UDB3\Cdb\EventItemFactory;
8
use CultuurNet\UDB3\Event\Events\EventImportedFromUDB2;
9
use CultuurNet\UDB3\Event\Events\EventUpdatedFromUDB2;
10
use CultuurNet\UDB3\Label\LabelEventRelationTypeResolverInterface;
11
use CultuurNet\UDB3\Label\ReadModels\AbstractProjector;
12
use CultuurNet\UDB3\Label\ReadModels\Relations\Repository\LabelRelation;
13
use CultuurNet\UDB3\Label\ReadModels\Relations\Repository\ReadRepositoryInterface;
14
use CultuurNet\UDB3\Label\ReadModels\Relations\Repository\WriteRepositoryInterface;
15
use CultuurNet\UDB3\Label\ValueObjects\LabelName;
16
use CultuurNet\UDB3\Label\ValueObjects\RelationType;
17
use CultuurNet\UDB3\LabelCollection;
18
use CultuurNet\UDB3\LabelEventInterface;
19
use CultuurNet\UDB3\Organizer\Events\OrganizerImportedFromUDB2;
20
use CultuurNet\UDB3\Organizer\Events\OrganizerUpdatedFromUDB2;
21
use CultuurNet\UDB3\Place\Events\PlaceImportedFromUDB2;
22
use CultuurNet\UDB3\Place\Events\PlaceUpdatedFromUDB2;
23
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
24
use ValueObjects\StringLiteral\StringLiteral;
25
26
class Projector extends AbstractProjector
27
{
28
    /**
29
     * @var WriteRepositoryInterface
30
     */
31
    private $writeRepository;
32
    
33
    /**
34
     * @var ReadRepositoryInterface
35
     */
36
    private $readRepository;
37
38
    /**
39
     * @var LabelEventRelationTypeResolverInterface
40
     */
41
    private $offerTypeResolver;
42
43
    /**
44
     * Projector constructor.
45
     * @param WriteRepositoryInterface $writeRepository
46
     * @param ReadRepositoryInterface $readRepository
47
     * @param LabelEventRelationTypeResolverInterface $labelEventOfferTypeResolver
48
     */
49
    public function __construct(
50
        WriteRepositoryInterface $writeRepository,
51
        ReadRepositoryInterface $readRepository,
52
        LabelEventRelationTypeResolverInterface $labelEventOfferTypeResolver
53
    ) {
54
        $this->writeRepository = $writeRepository;
55
        $this->readRepository = $readRepository;
56
        $this->offerTypeResolver = $labelEventOfferTypeResolver;
57
58
    }
59
60
    /**
61
     * @inheritdoc
62
     */
63 View Code Duplication
    public function applyLabelAdded(LabelEventInterface $labelAdded, Metadata $metadata)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
64
    {
65
        $LabelRelation = $this->createLabelRelation($labelAdded);
66
67
        try {
68
            if (!is_null($LabelRelation)) {
69
                $this->writeRepository->save(
70
                    $LabelRelation->getLabelName(),
71
                    $LabelRelation->getRelationType(),
72
                    $LabelRelation->getRelationId(),
73
                    false
74
                );
75
            }
76
        } catch (UniqueConstraintViolationException $exception) {
77
            // By design to catch unique exception.
78
        }
79
    }
80
81
    /**
82
     * @inheritdoc
83
     */
84 View Code Duplication
    public function applyLabelRemoved(LabelEventInterface $labelRemoved, Metadata $metadata)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
85
    {
86
        $labelRelation = $this->createLabelRelation($labelRemoved);
87
88
        if (!is_null($labelRelation)) {
89
            $this->writeRepository->deleteByLabelNameAndRelationId(
90
                $labelRelation->getLabelName(),
91
                $labelRelation->getRelationId()
92
            );
93
        }
94
    }
95
96
    /**
97
     * @param EventImportedFromUDB2 $eventImportedFromUDB2
98
     */
99
    public function applyEventImportedFromUDB2(
100
        EventImportedFromUDB2 $eventImportedFromUDB2
101
    ) {
102
        $event = EventItemFactory::createEventFromCdbXml(
103
            $eventImportedFromUDB2->getCdbXmlNamespaceUri(),
104
            $eventImportedFromUDB2->getCdbXml()
105
        );
106
107
        $this->updateLabelRelationFromCdbItem($event, RelationType::EVENT());
108
    }
109
110
    /**
111
     * @param PlaceImportedFromUDB2 $placeImportedFromUDB2
112
     */
113
    public function applyPlaceImportedFromUDB2(
114
        PlaceImportedFromUDB2 $placeImportedFromUDB2
115
    ) {
116
        $place = ActorItemFactory::createActorFromCdbXml(
117
            $placeImportedFromUDB2->getCdbXmlNamespaceUri(),
118
            $placeImportedFromUDB2->getCdbXml()
119
        );
120
121
        $this->updateLabelRelationFromCdbItem($place, RelationType::PLACE());
122
    }
123
124
    /**
125
     * @param OrganizerImportedFromUDB2 $organizerImportedFromUDB2
126
     */
127
    public function applyOrganizerImportedFromUDB2(
128
        OrganizerImportedFromUDB2 $organizerImportedFromUDB2
129
    ) {
130
        $organizer = ActorItemFactory::createActorFromCdbXml(
131
            $organizerImportedFromUDB2->getCdbXmlNamespaceUri(),
132
            $organizerImportedFromUDB2->getCdbXml()
133
        );
134
135
        $this->updateLabelRelationFromCdbItem($organizer, RelationType::ORGANIZER());
136
    }
137
138
    /**
139
     * @param EventUpdatedFromUDB2 $eventUpdatedFromUDB2
140
     */
141
    public function applyEventUpdatedFromUDB2(
142
        EventUpdatedFromUDB2 $eventUpdatedFromUDB2
143
    ) {
144
        $event = EventItemFactory::createEventFromCdbXml(
145
            $eventUpdatedFromUDB2->getCdbXmlNamespaceUri(),
146
            $eventUpdatedFromUDB2->getCdbXml()
147
        );
148
149
        $this->updateLabelRelationFromCdbItem($event, RelationType::EVENT());
150
    }
151
152
    /**
153
     * @param PlaceUpdatedFromUDB2 $placeUpdatedFromUDB2
154
     */
155
    public function applyPlaceUpdatedFromUDB2(
156
        PlaceUpdatedFromUDB2 $placeUpdatedFromUDB2
157
    ) {
158
        $place = ActorItemFactory::createActorFromCdbXml(
159
            $placeUpdatedFromUDB2->getCdbXmlNamespaceUri(),
160
            $placeUpdatedFromUDB2->getCdbXml()
161
        );
162
163
        $this->updateLabelRelationFromCdbItem($place, RelationType::PLACE());
164
    }
165
166
    /**
167
     * @param OrganizerUpdatedFromUDB2 $organizerUpdatedFromUDB2
168
     */
169
    public function applyOrganizerUpdatedFromUDB2(
170
        OrganizerUpdatedFromUDB2 $organizerUpdatedFromUDB2
171
    ) {
172
        $organizer = ActorItemFactory::createActorFromCdbXml(
173
            $organizerUpdatedFromUDB2->getCdbXmlNamespaceUri(),
174
            $organizerUpdatedFromUDB2->getCdbXml()
175
        );
176
177
        $this->updateLabelRelationFromCdbItem($organizer, RelationType::ORGANIZER());
178
    }
179
180
    /**
181
     * @param \CultureFeed_Cdb_Item_Base $cdbItem
182
     * @param RelationType $relationType
183
     */
184
    private function updateLabelRelationFromCdbItem(
185
        \CultureFeed_Cdb_Item_Base $cdbItem,
186
        RelationType $relationType
187
    ) {
188
        $relationId = new StringLiteral($cdbItem->getCdbId());
189
190
        // Never delete the UDB3 labels on an update.
191
        $this->writeRepository->deleteImportedByRelationId($relationId);
192
193
        $keywords = $cdbItem->getKeywords();
194
        $labelCollection = LabelCollection::fromStrings($keywords);
195
196
        // Calculate the UDB2 imported labels.
197
        $udb3Labels = array_map(
198
            function (LabelRelation $labelRelation) {
199
                return $labelRelation->getLabelName()->toNative();
200
            },
201
            $this->readRepository->getLabelRelationsForItem($relationId)
202
        );
203
        $udb2Labels = array_diff(
204
            $labelCollection->asArray(),
205
            $udb3Labels
206
        );
207
208
        // Only save the UDB2 labels, because the UDB3 labels are still present.
209
        foreach ($udb2Labels as $label) {
210
            $this->writeRepository->save(
211
                new LabelName((string) $label),
212
                $relationType,
213
                $relationId,
214
                true
215
            );
216
        }
217
    }
218
219
    /**
220
     * @param LabelEventInterface $labelEvent
221
     * @return LabelRelation
222
     */
223
    private function createLabelRelation(LabelEventInterface $labelEvent)
224
    {
225
        $labelRelation = null;
0 ignored issues
show
Unused Code introduced by
$labelRelation is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
226
227
        $labelName = new LabelName((string) $labelEvent->getLabel());
228
        $relationType = $this->offerTypeResolver->getRelationType($labelEvent);
229
        $relationId = new StringLiteral($labelEvent->getItemId());
230
231
        $labelRelation = new LabelRelation(
232
            $labelName,
233
            $relationType,
234
            $relationId,
235
            false
236
        );
237
238
        return $labelRelation;
239
    }
240
}
241