mirror of
https://github.com/immich-app/immich.git
synced 2025-09-29 15:31:13 -04:00
458 lines
10 KiB
SQL
458 lines
10 KiB
SQL
-- NOTE: This file is auto generated by ./sql-generator
|
|
|
|
-- AssetRepository.updateAllExif
|
|
update "asset_exif"
|
|
set
|
|
"model" = $1
|
|
where
|
|
"assetId" in ($2)
|
|
|
|
-- AssetRepository.getByDayOfYear
|
|
with
|
|
"res" as (
|
|
with
|
|
"today" as (
|
|
select
|
|
make_date(year::int, $1::int, $2::int) as "date"
|
|
from
|
|
generate_series(
|
|
(
|
|
select
|
|
date_part(
|
|
'year',
|
|
min(("localDateTime" at time zone 'UTC')::date)
|
|
)::int
|
|
from
|
|
asset
|
|
),
|
|
date_part('year', current_date)::int - 1
|
|
) as "year"
|
|
)
|
|
select
|
|
"a".*,
|
|
to_json("asset_exif") as "exifInfo"
|
|
from
|
|
"today"
|
|
inner join lateral (
|
|
select
|
|
"asset".*
|
|
from
|
|
"asset"
|
|
inner join "asset_job_status" on "asset"."id" = "asset_job_status"."assetId"
|
|
where
|
|
"asset_job_status"."previewAt" is not null
|
|
and (asset."localDateTime" at time zone 'UTC')::date = today.date
|
|
and "asset"."ownerId" = any ($3::uuid[])
|
|
and "asset"."visibility" = $4
|
|
and exists (
|
|
select
|
|
from
|
|
"asset_file"
|
|
where
|
|
"assetId" = "asset"."id"
|
|
and "asset_file"."type" = $5
|
|
)
|
|
and "asset"."deletedAt" is null
|
|
order by
|
|
(asset."localDateTime" at time zone 'UTC')::date desc
|
|
limit
|
|
$6
|
|
) as "a" on true
|
|
inner join "asset_exif" on "a"."id" = "asset_exif"."assetId"
|
|
)
|
|
select
|
|
date_part(
|
|
'year',
|
|
("localDateTime" at time zone 'UTC')::date
|
|
)::int as "year",
|
|
json_agg("res") as "assets"
|
|
from
|
|
"res"
|
|
group by
|
|
("localDateTime" at time zone 'UTC')::date
|
|
order by
|
|
("localDateTime" at time zone 'UTC')::date desc
|
|
|
|
-- AssetRepository.getByIds
|
|
select
|
|
"asset".*
|
|
from
|
|
"asset"
|
|
where
|
|
"asset"."id" = any ($1::uuid[])
|
|
|
|
-- AssetRepository.getByIdsWithAllRelationsButStacks
|
|
select
|
|
"asset".*,
|
|
(
|
|
select
|
|
coalesce(json_agg(agg), '[]')
|
|
from
|
|
(
|
|
select
|
|
"asset_face".*,
|
|
"person" as "person"
|
|
from
|
|
"asset_face"
|
|
left join lateral (
|
|
select
|
|
"person".*
|
|
from
|
|
"person"
|
|
where
|
|
"asset_face"."personId" = "person"."id"
|
|
) as "person" on true
|
|
where
|
|
"asset_face"."assetId" = "asset"."id"
|
|
and "asset_face"."deletedAt" is null
|
|
) as agg
|
|
) as "faces",
|
|
(
|
|
select
|
|
coalesce(json_agg(agg), '[]')
|
|
from
|
|
(
|
|
select
|
|
"tag"."id",
|
|
"tag"."value",
|
|
"tag"."createdAt",
|
|
"tag"."updatedAt",
|
|
"tag"."color",
|
|
"tag"."parentId"
|
|
from
|
|
"tag"
|
|
inner join "tag_asset" on "tag"."id" = "tag_asset"."tagsId"
|
|
where
|
|
"asset"."id" = "tag_asset"."assetsId"
|
|
) as agg
|
|
) as "tags",
|
|
to_json("asset_exif") as "exifInfo"
|
|
from
|
|
"asset"
|
|
left join "asset_exif" on "asset"."id" = "asset_exif"."assetId"
|
|
where
|
|
"asset"."id" = any ($1::uuid[])
|
|
|
|
-- AssetRepository.deleteAll
|
|
delete from "asset"
|
|
where
|
|
"ownerId" = $1
|
|
|
|
-- AssetRepository.getByLibraryIdAndOriginalPath
|
|
select
|
|
"asset".*
|
|
from
|
|
"asset"
|
|
where
|
|
"libraryId" = $1::uuid
|
|
and "originalPath" = $2
|
|
limit
|
|
$3
|
|
|
|
-- AssetRepository.getAllByDeviceId
|
|
select
|
|
"deviceAssetId"
|
|
from
|
|
"asset"
|
|
where
|
|
"ownerId" = $1::uuid
|
|
and "deviceId" = $2
|
|
and "visibility" != $3
|
|
and "deletedAt" is null
|
|
|
|
-- AssetRepository.getLivePhotoCount
|
|
select
|
|
count(*) as "count"
|
|
from
|
|
"asset"
|
|
where
|
|
"livePhotoVideoId" = $1::uuid
|
|
|
|
-- AssetRepository.getById
|
|
select
|
|
"asset".*
|
|
from
|
|
"asset"
|
|
where
|
|
"asset"."id" = $1::uuid
|
|
limit
|
|
$2
|
|
|
|
-- AssetRepository.updateAll
|
|
update "asset"
|
|
set
|
|
"deviceId" = $1
|
|
where
|
|
"id" = any ($2::uuid[])
|
|
|
|
-- AssetRepository.getByChecksum
|
|
select
|
|
"asset".*
|
|
from
|
|
"asset"
|
|
where
|
|
"ownerId" = $1::uuid
|
|
and "checksum" = $2
|
|
and "libraryId" = $3::uuid
|
|
limit
|
|
$4
|
|
|
|
-- AssetRepository.getByChecksums
|
|
select
|
|
"id",
|
|
"checksum",
|
|
"deletedAt"
|
|
from
|
|
"asset"
|
|
where
|
|
"ownerId" = $1::uuid
|
|
and "checksum" in ($2)
|
|
|
|
-- AssetRepository.getUploadAssetIdByChecksum
|
|
select
|
|
"id"
|
|
from
|
|
"asset"
|
|
where
|
|
"ownerId" = $1::uuid
|
|
and "checksum" = $2
|
|
and "libraryId" is null
|
|
limit
|
|
$3
|
|
|
|
-- AssetRepository.getTimeBuckets
|
|
with
|
|
"asset" as (
|
|
select
|
|
date_trunc('MONTH', "localDateTime" AT TIME ZONE 'UTC') AT TIME ZONE 'UTC' as "timeBucket"
|
|
from
|
|
"asset"
|
|
where
|
|
"asset"."deletedAt" is null
|
|
and "asset"."visibility" in ('archive', 'timeline')
|
|
)
|
|
select
|
|
("timeBucket" AT TIME ZONE 'UTC')::date::text as "timeBucket",
|
|
count(*) as "count"
|
|
from
|
|
"asset"
|
|
group by
|
|
"timeBucket"
|
|
order by
|
|
"timeBucket" desc
|
|
|
|
-- AssetRepository.getTimeBucket
|
|
with
|
|
"cte" as (
|
|
select
|
|
"asset"."duration",
|
|
"asset"."id",
|
|
"asset"."visibility",
|
|
"asset"."isFavorite",
|
|
asset.type = 'IMAGE' as "isImage",
|
|
asset."deletedAt" is not null as "isTrashed",
|
|
"asset"."livePhotoVideoId",
|
|
extract(
|
|
epoch
|
|
from
|
|
(
|
|
asset."localDateTime" - asset."fileCreatedAt" at time zone 'UTC'
|
|
)
|
|
)::real / 3600 as "localOffsetHours",
|
|
"asset"."ownerId",
|
|
"asset"."status",
|
|
asset."fileCreatedAt" at time zone 'utc' as "fileCreatedAt",
|
|
encode("asset"."thumbhash", 'base64') as "thumbhash",
|
|
"asset_exif"."city",
|
|
"asset_exif"."country",
|
|
"asset_exif"."projectionType",
|
|
coalesce(
|
|
case
|
|
when asset_exif."exifImageHeight" = 0
|
|
or asset_exif."exifImageWidth" = 0 then 1
|
|
when "asset_exif"."orientation" in ('5', '6', '7', '8', '-90', '90') then round(
|
|
asset_exif."exifImageHeight"::numeric / asset_exif."exifImageWidth"::numeric,
|
|
3
|
|
)
|
|
else round(
|
|
asset_exif."exifImageWidth"::numeric / asset_exif."exifImageHeight"::numeric,
|
|
3
|
|
)
|
|
end,
|
|
1
|
|
) as "ratio",
|
|
"stack"
|
|
from
|
|
"asset"
|
|
inner join "asset_exif" on "asset"."id" = "asset_exif"."assetId"
|
|
left join lateral (
|
|
select
|
|
array[stacked."stackId"::text, count('stacked')::text] as "stack"
|
|
from
|
|
"asset" as "stacked"
|
|
where
|
|
"stacked"."stackId" = "asset"."stackId"
|
|
and "stacked"."deletedAt" is null
|
|
and "stacked"."visibility" = $1
|
|
group by
|
|
"stacked"."stackId"
|
|
) as "stacked_assets" on true
|
|
where
|
|
"asset"."deletedAt" is null
|
|
and "asset"."visibility" in ('archive', 'timeline')
|
|
and date_trunc('MONTH', "localDateTime" AT TIME ZONE 'UTC') AT TIME ZONE 'UTC' = $2
|
|
and not exists (
|
|
select
|
|
from
|
|
"stack"
|
|
where
|
|
"stack"."id" = "asset"."stackId"
|
|
and "stack"."primaryAssetId" != "asset"."id"
|
|
)
|
|
order by
|
|
"asset"."fileCreatedAt" desc
|
|
),
|
|
"agg" as (
|
|
select
|
|
coalesce(array_agg("city"), '{}') as "city",
|
|
coalesce(array_agg("country"), '{}') as "country",
|
|
coalesce(array_agg("duration"), '{}') as "duration",
|
|
coalesce(array_agg("id"), '{}') as "id",
|
|
coalesce(array_agg("visibility"), '{}') as "visibility",
|
|
coalesce(array_agg("isFavorite"), '{}') as "isFavorite",
|
|
coalesce(array_agg("isImage"), '{}') as "isImage",
|
|
coalesce(array_agg("isTrashed"), '{}') as "isTrashed",
|
|
coalesce(array_agg("livePhotoVideoId"), '{}') as "livePhotoVideoId",
|
|
coalesce(array_agg("fileCreatedAt"), '{}') as "fileCreatedAt",
|
|
coalesce(array_agg("localOffsetHours"), '{}') as "localOffsetHours",
|
|
coalesce(array_agg("ownerId"), '{}') as "ownerId",
|
|
coalesce(array_agg("projectionType"), '{}') as "projectionType",
|
|
coalesce(array_agg("ratio"), '{}') as "ratio",
|
|
coalesce(array_agg("status"), '{}') as "status",
|
|
coalesce(array_agg("thumbhash"), '{}') as "thumbhash",
|
|
coalesce(json_agg("stack"), '[]') as "stack"
|
|
from
|
|
"cte"
|
|
)
|
|
select
|
|
to_json(agg)::text as "assets"
|
|
from
|
|
"agg"
|
|
|
|
-- AssetRepository.getAssetIdByCity
|
|
with
|
|
"cities" as (
|
|
select
|
|
"city"
|
|
from
|
|
"asset_exif"
|
|
where
|
|
"city" is not null
|
|
group by
|
|
"city"
|
|
having
|
|
count("assetId") >= $1
|
|
)
|
|
select distinct
|
|
on ("asset_exif"."city") "assetId" as "data",
|
|
"asset_exif"."city" as "value"
|
|
from
|
|
"asset"
|
|
inner join "asset_exif" on "asset"."id" = "asset_exif"."assetId"
|
|
inner join "cities" on "asset_exif"."city" = "cities"."city"
|
|
where
|
|
"ownerId" = $2::uuid
|
|
and "visibility" = $3
|
|
and "type" = $4
|
|
and "deletedAt" is null
|
|
limit
|
|
$5
|
|
|
|
-- AssetRepository.getAllForUserFullSync
|
|
select
|
|
"asset".*,
|
|
to_json("asset_exif") as "exifInfo",
|
|
to_json("stacked_assets") as "stack"
|
|
from
|
|
"asset"
|
|
left join "asset_exif" on "asset"."id" = "asset_exif"."assetId"
|
|
left join "stack" on "stack"."id" = "asset"."stackId"
|
|
left join lateral (
|
|
select
|
|
"stack".*,
|
|
count("stacked") as "assetCount"
|
|
from
|
|
"asset" as "stacked"
|
|
where
|
|
"stacked"."stackId" = "stack"."id"
|
|
group by
|
|
"stack"."id"
|
|
) as "stacked_assets" on "stack"."id" is not null
|
|
where
|
|
"asset"."ownerId" = $1::uuid
|
|
and "asset"."visibility" != $2
|
|
and "asset"."updatedAt" <= $3
|
|
and "asset"."id" > $4
|
|
order by
|
|
"asset"."id"
|
|
limit
|
|
$5
|
|
|
|
-- AssetRepository.getChangedDeltaSync
|
|
select
|
|
"asset".*,
|
|
to_json("asset_exif") as "exifInfo",
|
|
to_json("stacked_assets") as "stack"
|
|
from
|
|
"asset"
|
|
left join "asset_exif" on "asset"."id" = "asset_exif"."assetId"
|
|
left join "stack" on "stack"."id" = "asset"."stackId"
|
|
left join lateral (
|
|
select
|
|
"stack".*,
|
|
count("stacked") as "assetCount"
|
|
from
|
|
"asset" as "stacked"
|
|
where
|
|
"stacked"."stackId" = "stack"."id"
|
|
group by
|
|
"stack"."id"
|
|
) as "stacked_assets" on "stack"."id" is not null
|
|
where
|
|
"asset"."ownerId" = any ($1::uuid[])
|
|
and "asset"."visibility" != $2
|
|
and "asset"."updatedAt" > $3
|
|
limit
|
|
$4
|
|
|
|
-- AssetRepository.detectOfflineExternalAssets
|
|
update "asset"
|
|
set
|
|
"isOffline" = $1,
|
|
"deletedAt" = $2
|
|
where
|
|
"isOffline" = $3
|
|
and "isExternal" = $4
|
|
and "libraryId" = $5::uuid
|
|
and (
|
|
not "originalPath" like $6
|
|
or "originalPath" like $7
|
|
)
|
|
|
|
-- AssetRepository.filterNewExternalAssetPaths
|
|
select
|
|
"path"
|
|
from
|
|
unnest(array[$1]::text[]) as "path"
|
|
where
|
|
not exists (
|
|
select
|
|
"originalPath"
|
|
from
|
|
"asset"
|
|
where
|
|
"asset"."originalPath" = "path"
|
|
and "libraryId" = $2::uuid
|
|
and "isExternal" = $3
|
|
)
|