perf(server): use queries to refresh library assets (#7685)

* use queries instead of js

* missing await

* add mock methods

* fix test

* update sql

* linting
This commit is contained in:
Mert
2024-03-06 22:23:10 -05:00
committed by GitHub
parent fcb990665c
commit 1ec5d612fa
6 changed files with 63 additions and 13 deletions
@@ -199,6 +199,29 @@ export class AssetRepository implements IAssetRepository {
});
}
@GenerateSql({ params: [DummyValue.UUID, [DummyValue.STRING]] })
@ChunkedArray({ paramIndex: 1 })
async getPathsNotInLibrary(libraryId: string, originalPaths: string[]): Promise<string[]> {
const result = await this.repository.query(
`
WITH paths AS (SELECT unnest($2::text[]) AS path)
SELECT path FROM paths
WHERE NOT EXISTS (SELECT 1 FROM assets WHERE "libraryId" = $1 AND "originalPath" = path);
`,
[libraryId, originalPaths],
);
return result.map((row: { path: string }) => row.path);
}
@GenerateSql({ params: [DummyValue.UUID, [DummyValue.STRING]] })
@ChunkedArray({ paramIndex: 1 })
async updateOfflineLibraryAssets(libraryId: string, originalPaths: string[]): Promise<void> {
await this.repository.update(
{ library: { id: libraryId }, originalPath: Not(In(originalPaths)), isOffline: false },
{ isOffline: true },
);
}
getAll(pagination: PaginationOptions, options: AssetSearchOptions = {}): Paginated<AssetEntity> {
let builder = this.repository.createQueryBuilder('asset');
builder = searchAssetBuilder(builder, options);
+33
View File
@@ -395,6 +395,39 @@ ORDER BY
LIMIT
1
-- AssetRepository.getPathsNotInLibrary
WITH
paths AS (
SELECT
unnest($2::text []) AS path
)
SELECT
path
FROM
paths
WHERE
NOT EXISTS (
SELECT
1
FROM
assets
WHERE
"libraryId" = $1
AND "originalPath" = path
);
-- AssetRepository.updateOfflineLibraryAssets
UPDATE "assets"
SET
"isOffline" = $1,
"updatedAt" = CURRENT_TIMESTAMP
WHERE
(
"libraryId" = $2
AND NOT ("originalPath" IN ($3))
AND "isOffline" = $4
)
-- AssetRepository.getAllByFileCreationDate
SELECT
"asset"."id" AS "asset_id",