Skip to content

Commit be1f1fe

Browse files
committed
TASK: Introduce nodes AND affected DSP on WorkspaceWasPartiallyDiscarded to allow for future extension to only discard changes in a specific dimension
Also by calculating the `NodeIdsToPublishOrDiscard` by the _actual_ events we can know for sure there is no gibberish in the event. Previously for example discarding a non-existing node or a node in a not valid DSP would just save that directly into the event, which is not correct as that did not happen like that. It was merely a bad intention.
1 parent 529037d commit be1f1fe

File tree

5 files changed

+55
-50
lines changed

5 files changed

+55
-50
lines changed

Neos.ContentRepository.Core/Classes/Feature/WorkspaceCommandHandler.php

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@
1919
use Neos\ContentRepository\Core\CommandHandler\CommandInterface;
2020
use Neos\ContentRepository\Core\CommandHandler\CommandSimulatorFactory;
2121
use Neos\ContentRepository\Core\ContentRepository;
22+
use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePointSet;
2223
use Neos\ContentRepository\Core\EventStore\DecoratedEvent;
2324
use Neos\ContentRepository\Core\EventStore\EventNormalizer;
2425
use Neos\ContentRepository\Core\EventStore\Events;
2526
use Neos\ContentRepository\Core\EventStore\EventsToPublish;
27+
use Neos\ContentRepository\Core\Feature\Common\EmbedsAffectedDimensionSpacePoints;
28+
use Neos\ContentRepository\Core\Feature\Common\EmbedsNodeAggregateId;
2629
use Neos\ContentRepository\Core\Feature\Common\PublishableToWorkspaceInterface;
2730
use Neos\ContentRepository\Core\Feature\Common\RebasableToOtherWorkspaceInterface;
2831
use Neos\ContentRepository\Core\Feature\ContentStreamClosing\Event\ContentStreamWasClosed;
@@ -46,6 +49,8 @@
4649
use Neos\ContentRepository\Core\Feature\WorkspacePublication\Command\DiscardWorkspace;
4750
use Neos\ContentRepository\Core\Feature\WorkspacePublication\Command\PublishIndividualNodesFromWorkspace;
4851
use Neos\ContentRepository\Core\Feature\WorkspacePublication\Command\PublishWorkspace;
52+
use Neos\ContentRepository\Core\Feature\WorkspacePublication\Dto\NodeIdsToPublishOrDiscard;
53+
use Neos\ContentRepository\Core\Feature\WorkspacePublication\Dto\NodeIdToPublishOrDiscard;
4954
use Neos\ContentRepository\Core\Feature\WorkspacePublication\Event\WorkspaceWasDiscarded;
5055
use Neos\ContentRepository\Core\Feature\WorkspacePublication\Event\WorkspaceWasPartiallyDiscarded;
5156
use Neos\ContentRepository\Core\Feature\WorkspacePublication\Event\WorkspaceWasPartiallyPublished;
@@ -59,6 +64,7 @@
5964
use Neos\ContentRepository\Core\SharedModel\Exception\ContentStreamIsClosed;
6065
use Neos\ContentRepository\Core\SharedModel\Exception\WorkspaceDoesNotExist;
6166
use Neos\ContentRepository\Core\SharedModel\Exception\WorkspaceHasNoBaseWorkspaceName;
67+
use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId;
6268
use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId;
6369
use Neos\ContentRepository\Core\SharedModel\Workspace\Workspace;
6470
use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName;
@@ -599,6 +605,8 @@ private function handleDiscardIndividualNodesFromWorkspace(
599605
return;
600606
}
601607

608+
$nodesToDiscard = $this->extractNodeAggregateIdsAndAffectedDimensionSpacePoints($commandsToDiscard);
609+
602610
yield $this->closeContentStream(
603611
$workspace->currentContentStreamId,
604612
$workspaceContentStreamVersion
@@ -644,7 +652,7 @@ static function ($handle) use ($commandsToKeep): void {
644652
$command->workspaceName,
645653
$command->newContentStreamId,
646654
$workspace->currentContentStreamId,
647-
$command->nodesToDiscard,
655+
$nodesToDiscard,
648656
)
649657
),
650658
ExpectedVersion::ANY()
@@ -659,6 +667,41 @@ static function ($handle) use ($commandsToKeep): void {
659667
yield $this->removeContentStreamWithoutConstraintChecks($workspace->currentContentStreamId);
660668
}
661669

