diff --git a/lib/private/FilesMetadata/Service/MetadataRequestService.php b/lib/private/FilesMetadata/Service/MetadataRequestService.php index 83d65a992df6b..06aa54d4eec0c 100644 --- a/lib/private/FilesMetadata/Service/MetadataRequestService.php +++ b/lib/private/FilesMetadata/Service/MetadataRequestService.php @@ -155,7 +155,7 @@ public function dropMetadataForFiles(int $storage, array $fileIds): void { foreach ($chunks as $chunk) { $qb = $this->dbConnection->getQueryBuilder(); $qb->delete(self::TABLE_METADATA) - ->where($qb->expr()->in('file_id', $qb->createNamedParameter($fileIds, IQueryBuilder::PARAM_INT_ARRAY))) + ->where($qb->expr()->in('file_id', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY))) ->hintShardKey('storage', $storage); $qb->executeStatement(); } diff --git a/tests/lib/FilesMetadata/FilesMetadataManagerTest.php b/tests/lib/FilesMetadata/FilesMetadataManagerTest.php index a349065f32f05..03fc9de22b006 100644 --- a/tests/lib/FilesMetadata/FilesMetadataManagerTest.php +++ b/tests/lib/FilesMetadata/FilesMetadataManagerTest.php @@ -94,4 +94,37 @@ public function testRefreshMetadata(): void { $this->assertEquals($file->getId(), $retrieved->getFileId()); $this->assertEquals('yes', $retrieved->getString('istest')); } + + public function testDropMetadataForFilesChunking(): void { + $connection = $this->createMock(IDBConnection::class); + $qb = $this->createMock(\OCP\DB\QueryBuilder\IQueryBuilder::class); + $expr = $this->createMock(\OCP\DB\QueryBuilder\IExpressionBuilder::class); + + $connection->method('getQueryBuilder')->willReturn($qb); + $qb->method('expr')->willReturn($expr); + $qb->method('delete')->willReturnSelf(); + $qb->method('where')->willReturnSelf(); + $qb->method('hintShardKey')->willReturnSelf(); + + $fileIds = range(1, \OCP\DB\QueryBuilder\IQueryBuilder::MAX_IN_PARAMETERS * 2 + 1); + $expectedChunks = array_chunk($fileIds, \OCP\DB\QueryBuilder\IQueryBuilder::MAX_IN_PARAMETERS); + $boundChunks = []; + + $qb->expects($this->exactly(count($expectedChunks))) + ->method('createNamedParameter') + ->willReturnCallback(function (array $chunk, $type) use (&$boundChunks): string { + $this->assertSame(\OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT_ARRAY, $type); + $boundChunks[] = $chunk; + return ':param'; + }); + + $qb->expects($this->exactly(count($expectedChunks))) + ->method('executeStatement') + ->willReturn(1); + + $service = new MetadataRequestService($connection, $this->logger); + $service->dropMetadataForFiles(123, $fileIds); + + $this->assertSame($expectedChunks, $boundChunks); + } }