diff --git a/src/AbstractFixture.php b/src/AbstractFixture.php index b7e0f0b..fc744fd 100644 --- a/src/AbstractFixture.php +++ b/src/AbstractFixture.php @@ -7,7 +7,7 @@ use AsyncAws\DynamoDb\DynamoDbClient; use AsyncAws\DynamoDb\Input\PutItemInput; use Dynamite\Exception\ValidationException; -use Dynamite\Query\BatchWrite; +use Dynamite\Query\BatchWriteItems; use Dynamite\Schema\Records; use Dynamite\Validator\ValidatorAwareTrait; use Psr\Log\LoggerInterface; @@ -70,7 +70,7 @@ final public function load(DynamoDbClient $client, LoggerInterface $logger): voi return; } - $query = new BatchWrite($client, $logger); + $query = new BatchWriteItems($client, $logger); $query->putItems($this->schema->getTableName(), $this->schema->getRecords()); $logger->debug('Batch records loaded', [ diff --git a/src/Purger/Purger.php b/src/Purger/Purger.php index be8a531..b185b3e 100644 --- a/src/Purger/Purger.php +++ b/src/Purger/Purger.php @@ -11,7 +11,7 @@ use AsyncAws\DynamoDb\Input\DescribeTableInput; use AsyncAws\DynamoDb\Input\ScanInput; use AsyncAws\DynamoDb\ValueObject\AttributeValue; -use Dynamite\Query\BatchWrite; +use Dynamite\Query\BatchWriteItems; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; @@ -75,7 +75,7 @@ protected function truncateData(string $tableName): void $keysToDelete[] = $this->getDeleteKey($primaryKey, $item); } - $query = new BatchWrite($this->client, $this->logger); + $query = new BatchWriteItems($this->client, $this->logger); $query->deleteItems($tableName, $keysToDelete); $this->logger->debug('Table data truncated', [ diff --git a/src/Query/BatchWrite.php b/src/Query/BatchWrite.php deleted file mode 100644 index c9ae0e4..0000000 --- a/src/Query/BatchWrite.php +++ /dev/null @@ -1,97 +0,0 @@ -> $items - */ - public function putItems(string $tableName, array $items): void - { - $offset = $batchNumber = 0; - - while ($offset < \count($items)) { - $batch = array_slice($items, $offset, self::BATCH_MAX_SIZE); - - $input = new BatchWriteItemInput([ - 'RequestItems' => [ - $tableName => array_map( - static fn (array $item): WriteRequest => new WriteRequest([ - 'PutRequest' => new PutRequest([ - 'Item' => $item, - ]), - ]), - $batch - ), - ], - ]); - - $this->client->batchWriteItem($input)->resolve(); - - $offset += self::BATCH_MAX_SIZE; - ++$batchNumber; - - $this->logger->debug('Data batch executed', [ - 'table' => $tableName, - 'batch' => '#' . $batchNumber, - ]); - } - } - - /** - * @param array> $keys - */ - public function deleteItems(string $tableName, array $keys): void - { - $offset = $batchNumber = 0; - - while ($offset < \count($keys)) { - $batch = array_slice($keys, $offset, self::BATCH_MAX_SIZE); - - $input = new BatchWriteItemInput([ - 'RequestItems' => [ - $tableName => array_map( - static fn (array $key): WriteRequest => new WriteRequest([ - 'DeleteRequest' => new DeleteRequest([ - 'Key' => $key, - ]), - ]), - $batch - ), - ], - ]); - - $this->client->batchWriteItem($input)->resolve(); - - $offset += self::BATCH_MAX_SIZE; - ++$batchNumber; - - $this->logger->debug('Data batch deleted', [ - 'table' => $tableName, - 'batch' => '#' . $batchNumber, - ]); - } - } -} diff --git a/src/Query/BatchWriteItems.php b/src/Query/BatchWriteItems.php new file mode 100644 index 0000000..253b0b0 --- /dev/null +++ b/src/Query/BatchWriteItems.php @@ -0,0 +1,97 @@ +> $items + */ + public function putItems(string $tableName, array $items): void + { + $this->batchWriteRequest( + $tableName, + $items, + static fn (array $item): WriteRequest => new WriteRequest([ + 'PutRequest' => new PutRequest([ + 'Item' => $item, + ]), + ]), + function (string $tableName, int $batchNumber): void { + $this->logger->debug('Data batch executed', [ + 'table' => $tableName, + 'batch' => '#' . $batchNumber, + ]); + } + ); + } + + /** + * @param array> $keys + */ + public function deleteItems(string $tableName, array $keys): void + { + $this->batchWriteRequest( + $tableName, + $keys, + static fn (array $key): WriteRequest => new WriteRequest([ + 'DeleteRequest' => new DeleteRequest([ + 'Key' => $key, + ]), + ]), + function (string $tableName, int $batchNumber): void { + $this->logger->debug('Data batch deleted', [ + 'table' => $tableName, + 'batch' => '#' . $batchNumber, + ]); + } + ); + } + + private function batchWriteRequest( + string $tableName, + array $items, + \Closure $requestCallback, + \Closure $logCallback + ): void { + $offset = $batchNumber = 0; + + while ($offset < \count($items)) { + $batch = array_slice($items, $offset, self::BATCH_MAX_SIZE); + + $input = new BatchWriteItemInput([ + 'RequestItems' => [ + $tableName => array_map($requestCallback, $batch), + ], + ]); + + $this->client->batchWriteItem($input)->resolve(); + + $offset += self::BATCH_MAX_SIZE; + ++$batchNumber; + + $logCallback($tableName, $batchNumber); + } + } +}