670+
private function extractNodeAggregateIdsAndAffectedDimensionSpacePoints(RebaseableCommands $commands): NodeIdsToPublishOrDiscard
671+
{
672+
/** @var array<string,DimensionSpacePointSet> $affectedDimensionSpacePointsByNodeAggregateId */
673+
$affectedDimensionSpacePointsByNodeAggregateId = [];
674+
foreach ($commands as $command) {
675+
$event = $this->eventNormalizer->denormalize($command->originalEvent);
676+
assert($event instanceof EmbedsNodeAggregateId);
677+
if (!$event instanceof EmbedsAffectedDimensionSpacePoints) {
678+
// todo fix change node type and rename case!!! either event must contain all dsp or we need to use the variation graph here?
679+
// -> all dimension would be forward compatible if we ever allow node type change for one dsp ...
680+
continue;
681+
}
682+
$affectedDimensionSpacePoints = $affectedDimensionSpacePointsByNodeAggregateId[$event->getNodeAggregateId()->value] ?? null;
683+
684+
$affectedDimensionSpacePointsByNodeAggregateId[$event->getNodeAggregateId()->value] =
685+
$affectedDimensionSpacePoints !== null
686+
? $affectedDimensionSpacePoints->getUnion($event->getAffectedDimensionSpacePoints())
687+
: $event->getAffectedDimensionSpacePoints();
688+
689+
}
690+
691+
$nodeAggregateIdsWithDimension = [];
692+
foreach ($affectedDimensionSpacePointsByNodeAggregateId as $nodeId => $affectedDimensionSpacePoints) {
693+
foreach ($affectedDimensionSpacePoints as $dimensionSpacePoint) {
694+
$nodeAggregateIdsWithDimension[] = new NodeIdToPublishOrDiscard(
695+
NodeAggregateId::fromString($nodeId),
696+
$dimensionSpacePoint
697+
);
698+
}
699+
}
700+
701+
// todo optimise format like: [{NodeAggregateId -> DimensionSpacePointSet}] and rename collection to NodeAggregateIdsWithDimensionSpacePoints (less clumsy) ... in the event this happened already ... no TO ...!
702+
return NodeIdsToPublishOrDiscard::create(...$nodeAggregateIdsWithDimension);
703+
}
704+
662705
/**
663706
* @throws BaseWorkspaceDoesNotExist
664707
* @throws WorkspaceDoesNotExist

Neos.ContentRepository.Core/Classes/Feature/WorkspacePublication/Event/WorkspaceWasPartiallyDiscarded.php

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
use Neos\ContentRepository\Core\EventStore\EventInterface;
1818
use Neos\ContentRepository\Core\Feature\Common\EmbedsWorkspaceName;
19-
use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateIds;
19+
use Neos\ContentRepository\Core\Feature\WorkspacePublication\Dto\NodeIdsToPublishOrDiscard;
2020
use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId;
2121
use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName;
2222

@@ -35,7 +35,7 @@ public function __construct(
3535
* The old content stream, which contains ALL the data (discarded and non-discarded)
3636
*/
3737
public ContentStreamId $previousContentStreamId,
38-
public NodeAggregateIds $discardedNodes,
38+
public NodeIdsToPublishOrDiscard $discardedNodes,
3939
) {
4040
}
4141

@@ -46,21 +46,11 @@ public function getWorkspaceName(): WorkspaceName
4646

4747
public static function fromArray(array $values): self
4848
{
49-
$discardedNodes = [];
50-
foreach ($values['discardedNodes'] as $discardedNode) {
51-
if (is_array($discardedNode)) {
52-
// legacy case:
53-
$discardedNodes[] = $discardedNode['nodeAggregateId'];
54-
continue;
55-
}
56-
$discardedNodes[] = $discardedNode;
57-
}
58-
5949
return new self(
6050
WorkspaceName::fromString($values['workspaceName']),
6151
ContentStreamId::fromString($values['newContentStreamId']),
6252
ContentStreamId::fromString($values['previousContentStreamId']),
63-
NodeAggregateIds::fromArray($discardedNodes),
53+
NodeIdsToPublishOrDiscard::fromArray($values['discardedNodes']),
6454
);
6555
}
6656

