1
0
Fork 0
mirror of https://github.com/immich-app/immich.git synced 2024-12-29 15:11:58 +00:00

chore(server): time bucket sql (#6156)

This commit is contained in:
Jason Rasmussen 2024-01-03 23:32:52 -05:00 committed by GitHub
parent 317adc5c28
commit 7b40c20ea5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 151 additions and 0 deletions

View file

@ -17,4 +17,5 @@ export const DummyValue = {
STRING: 'abcdefghi',
BUFFER: Buffer.from('abcdefghi'),
DATE: new Date(),
TIME_BUCKET: '2024-01-01T00:00:00.000Z',
};

View file

@ -674,6 +674,7 @@ export class AssetRepository implements IAssetRepository {
);
}
@GenerateSql({ params: [{ size: TimeBucketSize.MONTH }] })
getTimeBuckets(options: TimeBucketOptions): Promise<TimeBucketItem[]> {
const truncated = dateTrunc(options);
return this.getBuilder(options)
@ -684,6 +685,7 @@ export class AssetRepository implements IAssetRepository {
.getRawMany();
}
@GenerateSql({ params: [DummyValue.TIME_BUCKET, { size: TimeBucketSize.MONTH }] })
getTimeBucket(timeBucket: string, options: TimeBucketOptions): Promise<AssetEntity[]> {
const truncated = dateTrunc(options);
return (

View file

@ -607,6 +607,154 @@ ORDER BY
LIMIT
11
-- AssetRepository.getTimeBuckets
SELECT
COUNT("asset"."id")::int AS "count",
(
date_trunc(
'month',
(asset."localDateTime" at time zone 'UTC')
) at time zone 'UTC'
)::timestamptz AS "timeBucket"
FROM
"assets" "asset"
LEFT JOIN "exif" "exifInfo" ON "exifInfo"."assetId" = "asset"."id"
LEFT JOIN "assets" "stack" ON "stack"."stackParentId" = "asset"."id"
AND ("stack"."deletedAt" IS NULL)
WHERE
(
"asset"."isVisible" = true
AND "asset"."fileCreatedAt" < NOW()
)
AND ("asset"."deletedAt" IS NULL)
GROUP BY
(
date_trunc(
'month',
(asset."localDateTime" at time zone 'UTC')
) at time zone 'UTC'
)::timestamptz
ORDER BY
(
date_trunc(
'month',
(asset."localDateTime" at time zone 'UTC')
) at time zone 'UTC'
)::timestamptz DESC
-- AssetRepository.getTimeBucket
SELECT
"asset"."id" AS "asset_id",
"asset"."deviceAssetId" AS "asset_deviceAssetId",
"asset"."ownerId" AS "asset_ownerId",
"asset"."libraryId" AS "asset_libraryId",
"asset"."deviceId" AS "asset_deviceId",
"asset"."type" AS "asset_type",
"asset"."originalPath" AS "asset_originalPath",
"asset"."resizePath" AS "asset_resizePath",
"asset"."webpPath" AS "asset_webpPath",
"asset"."thumbhash" AS "asset_thumbhash",
"asset"."encodedVideoPath" AS "asset_encodedVideoPath",
"asset"."createdAt" AS "asset_createdAt",
"asset"."updatedAt" AS "asset_updatedAt",
"asset"."deletedAt" AS "asset_deletedAt",
"asset"."fileCreatedAt" AS "asset_fileCreatedAt",
"asset"."localDateTime" AS "asset_localDateTime",
"asset"."fileModifiedAt" AS "asset_fileModifiedAt",
"asset"."isFavorite" AS "asset_isFavorite",
"asset"."isArchived" AS "asset_isArchived",
"asset"."isExternal" AS "asset_isExternal",
"asset"."isReadOnly" AS "asset_isReadOnly",
"asset"."isOffline" AS "asset_isOffline",
"asset"."checksum" AS "asset_checksum",
"asset"."duration" AS "asset_duration",
"asset"."isVisible" AS "asset_isVisible",
"asset"."livePhotoVideoId" AS "asset_livePhotoVideoId",
"asset"."originalFileName" AS "asset_originalFileName",
"asset"."sidecarPath" AS "asset_sidecarPath",
"asset"."stackParentId" AS "asset_stackParentId",
"exifInfo"."assetId" AS "exifInfo_assetId",
"exifInfo"."description" AS "exifInfo_description",
"exifInfo"."exifImageWidth" AS "exifInfo_exifImageWidth",
"exifInfo"."exifImageHeight" AS "exifInfo_exifImageHeight",
"exifInfo"."fileSizeInByte" AS "exifInfo_fileSizeInByte",
"exifInfo"."orientation" AS "exifInfo_orientation",
"exifInfo"."dateTimeOriginal" AS "exifInfo_dateTimeOriginal",
"exifInfo"."modifyDate" AS "exifInfo_modifyDate",
"exifInfo"."timeZone" AS "exifInfo_timeZone",
"exifInfo"."latitude" AS "exifInfo_latitude",
"exifInfo"."longitude" AS "exifInfo_longitude",
"exifInfo"."projectionType" AS "exifInfo_projectionType",
"exifInfo"."city" AS "exifInfo_city",
"exifInfo"."livePhotoCID" AS "exifInfo_livePhotoCID",
"exifInfo"."state" AS "exifInfo_state",
"exifInfo"."country" AS "exifInfo_country",
"exifInfo"."make" AS "exifInfo_make",
"exifInfo"."model" AS "exifInfo_model",
"exifInfo"."lensModel" AS "exifInfo_lensModel",
"exifInfo"."fNumber" AS "exifInfo_fNumber",
"exifInfo"."focalLength" AS "exifInfo_focalLength",
"exifInfo"."iso" AS "exifInfo_iso",
"exifInfo"."exposureTime" AS "exifInfo_exposureTime",
"exifInfo"."profileDescription" AS "exifInfo_profileDescription",
"exifInfo"."colorspace" AS "exifInfo_colorspace",
"exifInfo"."bitsPerSample" AS "exifInfo_bitsPerSample",
"exifInfo"."fps" AS "exifInfo_fps",
"stack"."id" AS "stack_id",
"stack"."deviceAssetId" AS "stack_deviceAssetId",
"stack"."ownerId" AS "stack_ownerId",
"stack"."libraryId" AS "stack_libraryId",
"stack"."deviceId" AS "stack_deviceId",
"stack"."type" AS "stack_type",
"stack"."originalPath" AS "stack_originalPath",
"stack"."resizePath" AS "stack_resizePath",
"stack"."webpPath" AS "stack_webpPath",
"stack"."thumbhash" AS "stack_thumbhash",
"stack"."encodedVideoPath" AS "stack_encodedVideoPath",
"stack"."createdAt" AS "stack_createdAt",
"stack"."updatedAt" AS "stack_updatedAt",
"stack"."deletedAt" AS "stack_deletedAt",
"stack"."fileCreatedAt" AS "stack_fileCreatedAt",
"stack"."localDateTime" AS "stack_localDateTime",
"stack"."fileModifiedAt" AS "stack_fileModifiedAt",
"stack"."isFavorite" AS "stack_isFavorite",
"stack"."isArchived" AS "stack_isArchived",
"stack"."isExternal" AS "stack_isExternal",
"stack"."isReadOnly" AS "stack_isReadOnly",
"stack"."isOffline" AS "stack_isOffline",
"stack"."checksum" AS "stack_checksum",
"stack"."duration" AS "stack_duration",
"stack"."isVisible" AS "stack_isVisible",
"stack"."livePhotoVideoId" AS "stack_livePhotoVideoId",
"stack"."originalFileName" AS "stack_originalFileName",
"stack"."sidecarPath" AS "stack_sidecarPath",
"stack"."stackParentId" AS "stack_stackParentId"
FROM
"assets" "asset"
LEFT JOIN "exif" "exifInfo" ON "exifInfo"."assetId" = "asset"."id"
LEFT JOIN "assets" "stack" ON "stack"."stackParentId" = "asset"."id"
AND ("stack"."deletedAt" IS NULL)
WHERE
(
"asset"."isVisible" = true
AND "asset"."fileCreatedAt" < NOW()
AND (
date_trunc(
'month',
(asset."localDateTime" at time zone 'UTC')
) at time zone 'UTC'
)::timestamptz = $1
)
AND ("asset"."deletedAt" IS NULL)
ORDER BY
(
date_trunc(
'month',
(asset."localDateTime" at time zone 'UTC')
) at time zone 'UTC'
)::timestamptz DESC,
"asset"."fileCreatedAt" DESC
-- AssetRepository.getAssetIdByCity
WITH
"cities" AS (