From dcf32fe20cdd87fbc37fddd4d1a93b7da03e7f92 Mon Sep 17 00:00:00 2001 From: timonrieger Date: Tue, 2 Jun 2026 17:02:04 +0200 Subject: [PATCH] reverse table map to sets --- server/src/utils/database.ts | 70 ++++++++++-------------------------- 1 file changed, 19 insertions(+), 51 deletions(-) diff --git a/server/src/utils/database.ts b/server/src/utils/database.ts index 70c126e41e..8e76165633 100644 --- a/server/src/utils/database.ts +++ b/server/src/utils/database.ts @@ -509,67 +509,35 @@ export function searchAssetBuilderLegacy(kysely: Kysely, options: AssetSearc .$if(!options.withDeleted, (qb) => qb.where('asset.deletedAt', 'is', null)); } -type Backing = 'asset' | 'asset_exif' | 'asset_file' | 'ocr_search' | 'membership'; +const EXIF_FILTER_FIELDS = new Set([ + 'city', + 'state', + 'country', + 'make', + 'model', + 'lensModel', + 'description', + 'rating', + 'fileSizeInBytes', +]); -const FIELD_BACKING: Record, Backing> = { - id: 'asset', - libraryId: 'asset', - type: 'asset', - visibility: 'asset', - isFavorite: 'asset', - isMotion: 'asset', - isOffline: 'asset', - isEncoded: 'asset_file', - hasAlbums: 'membership', - hasPeople: 'membership', - hasTags: 'membership', - city: 'asset_exif', - state: 'asset_exif', - country: 'asset_exif', - make: 'asset_exif', - model: 'asset_exif', - lensModel: 'asset_exif', - description: 'asset_exif', - originalFileName: 'asset', - originalPath: 'asset', - ocr: 'ocr_search', - rating: 'asset_exif', - fileSizeInBytes: 'asset_exif', - takenAt: 'asset', - createdAt: 'asset', - updatedAt: 'asset', - trashedAt: 'asset', - personIds: 'membership', - tagIds: 'membership', - albumIds: 'membership', - checksum: 'asset', - encodedVideoPath: 'asset_file', -}; +const EXIF_ORDER_FIELDS = new Set([SearchOrderField.FileSizeInBytes, SearchOrderField.Rating]); function branchNeedsExifJoin(branch: SearchFilterBranch): boolean { - for (const key of Object.keys(branch) as (keyof typeof FIELD_BACKING)[]) { - if (FIELD_BACKING[key] === 'asset_exif') { + for (const key of Object.keys(branch) as (keyof SearchFilterBranch)[]) { + if (EXIF_FILTER_FIELDS.has(key)) { return true; } } return false; } -const ORDER_BACKING = { - [SearchOrderField.FileCreatedAt]: 'asset', - [SearchOrderField.LocalDateTime]: 'asset', - [SearchOrderField.FileSizeInBytes]: 'asset_exif', - [SearchOrderField.Rating]: 'asset_exif', -} satisfies Record; - function exifJoinRequired(filter: SearchFilter, orderField: SearchOrderField): boolean { - if (ORDER_BACKING[orderField] === 'asset_exif') { - return true; - } - if (branchNeedsExifJoin(filter)) { - return true; - } - return filter.or?.some((branch) => branchNeedsExifJoin(branch)) ?? false; + return ( + EXIF_ORDER_FIELDS.has(orderField) || + branchNeedsExifJoin(filter) || + (filter.or?.some((branch) => branchNeedsExifJoin(branch)) ?? false) + ); } type AssetExpressionBuilder = ExpressionBuilder;