Skip to content

Commit

Permalink
TASK Document NodeAggregate and introduce `getSingleNodeIndependentOf…
Browse files Browse the repository at this point in the history
…ItsDimension`
  • Loading branch information
mhsdesign committed Jan 14, 2024
1 parent bdbca39 commit f4af1cb
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ public function mapNodeRowsToNodeAggregate(
$rawNodeName = '';
$rawNodeAggregateClassification = '';
$occupiedDimensionSpacePoints = [];
$nodesByOccupiedDimensionSpacePoints = [];
$nodesByOccupiedDimensionSpacePoint = [];
$coveredDimensionSpacePoints = [];
$nodesByCoveredDimensionSpacePoints = [];
$coverageByOccupants = [];
Expand All @@ -164,9 +164,9 @@ public function mapNodeRowsToNodeAggregate(
$occupiedDimensionSpacePoint = OriginDimensionSpacePoint::fromJsonString(
$nodeRow['origindimensionspacepoint']
);
if (!isset($nodesByOccupiedDimensionSpacePoints[$occupiedDimensionSpacePoint->hash])) {
if (!isset($nodesByOccupiedDimensionSpacePoint[$occupiedDimensionSpacePoint->hash])) {
// ... so we handle occupation exactly once ...
$nodesByOccupiedDimensionSpacePoints[$occupiedDimensionSpacePoint->hash] = $this->mapNodeRowToNode(
$nodesByOccupiedDimensionSpacePoint[$occupiedDimensionSpacePoint->hash] = $this->mapNodeRowToNode(
$nodeRow,
$occupiedDimensionSpacePoint->toDimensionSpacePoint(),
$visibilityConstraints
Expand All @@ -187,7 +187,7 @@ public function mapNodeRowsToNodeAggregate(
= $coveredDimensionSpacePoint;
$occupationByCovering[$coveredDimensionSpacePoint->hash] = $occupiedDimensionSpacePoint;
$nodesByCoveredDimensionSpacePoints[$coveredDimensionSpacePoint->hash]
= $nodesByOccupiedDimensionSpacePoints[$occupiedDimensionSpacePoint->hash];
= $nodesByOccupiedDimensionSpacePoint[$occupiedDimensionSpacePoint->hash];
// ... as we do for disabling
if (isset($nodeRow['disableddimensionspacepointhash'])) {
$disabledDimensionSpacePoints[$coveredDimensionSpacePoint->hash] = $coveredDimensionSpacePoint;
Expand All @@ -197,8 +197,9 @@ public function mapNodeRowsToNodeAggregate(
ksort($coveredDimensionSpacePoints);
ksort($disabledDimensionSpacePoints);

/** @var Node $primaryNode a nodeAggregate only exists if it at least contains one node. */
$primaryNode = current($nodesByOccupiedDimensionSpacePoints);
// a nodeAggregate only exists if it at least contains one node
assert($nodesByOccupiedDimensionSpacePoint !== []);
$primaryNode = current($nodesByOccupiedDimensionSpacePoint);

return new NodeAggregate(
$primaryNode->subgraphIdentity->contentStreamId,
Expand All @@ -207,7 +208,7 @@ public function mapNodeRowsToNodeAggregate(
NodeTypeName::fromString($rawNodeTypeName),
$rawNodeName ? NodeName::fromString($rawNodeName) : null,
new OriginDimensionSpacePointSet($occupiedDimensionSpacePoints),
$nodesByOccupiedDimensionSpacePoints,
$nodesByOccupiedDimensionSpacePoint,
CoverageByOrigin::fromArray($coverageByOccupants),
new DimensionSpacePointSet($coveredDimensionSpacePoints),
$nodesByCoveredDimensionSpacePoints,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,12 +133,7 @@ protected function createEventsForMissingTetheredNode(
);
}

$childNodeSource = null;
foreach ($childNodeAggregate->getNodes() as $node) {
$childNodeSource = $node;
break;
}
/** @var Node $childNodeSource Node aggregates are never empty */
$childNodeSource = $childNodeAggregate->getSingleNodeIndependentOfItsDimension();
return $this->createEventsForVariations(
$parentNodeAggregate->contentStreamId,
$childNodeSource->originDimensionSpacePoint,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,26 +50,37 @@
*/
final class NodeAggregate
{
/**
* @param ContentStreamId $contentStreamId
* @param NodeAggregateId $nodeAggregateId
* @param NodeAggregateClassification $classification
* @param NodeTypeName $nodeTypeName
* @param NodeName|null $nodeName
* @param OriginDimensionSpacePointSet $occupiedDimensionSpacePoints
* @param non-empty-array<string,Node> $nodesByOccupiedDimensionSpacePoint At least one node will be occupied.
* @param CoverageByOrigin $coverageByOccupant
* @param DimensionSpacePointSet $coveredDimensionSpacePoints At least one node will be covered.
* @param non-empty-array<string,Node> $nodesByCoveredDimensionSpacePoint
* @param OriginByCoverage $occupationByCovered
* @param DimensionSpacePointSet $disabledDimensionSpacePoints The dimension space point set this node aggregate disables. This is *not* necessarily the set it is disabled in, since that is determined by its ancestors
*/
public function __construct(
public readonly ContentStreamId $contentStreamId,
public readonly NodeAggregateId $nodeAggregateId,
public readonly NodeAggregateClassification $classification,
public readonly NodeTypeName $nodeTypeName,
public readonly ?NodeName $nodeName,
public readonly OriginDimensionSpacePointSet $occupiedDimensionSpacePoints,
/** @var array<string,Node> */
private readonly array $nodesByOccupiedDimensionSpacePoint,
private readonly CoverageByOrigin $coverageByOccupant,
public readonly DimensionSpacePointSet $coveredDimensionSpacePoints,
/** @var array<string,Node> */
private readonly array $nodesByCoveredDimensionSpacePoint,
private readonly OriginByCoverage $occupationByCovered,
/**
* The dimension space point set this node aggregate disables.
* This is *not* necessarily the set it is disabled in, since that is determined by its ancestors
*/
public readonly DimensionSpacePointSet $disabledDimensionSpacePoints
) {
// this nodeAggregate can only exist if it at least contains one node.
assert($this->nodesByOccupiedDimensionSpacePoint !== []);
assert($this->nodesByCoveredDimensionSpacePoint !== []);
}

public function occupiesDimensionSpacePoint(OriginDimensionSpacePoint $originDimensionSpacePoint): bool
Expand All @@ -87,6 +98,11 @@ public function getNodes(): iterable
return array_values($this->nodesByOccupiedDimensionSpacePoint);
}

public function getSingleNodeIndependentOfItsDimension(): Node
{
return current($this->nodesByOccupiedDimensionSpacePoint);
}

public function getNodeByOccupiedDimensionSpacePoint(
OriginDimensionSpacePoint $occupiedDimensionSpacePoint
): Node {
Expand Down

0 comments on commit f4af1cb

Please sign in to comment.