From 641a3baaddada4fd90e11f8a15eea94641d32d4b Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Wed, 30 Jul 2025 23:59:00 +0530 Subject: [PATCH] fix(mobile): add partial index based on library ID to remote assets (#20214) * feat: add libraryId to SyncAssetV1 * add partial index # Conflicts: # mobile/drift_schemas/main/drift_schema_v5.json # mobile/lib/infrastructure/repositories/db.repository.dart # mobile/lib/infrastructure/repositories/db.repository.steps.dart # mobile/test/drift/main/generated/schema_v5.dart * chore: make build * rebase --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- .../drift_schemas/main/drift_schema_v6.json | Bin 0 -> 33396 bytes .../entities/remote_asset.entity.dart | 14 +++++++++++++- .../entities/remote_asset.entity.drift.dart | Bin 54647 -> 57561 bytes .../repositories/db.repository.dart | 11 ++++++++++- .../repositories/db.repository.drift.dart | Bin 11853 -> 11933 bytes .../repositories/db.repository.steps.dart | Bin 71136 -> 82691 bytes .../repositories/sync_stream.repository.dart | 1 + mobile/openapi/lib/model/sync_asset_v1.dart | Bin 7592 -> 7964 bytes mobile/test/drift/main/generated/schema.dart | Bin 886 -> 970 bytes .../test/drift/main/generated/schema_v6.dart | Bin 0 -> 208594 bytes open-api/immich-openapi-specs.json | 5 +++++ server/src/database.ts | 1 + server/src/dtos/sync.dto.ts | 1 + server/src/queries/sync.repository.sql | 5 +++++ server/src/services/job.service.ts | 1 + .../specs/sync/sync-album-asset.spec.ts | 2 ++ .../test/medium/specs/sync/sync-asset.spec.ts | 2 ++ .../specs/sync/sync-partner-asset.spec.ts | 2 ++ 18 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 mobile/drift_schemas/main/drift_schema_v6.json create mode 100644 mobile/test/drift/main/generated/schema_v6.dart diff --git a/mobile/drift_schemas/main/drift_schema_v6.json b/mobile/drift_schemas/main/drift_schema_v6.json new file mode 100644 index 0000000000000000000000000000000000000000..adb2484006cc6f1ba5360187b3b0d1e338cc253a GIT binary patch literal 33396 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 D%d;>J literal 0 HcmV?d00001 diff --git a/mobile/lib/infrastructure/entities/remote_asset.entity.dart b/mobile/lib/infrastructure/entities/remote_asset.entity.dart index 7ee2e76ff..ecc0aa3d7 100644 --- a/mobile/lib/infrastructure/entities/remote_asset.entity.dart +++ b/mobile/lib/infrastructure/entities/remote_asset.entity.dart @@ -5,7 +5,17 @@ import 'package:immich_mobile/infrastructure/entities/user.entity.dart'; import 'package:immich_mobile/infrastructure/utils/asset.mixin.dart'; import 'package:immich_mobile/infrastructure/utils/drift_default.mixin.dart'; -@TableIndex(name: 'UQ_remote_asset_owner_checksum', columns: {#checksum, #ownerId}, unique: true) +@TableIndex(name: 'idx_remote_asset_owner_checksum', columns: {#ownerId, #checksum}) +@TableIndex.sql(''' +CREATE UNIQUE INDEX IF NOT EXISTS UQ_remote_assets_owner_checksum +ON remote_asset_entity (owner_id, checksum) +WHERE (library_id IS NULL); +''') +@TableIndex.sql(''' +CREATE UNIQUE INDEX IF NOT EXISTS UQ_remote_assets_owner_library_checksum +ON remote_asset_entity (owner_id, library_id, checksum) +WHERE (library_id IS NOT NULL); +''') @TableIndex(name: 'idx_remote_asset_checksum', columns: {#checksum}) class RemoteAssetEntity extends Table with DriftDefaultsMixin, AssetEntityMixin { const RemoteAssetEntity(); @@ -30,6 +40,8 @@ class RemoteAssetEntity extends Table with DriftDefaultsMixin, AssetEntityMixin TextColumn get stackId => text().nullable()(); + TextColumn get libraryId => text().nullable()(); + @override Set get primaryKey => {id}; } diff --git a/mobile/lib/infrastructure/entities/remote_asset.entity.drift.dart b/mobile/lib/infrastructure/entities/remote_asset.entity.drift.dart index 6bd416b259b971af6efe202cae74ee0e6dc98ebc..9681d1e75d8179a05e5bb21ce8071a39cf9782f4 100644 GIT binary patch delta 1557 zcmaJ>S!fec6s4IgHnnMtiRl_&Yc!3fu`c+bq+^AOgV9*y)C~z~XKY8)L^D%u!S%<2 zs2^TMP^eW9LBys!QE{uHRD{+AEm-uUUkZZSeyIrRq{*91tnK{FTkbvgob&E`->*@_ zkEz5@Eu1r04H2O+9*%e5G3_%=)%xKbjEK4wk6Y(ytK~&Ro^0%6>cNFw-@ayTn*@yNdwo&QrSS z2$8wmYa9eZctu?gq?^O&Ty#QhoWtfh+8?CWK$^?1DjCY7ACkUh}im2d^|1` zP6g^3Dz{C%-W1|9;183RJ8-iC&Qn5Yhmnd5jMILq2IykY3=<-a4>LB{|9 delta 302 zcmV+}0nz^1!2|cI1F-o7vm6D#0<-=H(-5<08KDl7Xc-feY(5Z^i5V@EY(5aP1Su2^ zvzRu#4YQj>sREPVP7SknM@s~gn?xhCEKH38v)@jJ36n_P4U=%_yYwgI|?8mlYylkv+b<=1+zJ` zMFW$u+ZK}=-X62xwkZL#7r2T8v(UTO0+W!D7nAL~3A60J3j?zy!s-IEJ;iwgv)st2 z1GBo!b^^0f&nW}5snU1{lSY~ole&QolTfohlkK|+v+LUI0+X@Z7Lyv@E|W#zlz{h! Awg3PC diff --git a/mobile/lib/infrastructure/repositories/db.repository.dart b/mobile/lib/infrastructure/repositories/db.repository.dart index 353cabf31..0458a5b25 100644 --- a/mobile/lib/infrastructure/repositories/db.repository.dart +++ b/mobile/lib/infrastructure/repositories/db.repository.dart @@ -66,7 +66,7 @@ class Drift extends $Drift implements IDatabaseRepository { : super(executor ?? driftDatabase(name: 'immich', native: const DriftNativeOptions(shareAcrossIsolates: true))); @override - int get schemaVersion => 5; + int get schemaVersion => 6; @override MigrationStrategy get migration => MigrationStrategy( @@ -103,6 +103,15 @@ class Drift extends $Drift implements IDatabaseRepository { ), ); }, + from5To6: (m, v6) async { + // Drops the (checksum, ownerId) and adds it back as (ownerId, checksum) + await customStatement('DROP INDEX IF EXISTS UQ_remote_asset_owner_checksum'); + await m.create(v6.idxRemoteAssetOwnerChecksum); + // Adds libraryId to remote_asset_entity + await m.addColumn(v6.remoteAssetEntity, v6.remoteAssetEntity.libraryId); + await m.create(v6.uQRemoteAssetsOwnerChecksum); + await m.create(v6.uQRemoteAssetsOwnerLibraryChecksum); + }, ), ); diff --git a/mobile/lib/infrastructure/repositories/db.repository.drift.dart b/mobile/lib/infrastructure/repositories/db.repository.drift.dart index 296b87900ed54e08d58f66622c0d5848a5c9cd6f..2b7203eb464741e6ac6e0db1f4d46e31c916f325 100644 GIT binary patch delta 49 zcmX>bGdFg_O#aDx`1vL;;}@Gelb@HZ*uOk4wP64jMlvq@`c{TqcIRN36 B66XK_ delta 20 ccmbOmdp2gnO#aDx`FSTV=NH?|BQQ}80A6R diff --git a/mobile/lib/infrastructure/repositories/db.repository.steps.dart b/mobile/lib/infrastructure/repositories/db.repository.steps.dart index 8129bba00c1230117307ffb8b8ea081d9c62b08e..32b309881e89782f38beeaa09333de5780b81437 100644 GIT binary patch delta 650 zcmaE`nx(mowP6b*FaP8%FN7J*COghl1CsAw=mN{Z$gvj@CZ)+yI6K|+;?#x%{N(} zN0KWaWI=ppijKnM`HS^|R-ap}2P7N5Y0G)KDfsz^D7Z#=28RSIga*bJrRL_Bq{b%} z7pImKPgda3&_U=<&PYwpE-ua0R0#KQ4RY1Ufw&oHvVv!@f?ueQ&*X{R>Zl%?yq8;( zzc?OZ2vo!5z{L`i=Y8YV!EZa7rVmS$Y!Gfi*sY^Lz+FK9LER>`neV%#5HMs5T~wG1 z%_k?;r)&+u$PRPuLl0><+rUt5a&E60qs8Qn zl@4&xk5#^tidnYv@iT@nPG2a(XeMN)Pz-ccZlb0_T2X$kX-K}=_5=Y&eP*`g#Nt#1 z)9Lqx808twrvDdWOke@YPInY!RAw~W-Y(3z4yO^*jYS!k%PGK(w1TsAxD*sLb+|OG Fxd6ZE>dOEC delta 41 xcmZo}V|}oirC|#rFaP#)R*a#H+jDIgb(yyZI4~|_obKSnxRgy(hfC9%3jiiy3>N?Z diff --git a/mobile/lib/infrastructure/repositories/sync_stream.repository.dart b/mobile/lib/infrastructure/repositories/sync_stream.repository.dart index 2eefa298f..52ffaabca 100644 --- a/mobile/lib/infrastructure/repositories/sync_stream.repository.dart +++ b/mobile/lib/infrastructure/repositories/sync_stream.repository.dart @@ -121,6 +121,7 @@ class SyncStreamRepository extends DriftDatabaseRepository { visibility: Value(asset.visibility.toAssetVisibility()), livePhotoVideoId: Value(asset.livePhotoVideoId), stackId: Value(asset.stackId), + libraryId: Value(asset.libraryId), ); batch.insert( diff --git a/mobile/openapi/lib/model/sync_asset_v1.dart b/mobile/openapi/lib/model/sync_asset_v1.dart index 4c42d08a5fc9ff53697ecdfb29d146e5a2499f48..f0d5097ea4ffc31aec3982d8808c4f95ef7e21bc 100644 GIT binary patch delta 222 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 { duration: '0:10:00.00000', livePhotoVideoId: null, stackId: null, + libraryId: null, }); const { album } = await ctx.newAlbum({ ownerId: user2.id }); await ctx.newAlbumAsset({ albumId: album.id, assetId: asset.id }); @@ -64,6 +65,7 @@ describe(SyncRequestType.AlbumAssetsV1, () => { duration: asset.duration, livePhotoVideoId: asset.livePhotoVideoId, stackId: asset.stackId, + libraryId: asset.libraryId, }, type: SyncEntityType.AlbumAssetV1, }, diff --git a/server/test/medium/specs/sync/sync-asset.spec.ts b/server/test/medium/specs/sync/sync-asset.spec.ts index 52d6bcb52..ce83eed98 100644 --- a/server/test/medium/specs/sync/sync-asset.spec.ts +++ b/server/test/medium/specs/sync/sync-asset.spec.ts @@ -36,6 +36,7 @@ describe(SyncEntityType.AssetV1, () => { localDateTime: date, deletedAt: null, duration: '0:10:00.00000', + libraryId: null, }); const response = await ctx.syncStream(auth, [SyncRequestType.AssetsV1]); @@ -59,6 +60,7 @@ describe(SyncEntityType.AssetV1, () => { duration: asset.duration, stackId: null, livePhotoVideoId: null, + libraryId: asset.libraryId, }, type: 'AssetV1', }, diff --git a/server/test/medium/specs/sync/sync-partner-asset.spec.ts b/server/test/medium/specs/sync/sync-partner-asset.spec.ts index 2daa750bf..e9dc7403b 100644 --- a/server/test/medium/specs/sync/sync-partner-asset.spec.ts +++ b/server/test/medium/specs/sync/sync-partner-asset.spec.ts @@ -40,6 +40,7 @@ describe(SyncRequestType.PartnerAssetsV1, () => { localDateTime: date, deletedAt: null, duration: '0:10:00.00000', + libraryId: null, }); await ctx.newPartner({ sharedById: user2.id, sharedWithId: auth.user.id }); @@ -65,6 +66,7 @@ describe(SyncRequestType.PartnerAssetsV1, () => { duration: asset.duration, stackId: null, livePhotoVideoId: null, + libraryId: asset.libraryId, }, type: SyncEntityType.PartnerAssetV1, },