reverse table map to sets

pull/28686/head
timonrieger 2026-06-02 17:02:04 +02:00
parent 227c1e6216
commit dcf32fe20c
No known key found for this signature in database
1 changed files with 19 additions and 51 deletions

View File

@ -509,67 +509,35 @@ export function searchAssetBuilderLegacy(kysely: Kysely<DB>, 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<keyof SearchFilterBranch>([
'city',
'state',
'country',
'make',
'model',
'lensModel',
'description',
'rating',
'fileSizeInBytes',
]);
const FIELD_BACKING: Record<keyof Omit<SearchFilterBranch, 'or'>, 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>([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<SearchOrderField, Backing>;
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<DB, 'asset' | 'asset_exif'>;