1
0
mirror of https://github.com/immich-app/immich.git synced 2024-11-24 08:52:28 +02:00

refactor(mobile): assert lists are sorted for diffing (#13180)

This commit is contained in:
Fynn Petersen-Frey 2024-10-05 03:02:34 +02:00 committed by GitHub
parent 6bbaba7866
commit 0f3b8b67fe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 20 additions and 18 deletions

View File

@ -138,7 +138,6 @@ class SyncService {
Future<bool> _syncUsersFromServer(List<User> users) async { Future<bool> _syncUsersFromServer(List<User> users) async {
users.sortBy((u) => u.id); users.sortBy((u) => u.id);
final dbUsers = await _userRepository.getAll(sortBy: UserSort.id); final dbUsers = await _userRepository.getAll(sortBy: UserSort.id);
assert(dbUsers.isSortedBy((u) => u.id), "dbUsers not sorted!");
final List<int> toDelete = []; final List<int> toDelete = [];
final List<User> toUpsert = []; final List<User> toUpsert = [];
final changes = diffSortedListsSync( final changes = diffSortedListsSync(
@ -322,8 +321,6 @@ class SyncService {
ownerId: isShared ? null : me.isarId, ownerId: isShared ? null : me.isarId,
sortBy: AlbumSort.remoteId, sortBy: AlbumSort.remoteId,
); );
assert(dbAlbums.isSortedBy((e) => e.remoteId!), "dbAlbums not sorted!");
final List<Asset> toDelete = []; final List<Asset> toDelete = [];
final List<Asset> existing = []; final List<Asset> existing = [];
@ -512,7 +509,6 @@ class SyncService {
await _albumRepository.getAll(remote: false, sortBy: AlbumSort.localId); await _albumRepository.getAll(remote: false, sortBy: AlbumSort.localId);
final List<Asset> deleteCandidates = []; final List<Asset> deleteCandidates = [];
final List<Asset> existing = []; final List<Asset> existing = [];
assert(inDb.isSorted((a, b) => a.localId!.compareTo(b.localId!)), "sort!");
final bool anyChanges = await diffSortedLists( final bool anyChanges = await diffSortedLists(
onDevice, onDevice,
inDb, inDb,

View File

@ -1,16 +1,20 @@
import 'dart:async'; import 'dart:async';
import 'package:collection/collection.dart';
/// Efficiently compares two sorted lists in O(n), calling the given callback /// Efficiently compares two sorted lists in O(n), calling the given callback
/// for each item. /// for each item.
/// Return `true` if there are any differences found, else `false` /// Return `true` if there are any differences found, else `false`
Future<bool> diffSortedLists<A, B>( Future<bool> diffSortedLists<T>(
List<A> la, List<T> la,
List<B> lb, { List<T> lb, {
required int Function(A a, B b) compare, required int Function(T a, T b) compare,
required FutureOr<bool> Function(A a, B b) both, required FutureOr<bool> Function(T a, T b) both,
required FutureOr<void> Function(A a) onlyFirst, required FutureOr<void> Function(T a) onlyFirst,
required FutureOr<void> Function(B b) onlySecond, required FutureOr<void> Function(T b) onlySecond,
}) async { }) async {
assert(la.isSorted(compare), "first argument must be sorted");
assert(lb.isSorted(compare), "second argument must be sorted");
bool diff = false; bool diff = false;
int i = 0, j = 0; int i = 0, j = 0;
for (; i < la.length && j < lb.length;) { for (; i < la.length && j < lb.length;) {
@ -38,14 +42,16 @@ Future<bool> diffSortedLists<A, B>(
/// Efficiently compares two sorted lists in O(n), calling the given callback /// Efficiently compares two sorted lists in O(n), calling the given callback
/// for each item. /// for each item.
/// Return `true` if there are any differences found, else `false` /// Return `true` if there are any differences found, else `false`
bool diffSortedListsSync<A, B>( bool diffSortedListsSync<T>(
List<A> la, List<T> la,
List<B> lb, { List<T> lb, {
required int Function(A a, B b) compare, required int Function(T a, T b) compare,
required bool Function(A a, B b) both, required bool Function(T a, T b) both,
required void Function(A a) onlyFirst, required void Function(T a) onlyFirst,
required void Function(B b) onlySecond, required void Function(T b) onlySecond,
}) { }) {
assert(la.isSorted(compare), "first argument must be sorted");
assert(lb.isSorted(compare), "second argument must be sorted");
bool diff = false; bool diff = false;
int i = 0, j = 0; int i = 0, j = 0;
for (; i < la.length && j < lb.length;) { for (; i < la.length && j < lb.length;) {