mirror of
				https://github.com/immich-app/immich.git
				synced 2025-11-03 19:29:32 -05:00 
			
		
		
		
	fix(server): select asset face columns explicitly (#5564)
* select columns explicitly * updated sql * formatting
This commit is contained in:
		
							parent
							
								
									2f4ee622ab
								
							
						
					
					
						commit
						2553c54b26
					
				@ -11,13 +11,19 @@ import { asVector, isValidInteger } from '../infra.utils';
 | 
				
			|||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
export class SmartInfoRepository implements ISmartInfoRepository {
 | 
					export class SmartInfoRepository implements ISmartInfoRepository {
 | 
				
			||||||
  private logger = new Logger(SmartInfoRepository.name);
 | 
					  private logger = new Logger(SmartInfoRepository.name);
 | 
				
			||||||
 | 
					  private faceColumns: string[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor(
 | 
					  constructor(
 | 
				
			||||||
    @InjectRepository(SmartInfoEntity) private repository: Repository<SmartInfoEntity>,
 | 
					    @InjectRepository(SmartInfoEntity) private repository: Repository<SmartInfoEntity>,
 | 
				
			||||||
    @InjectRepository(AssetEntity) private assetRepository: Repository<AssetEntity>,
 | 
					    @InjectRepository(AssetEntity) private assetRepository: Repository<AssetEntity>,
 | 
				
			||||||
    @InjectRepository(AssetFaceEntity) private assetFaceRepository: Repository<AssetFaceEntity>,
 | 
					    @InjectRepository(AssetFaceEntity) private assetFaceRepository: Repository<AssetFaceEntity>,
 | 
				
			||||||
    @InjectRepository(SmartSearchEntity) private smartSearchRepository: Repository<SmartSearchEntity>,
 | 
					    @InjectRepository(SmartSearchEntity) private smartSearchRepository: Repository<SmartSearchEntity>,
 | 
				
			||||||
  ) {}
 | 
					  ) {
 | 
				
			||||||
 | 
					    this.faceColumns = this.assetFaceRepository.manager.connection
 | 
				
			||||||
 | 
					      .getMetadata(AssetFaceEntity)
 | 
				
			||||||
 | 
					      .ownColumns.map((column) => column.propertyName)
 | 
				
			||||||
 | 
					      .filter((propertyName) => propertyName !== 'embedding');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async init(modelName: string): Promise<void> {
 | 
					  async init(modelName: string): Promise<void> {
 | 
				
			||||||
    const { dimSize } = getCLIPModelInfo(modelName);
 | 
					    const { dimSize } = getCLIPModelInfo(modelName);
 | 
				
			||||||
@ -79,13 +85,15 @@ export class SmartInfoRepository implements ISmartInfoRepository {
 | 
				
			|||||||
      await manager.query(`SET LOCAL vectors.k = '${numResults}'`);
 | 
					      await manager.query(`SET LOCAL vectors.k = '${numResults}'`);
 | 
				
			||||||
      const cte = manager
 | 
					      const cte = manager
 | 
				
			||||||
        .createQueryBuilder(AssetFaceEntity, 'faces')
 | 
					        .createQueryBuilder(AssetFaceEntity, 'faces')
 | 
				
			||||||
        .addSelect('1 + (faces.embedding <=> :embedding)', 'distance')
 | 
					        .select('1 + (faces.embedding <=> :embedding)', 'distance')
 | 
				
			||||||
        .innerJoin('faces.asset', 'asset')
 | 
					        .innerJoin('faces.asset', 'asset')
 | 
				
			||||||
        .where('asset.ownerId = :ownerId')
 | 
					        .where('asset.ownerId = :ownerId')
 | 
				
			||||||
        .orderBy(`faces.embedding <=> :embedding`)
 | 
					        .orderBy(`faces.embedding <=> :embedding`)
 | 
				
			||||||
        .setParameters({ ownerId, embedding: asVector(embedding) })
 | 
					        .setParameters({ ownerId, embedding: asVector(embedding) })
 | 
				
			||||||
        .limit(numResults);
 | 
					        .limit(numResults);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.faceColumns.forEach((col) => cte.addSelect(`faces.${col}`, col));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      results = await manager
 | 
					      results = await manager
 | 
				
			||||||
        .createQueryBuilder()
 | 
					        .createQueryBuilder()
 | 
				
			||||||
        .select('res.*')
 | 
					        .select('res.*')
 | 
				
			||||||
 | 
				
			|||||||
@ -81,15 +81,15 @@ SET
 | 
				
			|||||||
WITH
 | 
					WITH
 | 
				
			||||||
  "cte" AS (
 | 
					  "cte" AS (
 | 
				
			||||||
    SELECT
 | 
					    SELECT
 | 
				
			||||||
      "faces"."id" AS "faces_id",
 | 
					      "faces"."id" AS "id",
 | 
				
			||||||
      "faces"."assetId" AS "faces_assetId",
 | 
					      "faces"."assetId" AS "assetId",
 | 
				
			||||||
      "faces"."personId" AS "faces_personId",
 | 
					      "faces"."personId" AS "personId",
 | 
				
			||||||
      "faces"."imageWidth" AS "faces_imageWidth",
 | 
					      "faces"."imageWidth" AS "imageWidth",
 | 
				
			||||||
      "faces"."imageHeight" AS "faces_imageHeight",
 | 
					      "faces"."imageHeight" AS "imageHeight",
 | 
				
			||||||
      "faces"."boundingBoxX1" AS "faces_boundingBoxX1",
 | 
					      "faces"."boundingBoxX1" AS "boundingBoxX1",
 | 
				
			||||||
      "faces"."boundingBoxY1" AS "faces_boundingBoxY1",
 | 
					      "faces"."boundingBoxY1" AS "boundingBoxY1",
 | 
				
			||||||
      "faces"."boundingBoxX2" AS "faces_boundingBoxX2",
 | 
					      "faces"."boundingBoxX2" AS "boundingBoxX2",
 | 
				
			||||||
      "faces"."boundingBoxY2" AS "faces_boundingBoxY2",
 | 
					      "faces"."boundingBoxY2" AS "boundingBoxY2",
 | 
				
			||||||
      1 + ("faces"."embedding" <= > $1) AS "distance"
 | 
					      1 + ("faces"."embedding" <= > $1) AS "distance"
 | 
				
			||||||
    FROM
 | 
					    FROM
 | 
				
			||||||
      "asset_faces" "faces"
 | 
					      "asset_faces" "faces"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user