Browse Source

review suggestions, vector migrations on bootstrap

mertalev 1 year ago
parent
commit
4ec6d107b1

+ 1 - 1
server/src/domain/repositories/asset.repository.ts

@@ -1,7 +1,7 @@
+import { SearchExploreItem } from '@app/domain';
 import { AssetEntity, AssetJobStatusEntity, AssetType, ExifEntity } from '@app/infra/entities';
 import { FindOptionsRelations } from 'typeorm';
 import { Paginated, PaginationOptions } from '../domain.util';
-import { SearchExploreItem } from '../repositories';
 
 export type AssetStats = Record<AssetType, number>;
 

+ 1 - 1
server/src/domain/repositories/smart-info.repository.ts

@@ -1,5 +1,5 @@
+import { Embedding, EmbeddingSearch } from '@app/domain';
 import { AssetEntity, SmartInfoEntity } from '@app/infra/entities';
-import { Embedding, EmbeddingSearch } from '../repositories';
 
 export const ISmartInfoRepository = 'ISmartInfoRepository';
 

+ 0 - 1
server/src/domain/search/search.service.ts

@@ -18,7 +18,6 @@ import { SearchResponseDto } from './response-dto';
 
 @Injectable()
 export class SearchService {
-  private timer: NodeJS.Timeout | null = null;
   private logger = new Logger(SearchService.name);
   private configCore: SystemConfigCore;
 

+ 3 - 1
server/src/immich/main.ts

@@ -1,5 +1,5 @@
 import { envName, getLogLevels, isDev, serverVersion } from '@app/domain';
-import { RedisIoAdapter } from '@app/infra';
+import { RedisIoAdapter, runVectorMigrations } from '@app/infra';
 import { Logger } from '@nestjs/common';
 import { NestFactory } from '@nestjs/core';
 import { NestExpressApplication } from '@nestjs/platform-express';
@@ -29,6 +29,8 @@ export async function bootstrap() {
   app.useStaticAssets('www');
   app.use(indexFallback(excludePaths));
 
+  await runVectorMigrations();
+
   const server = await app.listen(port);
   server.requestTimeout = 30 * 60 * 1000;
 

+ 7 - 10
server/src/infra/database.config.ts

@@ -29,8 +29,13 @@ export const databaseConfigVector: PostgresConnectionOptions = {
   migrations: [__dirname + '/migrations/vector/*.{js,ts}'],
 };
 
-export async function initDataSource(): Promise<DataSource> {
-  const dataSource = await new DataSource(databaseConfig).initialize();
+// this export is used by TypeORM commands in package.json#scripts
+export let dataSource = new DataSource(databaseConfig);
+
+export async function runVectorMigrations(): Promise<void> {
+  if (!dataSource.isInitialized) {
+    dataSource = await dataSource.initialize();
+  }
   
   const hasVectorExtension = (await dataSource.query(
     `SELECT * FROM pg_available_extensions WHERE name = 'vectors'`,
@@ -44,12 +49,4 @@ export async function initDataSource(): Promise<DataSource> {
 
     await dataSourceVector.destroy();
   }
-
-  return dataSource;
 }
-
-// this export is used by TypeORM commands in package.json#scripts
-export let dataSource: DataSource;
-(async () => {
-  dataSource = await initDataSource();
-})();

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

@@ -20,9 +20,9 @@ import { ExifEntity } from './exif.entity';
 import { LibraryEntity } from './library.entity';
 import { SharedLinkEntity } from './shared-link.entity';
 import { SmartInfoEntity } from './smart-info.entity';
+import { SmartSearchEntity } from './smart-search.entity';
 import { TagEntity } from './tag.entity';
 import { UserEntity } from './user.entity';
-import { SmartSearchEntity } from '.';
 
 export const ASSET_CHECKSUM_CONSTRAINT = 'UQ_assets_owner_library_checksum';
 

+ 6 - 6
server/src/infra/repositories/smart-info.repository.ts

@@ -89,12 +89,12 @@ export class SmartInfoRepository implements ISmartInfoRepository {
             embedding  vector(${dimSize}) NOT NULL )`);
 
         await manager.query(`
-        CREATE INDEX clip_index ON smart_search
-          USING vectors (embedding cosine_ops) WITH (options = $$
-          [indexing.hnsw]
-          m = 16
-          ef_construction = 300
-          $$)`);
+          CREATE INDEX clip_index ON smart_search
+            USING vectors (embedding cosine_ops) WITH (options = $$
+            [indexing.hnsw]
+            m = 16
+            ef_construction = 300
+            $$)`);
       });
 
       this.curDimSize = dimSize;