Skip to content

Commit

Permalink
Processed Updates Service minor performance improvement (#75)
Browse files Browse the repository at this point in the history
* Processed Updates Service minor performance improvement

* Make sure records are in DB before processing
  • Loading branch information
chrispenny authored Oct 2, 2023
1 parent d3ce4d6 commit d28ce60
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 16 deletions.
13 changes: 10 additions & 3 deletions src/Services/CacheProcessingService.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ abstract protected function shouldPublishUpdates(): bool;

public function processChange(DataObject $instance): void
{
// Can't process a record that hasn't been saved to the Database. This would only happen if a developer
// specifically calls processChange() in their code. All module hooks for this method are triggered *after*
// write() type events
if (!$instance->isInDB()) {
return;
}

$className = $instance->getClassName();

// This record has already been processed in full. It is possible for multiple write() actions to be performed
Expand Down Expand Up @@ -163,13 +170,13 @@ private function alreadyProcessed(string $className, int $id): bool
return false;
}

// We are in a "Draft" context, so we don't care whether or not the ProcessedUpdateDTO has been published or
// not. Its existence means that it has been processed
// We are in a "Draft" context, so we don't care whether the ProcessedUpdateDTO has been published or not. Its
// existence means that it has been processed
if (!$this->shouldPublishUpdates()) {
return true;
}

// We are in a "Live" context, so we need to return whether or not this ProcessedUpdateDTO has been published
// We are in a "Live" context, so we need to return whether this ProcessedUpdateDTO has been published
return $processedUpdate->isPublished();
}

Expand Down
21 changes: 10 additions & 11 deletions src/Services/ProcessedUpdatesService.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,21 +24,15 @@ public function getProcessedUpdates(): array

public function addProcessedUpdate(ProcessedUpdateDto $processedUpdate): void
{
$this->processedUpdates[] = $processedUpdate;
$key = $this->getProcessedUpdateKey($processedUpdate->getClassName(), $processedUpdate->getId());
$this->processedUpdates[$key] = $processedUpdate;
}

public function findProcessedUpdate(string $className, int $id): ?ProcessedUpdateDto
{
foreach ($this->processedUpdates as $processedUpdate) {
$classNameMatches = $processedUpdate->getClassName() === $className;
$idMatches = $processedUpdate->getId() === $id;
$key = $this->getProcessedUpdateKey($className, $id);

if ($idMatches && $classNameMatches) {
return $processedUpdate;
}
}

return null;
return $this->processedUpdates[$key] ?? null;
}

public function findOrCreateProcessedUpdate(string $className, int $id): ProcessedUpdateDto
Expand All @@ -50,9 +44,14 @@ public function findOrCreateProcessedUpdate(string $className, int $id): Process
}

$processedUpdate = new ProcessedUpdateDto($className, $id);
$this->processedUpdates[] = $processedUpdate;
$this->addProcessedUpdate($processedUpdate);

return $processedUpdate;
}

private function getProcessedUpdateKey(string $className, int $id): string
{
return sprintf('%s-%s', $className, $id);
}

}
4 changes: 2 additions & 2 deletions tests/Services/ProcessedUpdatesServiceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ public function testAddProcessedUpdate(): void
$this->assertCount(0, $service->getProcessedUpdates());

$service->addProcessedUpdate(new ProcessedUpdateDto(Page::class, 99));
// There are no checks for duplication between DTOs
// Existing DTOs would be overridden if an identical record is added
$service->addProcessedUpdate(new ProcessedUpdateDto(Page::class, 98));
$service->addProcessedUpdate(new ProcessedUpdateDto(Page::class, 98));

$this->assertCount(3, $service->getProcessedUpdates());
$this->assertCount(2, $service->getProcessedUpdates());
}

public function testFindProcessedUpdate(): void
Expand Down

0 comments on commit d28ce60

Please sign in to comment.