From c89d91e006474dcabc5379d0935ef4e9b6d37306 Mon Sep 17 00:00:00 2001 From: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com> Date: Thu, 29 Feb 2024 22:14:48 +0100 Subject: [PATCH] feat: filter people when using smart search (#7521) --- mobile/openapi/doc/SmartSearchDto.md | Bin 1922 -> 1993 bytes .../openapi/lib/model/smart_search_dto.dart | Bin 23924 -> 24290 bytes .../openapi/test/smart_search_dto_test.dart | Bin 3765 -> 3900 bytes open-api/immich-openapi-specs.json | 6 +++++ open-api/typescript-sdk/src/fetch-client.ts | 1 + server/src/domain/search/dto/search.dto.ts | 6 ++--- .../infra/repositories/search.repository.ts | 21 ++++++++++++++++-- .../search-bar/search-filter-box.svelte | 9 -------- 8 files changed, 29 insertions(+), 14 deletions(-) diff --git a/mobile/openapi/doc/SmartSearchDto.md b/mobile/openapi/doc/SmartSearchDto.md index d4ec1a70f6937efda925be4fbf7d398c786235c7..d5f4c40256f0f1f04f5cf80fec51a8f1968561d9 100644 GIT binary patch delta 67 zcmZqTKgqvAkwvB;wWv5h&oiZ1OG}|fK}*Xgv$(`2xTGjEFWqkPK_+3*=#GZuUR delta 22 dcmX@f-^9N`k%hIeG_|O5ay+x><|Y<*W&l=A2L}KE diff --git a/mobile/openapi/lib/model/smart_search_dto.dart b/mobile/openapi/lib/model/smart_search_dto.dart index 664850db82f8554f10136f780b9e3ddd61596ac3..0b99acdd66c754e33c43b7ec861502d945fb5793 100644 GIT binary patch delta 355 zcmeyei}BH3#tk2tBug?fi}eapi;DB}JX4AlY!#C8^NLFpqGLC|W||};=95`mViR0a zl$n=qrvO*Bxk6q~*dRV7HMPLCurx6zv!qfl6~rjk$S=uAEkYQmgV3b8d7jZ%R!)Q= zjTW9PB5!|TSX3t>RBP%bCnCJ9p{ZAr4+;m3^rHN7kZD#5X+W>0YKo&6YlR59 I+K}%Y0Q{MKkN^Mx delta 44 zcmV+{0Mq~Cy#e&P0kH7`vk(J}9J99{DHF38GwlVlAUQV#vu!;`3$x!yb_}!iRqY6; CJ`!30 diff --git a/mobile/openapi/test/smart_search_dto_test.dart b/mobile/openapi/test/smart_search_dto_test.dart index 4db3ac08089df856fe9e0a9a321dde5f89cf226d..5263f7bb6ac7234eb62e9b0f2c4f8398af25fe8f 100644 GIT binary patch delta 79 zcmdlgyGL$A0H=XZW^sv4a7j^SUb>w^L26NPex7Gav4TcQYFc7xPKiQUVoqtQl|piU cUU7*+bgbs&hpdX6aCMU%nN2o_bH=d(0EA&25dZ)H delta 16 YcmdlZw^epS0O#ZhT, personIds: string[]) { + return builder + .select(`${builder.alias}."assetId"`) + .where(`${builder.alias}."personId" IN (:...personIds)`, { personIds }) + .groupBy(`${builder.alias}."assetId"`) + .having(`COUNT(DISTINCT ${builder.alias}."personId") = :personCount`, { personCount: personIds.length }); + } + @GenerateSql({ params: [ { page: 1, size: 100 }, @@ -96,12 +104,21 @@ export class SearchRepository implements ISearchRepository { }) async searchSmart( pagination: SearchPaginationOptions, - { embedding, userIds, ...options }: SmartSearchOptions, + { embedding, userIds, personIds, ...options }: SmartSearchOptions, ): Paginated { let results: PaginationResult = { items: [], hasNextPage: false }; await this.assetRepository.manager.transaction(async (manager) => { let builder = manager.createQueryBuilder(AssetEntity, 'asset'); + + if (personIds?.length) { + const assetFaceBuilder = manager.createQueryBuilder(AssetFaceEntity, 'asset_face'); + const cte = this.createPersonFilter(assetFaceBuilder, personIds); + builder + .addCommonTableExpression(cte, 'asset_face_ids') + .innerJoin('asset_face_ids', 'a', 'a."assetId" = asset.id'); + } + builder = searchAssetBuilder(builder, options); builder .innerJoin('asset.smartSearch', 'search') diff --git a/web/src/lib/components/shared-components/search-bar/search-filter-box.svelte b/web/src/lib/components/shared-components/search-bar/search-filter-box.svelte index 8d060f4d0..b05e2d5a3 100644 --- a/web/src/lib/components/shared-components/search-bar/search-filter-box.svelte +++ b/web/src/lib/components/shared-components/search-bar/search-filter-box.svelte @@ -22,7 +22,6 @@