Neos.Neos/Classes/AssetUsage/CatchUpHook/AssetUsageCatchUpHook.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePoint;
88
use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePointSet;
99
use Neos\ContentRepository\Core\EventStore\EventInterface;
10-
use Neos\ContentRepository\Core\Feature\Common\EmbedsContentStreamId;
1110
use Neos\ContentRepository\Core\Feature\Common\EmbedsWorkspaceName;
1211
use Neos\ContentRepository\Core\Feature\DimensionSpaceAdjustment\Event\DimensionSpacePointWasMoved;
1312
use Neos\ContentRepository\Core\Feature\NodeCreation\Event\NodeAggregateWithNodeWasCreated;
@@ -27,7 +26,6 @@
2726
use Neos\ContentRepository\Core\SharedModel\ContentRepository\ContentRepositoryId;
2827
use Neos\ContentRepository\Core\SharedModel\Exception\WorkspaceDoesNotExist;
2928
use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId;
30-
use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateIds;
3129
use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName;
3230
use Neos\EventStore\Model\EventEnvelope;
3331
use Neos\Neos\AssetUsage\Service\AssetUsageIndexingService;
@@ -146,13 +144,18 @@ private function discardWorkspace(WorkspaceName $workspaceName): void
146144
$this->assetUsageIndexingService->removeIndexForWorkspace($this->contentRepositoryId, $workspaceName);
147145
}
148146

149-
private function discardNodes(WorkspaceName $workspaceName, NodeAggregateIds $nodeIds): void
147+
private function discardNodes(WorkspaceName $workspaceName, NodeIdsToPublishOrDiscard $nodeIds): void
150148
{
151149
foreach ($nodeIds as $nodeId) {
152-
$this->assetUsageIndexingService->removeAssetUsagesOfWorkspaceWithAllPropertiesInAllDimensions(
150+
if (!$nodeId->dimensionSpacePoint) {
151+
// NodeAggregateTypeWasChanged and NodeAggregateNameWasChanged don't impact asset usage
152+
continue;
153+
}
154+
$this->assetUsageIndexingService->removeIndexForWorkspaceNameNodeAggregateIdAndDimensionSpacePoint(
153155
$this->contentRepositoryId,
154156
$workspaceName,
155-
$nodeId,
157+
$nodeId->nodeAggregateId,
158+
$nodeId->dimensionSpacePoint
156159
);
157160
}
158161
}

Neos.Neos/Classes/AssetUsage/Domain/AssetUsageRepository.php

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -204,25 +204,6 @@ public function removeAssetUsagesOfWorkspaceWithAllProperties(
204204
]);
205205
}
206206

207-
public function removeAssetUsagesOfWorkspaceWithAllPropertiesInAllDimensions(
208-
ContentRepositoryId $contentRepositoryId,
209-
WorkspaceName $workspaceName,
210-
NodeAggregateId $nodeAggregateId,
211-
): void {
212-
$sql = <<<SQL
213-
DELETE FROM {$this->getTableName()}
214-
WHERE contentrepositoryid = :contentRepositoryId
215-
AND workspacename = :workspaceName
216-
AND nodeAggregateId = :nodeAggregateId
217-
SQL;
218-
219-
$this->dbal->executeStatement($sql, [
220-
'contentRepositoryId' => $contentRepositoryId->value,
221-
'workspaceName' => $workspaceName->value,
222-
'nodeAggregateId' => $nodeAggregateId->value
223-
]);
224-
}
225-
226207
/**
227208
* @param WorkspaceName[] $workspaceNames
228209
*/

Neos.Neos/Classes/AssetUsage/Service/AssetUsageIndexingService.php

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -171,18 +171,6 @@ public function removeIndexForWorkspaceNameNodeAggregateIdAndDimensionSpacePoint
171171
);
172172
}
173173

174-
public function removeAssetUsagesOfWorkspaceWithAllPropertiesInAllDimensions(
175-
ContentRepositoryId $contentRepositoryId,
176-
WorkspaceName $workspaceName,
177-
NodeAggregateId $nodeAggregateId
178-
): void {
179-
$this->assetUsageRepository->removeAssetUsagesOfWorkspaceWithAllPropertiesInAllDimensions(
180-
$contentRepositoryId,
181-
$workspaceName,
182-
$nodeAggregateId
183-
);
184-
}
185-
186174
public function removeIndexForWorkspace(
187175
ContentRepositoryId $contentRepositoryId,
188176
WorkspaceName $workspaceName

0 commit comments

Comments
 (0)