refactor: query for fetching faces and people of assets (#17661)

* use json instead of jsonb

* missing condition
This commit is contained in:
Mert 2025-04-16 19:00:55 -04:00 committed by GitHub
parent ed2b54527c
commit 242a559e0f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 32 additions and 39 deletions

View File

@ -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[]) {

View File

@ -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