mirror of
https://github.com/immich-app/immich.git
synced 2025-06-03 21:54:21 -04:00
refactor: query for fetching faces and people of assets (#17661)
* use json instead of jsonb * missing condition
This commit is contained in:
parent
ed2b54527c
commit
242a559e0f
@ -90,30 +90,19 @@ export function withFiles(eb: ExpressionBuilder<DB, 'assets'>, type?: AssetFileT
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function withFacesAndPeople(eb: ExpressionBuilder<DB, 'assets'>, withDeletedFace?: boolean) {
|
export function withFacesAndPeople(eb: ExpressionBuilder<DB, 'assets'>, withDeletedFace?: boolean) {
|
||||||
return eb
|
return jsonArrayFrom(
|
||||||
.selectFrom('asset_faces')
|
eb
|
||||||
.leftJoin('person', 'person.id', 'asset_faces.personId')
|
.selectFrom('asset_faces')
|
||||||
.whereRef('asset_faces.assetId', '=', 'assets.id')
|
.leftJoinLateral(
|
||||||
.$if(!withDeletedFace, (qb) => qb.where('asset_faces.deletedAt', 'is', null))
|
(eb) =>
|
||||||
.select((eb) =>
|
eb.selectFrom('person').selectAll('person').whereRef('asset_faces.personId', '=', 'person.id').as('person'),
|
||||||
eb
|
(join) => join.onTrue(),
|
||||||
.fn('jsonb_agg', [
|
)
|
||||||
eb
|
.selectAll('asset_faces')
|
||||||
.case()
|
.select((eb) => eb.table('person').as('person'))
|
||||||
.when('person.id', 'is not', null)
|
.whereRef('asset_faces.assetId', '=', 'assets.id')
|
||||||
.then(
|
.$if(!withDeletedFace, (qb) => qb.where('asset_faces.deletedAt', 'is', null)),
|
||||||
eb.fn('jsonb_insert', [
|
).as('faces');
|
||||||
eb.fn('to_jsonb', [eb.table('asset_faces')]),
|
|
||||||
sql`'{person}'::text[]`,
|
|
||||||
eb.fn('to_jsonb', [eb.table('person')]),
|
|
||||||
]),
|
|
||||||
)
|
|
||||||
.else(eb.fn('to_jsonb', [eb.table('asset_faces')]))
|
|
||||||
.end(),
|
|
||||||
])
|
|
||||||
.as('faces'),
|
|
||||||
)
|
|
||||||
.as('faces');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function hasPeople<O>(qb: SelectQueryBuilder<DB, 'assets', O>, personIds: string[]) {
|
export function hasPeople<O>(qb: SelectQueryBuilder<DB, 'assets', O>, personIds: string[]) {
|
||||||
|
@ -87,22 +87,26 @@ select
|
|||||||
"assets".*,
|
"assets".*,
|
||||||
(
|
(
|
||||||
select
|
select
|
||||||
jsonb_agg(
|
coalesce(json_agg(agg), '[]')
|
||||||
case
|
|
||||||
when "person"."id" is not null then jsonb_insert(
|
|
||||||
to_jsonb("asset_faces"),
|
|
||||||
'{person}'::text[],
|
|
||||||
to_jsonb("person")
|
|
||||||
)
|
|
||||||
else to_jsonb("asset_faces")
|
|
||||||
end
|
|
||||||
) as "faces"
|
|
||||||
from
|
from
|
||||||
"asset_faces"
|
(
|
||||||
left join "person" on "person"."id" = "asset_faces"."personId"
|
select
|
||||||
where
|
"asset_faces".*,
|
||||||
"asset_faces"."assetId" = "assets"."id"
|
"person" as "person"
|
||||||
and "asset_faces"."deletedAt" is null
|
from
|
||||||
|
"asset_faces"
|
||||||
|
left join lateral (
|
||||||
|
select
|
||||||
|
"person".*
|
||||||
|
from
|
||||||
|
"person"
|
||||||
|
where
|
||||||
|
"asset_faces"."personId" = "person"."id"
|
||||||
|
) as "person" on true
|
||||||
|
where
|
||||||
|
"asset_faces"."assetId" = "assets"."id"
|
||||||
|
and "asset_faces"."deletedAt" is null
|
||||||
|
) as agg
|
||||||
) as "faces",
|
) as "faces",
|
||||||
(
|
(
|
||||||
select
|
select
|
||||||
|
Loading…
x
Reference in New Issue
Block a user