Przeglądaj źródła

face optimizations

mertalev 1 rok temu
rodzic
commit
c1175be1d0

+ 1 - 1
server/src/infra/entities/asset-face.entity.ts

@@ -14,7 +14,7 @@ export class AssetFaceEntity {
   @Column({ nullable: true, type: 'uuid' })
   personId!: string | null;
 
-  @Column({ type: 'float4', array: true })
+  @Column({ type: 'float4', array: true, select: false })
   embedding!: number[];
 
   @Column({ default: 0, type: 'int' })

+ 1 - 0
server/src/infra/entities/smart-search.entity.ts

@@ -13,6 +13,7 @@ export class SmartSearchEntity {
   @Column({
     type: 'float4',
     array: true,
+    select: false,
   })
   embedding!: number[];
 }

+ 11 - 3
server/src/infra/repositories/person.repository.ts

@@ -15,11 +15,17 @@ import { asVector } from '../infra.utils';
 import { dataSource } from '..';
 
 export class PersonRepository implements IPersonRepository {
+  private readonly faceColumns: string[];
   constructor(
     @InjectRepository(AssetEntity) private assetRepository: Repository<AssetEntity>,
     @InjectRepository(PersonEntity) private personRepository: Repository<PersonEntity>,
     @InjectRepository(AssetFaceEntity) private assetFaceRepository: Repository<AssetFaceEntity>,
-  ) {}
+  ) {
+    this.faceColumns = this.assetFaceRepository.manager.connection
+      .getMetadata(AssetFaceEntity).ownColumns
+      .map((column) => column.propertyName)
+      .filter((propertyName) => propertyName !== 'embedding');
+  }
 
   /**
    * Before reassigning faces, delete potential key violations
@@ -245,12 +251,14 @@ export class PersonRepository implements IPersonRepository {
   async searchByEmbedding({ ownerId, embedding, numResults, maxDistance }: EmbeddingSearch): Promise<AssetFaceEntity[]> {
     const cte = this.assetFaceRepository.createQueryBuilder('faces')
       .select('1 + (faces.embedding <=> :embedding)', 'distance')
-      .leftJoinAndSelect('faces.asset', 'asset')
+      .innerJoin('faces.asset', 'asset')
       .where('asset.ownerId = :ownerId')
       .orderBy(`faces.embedding <=> :embedding`)
       .setParameters({ownerId, embedding: asVector(embedding)})
       .limit(numResults);
-    
+
+    this.faceColumns.forEach((col) => cte.addSelect(`faces.${col} AS "${col}"`));
+
     const res = await dataSource.createQueryBuilder()
       .select('res.*')
       .addCommonTableExpression(cte, 'cte')