diff --git a/mobile/lib/modules/archive/providers/archive_asset_provider.dart b/mobile/lib/modules/archive/providers/archive_asset_provider.dart index 26d0b2eea..1f151b922 100644 --- a/mobile/lib/modules/archive/providers/archive_asset_provider.dart +++ b/mobile/lib/modules/archive/providers/archive_asset_provider.dart @@ -13,8 +13,9 @@ final archiveProvider = StreamProvider((ref) async* { final query = ref .watch(dbProvider) .assets + .where() + .ownerIdEqualToAnyChecksum(user.isarId) .filter() - .ownerIdEqualTo(user.isarId) .isArchivedEqualTo(true) .sortByFileCreatedAt(); final settings = ref.watch(appSettingsServiceProvider); diff --git a/mobile/lib/modules/favorite/providers/favorite_provider.dart b/mobile/lib/modules/favorite/providers/favorite_provider.dart index 4ddb73ea6..2439d627f 100644 --- a/mobile/lib/modules/favorite/providers/favorite_provider.dart +++ b/mobile/lib/modules/favorite/providers/favorite_provider.dart @@ -13,8 +13,9 @@ final favoriteAssetsProvider = StreamProvider((ref) async* { final query = ref .watch(dbProvider) .assets + .where() + .ownerIdEqualToAnyChecksum(user.isarId) .filter() - .ownerIdEqualTo(user.isarId) .isFavoriteEqualTo(true) .sortByFileCreatedAt(); final settings = ref.watch(appSettingsServiceProvider); diff --git a/mobile/lib/modules/home/ui/asset_grid/asset_grid_data_structure.dart b/mobile/lib/modules/home/ui/asset_grid/asset_grid_data_structure.dart index d5a0c0d92..9e5f77caf 100644 --- a/mobile/lib/modules/home/ui/asset_grid/asset_grid_data_structure.dart +++ b/mobile/lib/modules/home/ui/asset_grid/asset_grid_data_structure.dart @@ -142,7 +142,7 @@ class RenderList { ) async { final List elements = []; - const pageSize = 500; + const pageSize = 50000; const sectionSize = 60; // divides evenly by 2,3,4,5,6 if (groupBy == GroupAssetsBy.none) { diff --git a/mobile/lib/shared/models/asset.dart b/mobile/lib/shared/models/asset.dart index e8f969a11..cea12e7b6 100644 --- a/mobile/lib/shared/models/asset.dart +++ b/mobile/lib/shared/models/asset.dart @@ -100,12 +100,6 @@ class Asset { /// stores the raw SHA1 bytes as a base64 String /// because Isar cannot sort lists of byte arrays - @Index( - unique: true, - replace: false, - type: IndexType.hash, - composite: [CompositeIndex("ownerId")], - ) String checksum; @Index(unique: false, replace: false, type: IndexType.hash) @@ -114,6 +108,11 @@ class Asset { @Index(unique: false, replace: false, type: IndexType.hash) String? localId; + @Index( + unique: true, + replace: false, + composite: [CompositeIndex("checksum", type: IndexType.hash)], + ) int ownerId; DateTime fileCreatedAt; diff --git a/mobile/lib/shared/models/asset.g.dart b/mobile/lib/shared/models/asset.g.dart index 713c26885..606f9692e 100644 Binary files a/mobile/lib/shared/models/asset.g.dart and b/mobile/lib/shared/models/asset.g.dart differ diff --git a/mobile/lib/shared/providers/asset.provider.dart b/mobile/lib/shared/providers/asset.provider.dart index 27e70298a..a4ded2b53 100644 --- a/mobile/lib/shared/providers/asset.provider.dart +++ b/mobile/lib/shared/providers/asset.provider.dart @@ -186,8 +186,9 @@ final assetsProvider = final query = ref .watch(dbProvider) .assets + .where() + .ownerIdEqualToAnyChecksum(userId) .filter() - .ownerIdEqualTo(userId) .isArchivedEqualTo(false) .sortByFileCreatedAtDesc(); final settings = ref.watch(appSettingsServiceProvider); diff --git a/mobile/lib/shared/services/sync.service.dart b/mobile/lib/shared/services/sync.service.dart index 2580ed952..a11bb8eef 100644 --- a/mobile/lib/shared/services/sync.service.dart +++ b/mobile/lib/shared/services/sync.service.dart @@ -123,7 +123,7 @@ class SyncService { /// Syncs a new asset to the db. Returns `true` if successful Future _syncNewAssetToDb(Asset a) async { final Asset? inDb = - await _db.assets.getByChecksumOwnerId(a.checksum, a.ownerId); + await _db.assets.getByOwnerIdChecksum(a.ownerId, a.checksum); if (inDb != null) { // unify local/remote assets by replacing the // local-only asset in the DB with a local&remote asset @@ -195,8 +195,8 @@ class SyncService { return false; } final List inDb = await _db.assets - .filter() - .ownerIdEqualTo(user.isarId) + .where() + .ownerIdEqualToAnyChecksum(user.isarId) .sortByChecksum() .findAll(); assert(inDb.isSorted(Asset.compareByChecksum), "inDb not sorted!"); @@ -638,9 +638,9 @@ class SyncService { ) async { if (assets.isEmpty) return ([].cast(), [].cast()); - final List inDb = await _db.assets.getAllByChecksumOwnerId( - assets.map((a) => a.checksum).toList(growable: false), + final List inDb = await _db.assets.getAllByOwnerIdChecksum( assets.map((a) => a.ownerId).toInt64List(), + assets.map((a) => a.checksum).toList(growable: false), ); assert(inDb.length == assets.length); final List existing = [], toUpsert = []; @@ -683,9 +683,9 @@ class SyncService { ); // give details on the errors assets.sort(Asset.compareByOwnerChecksum); - final inDb = await _db.assets.getAllByChecksumOwnerId( - assets.map((e) => e.checksum).toList(growable: false), + final inDb = await _db.assets.getAllByOwnerIdChecksum( assets.map((e) => e.ownerId).toInt64List(), + assets.map((e) => e.checksum).toList(growable: false), ); for (int i = 0; i < assets.length; i++) { final Asset a = assets[i];