diff --git a/lib/model/metadata_db.dart b/lib/model/metadata_db.dart index defabddf4..10ded516b 100644 --- a/lib/model/metadata_db.dart +++ b/lib/model/metadata_db.dart @@ -202,11 +202,11 @@ class SqfliteMetadataDb implements MetadataDb { @override Future> loadEntries() async { - final stopwatch = Stopwatch()..start(); + // final stopwatch = Stopwatch()..start(); final db = await _database; final maps = await db.query(entryTable); final entries = maps.map((map) => AvesEntry.fromMap(map)).toSet(); - debugPrint('$runtimeType loadEntries complete in ${stopwatch.elapsed.inMilliseconds}ms for ${entries.length} entries'); + // debugPrint('$runtimeType loadEntries complete in ${stopwatch.elapsed.inMilliseconds}ms for ${entries.length} entries'); return entries; } diff --git a/lib/model/source/location.dart b/lib/model/source/location.dart index a45564588..046b45d12 100644 --- a/lib/model/source/location.dart +++ b/lib/model/source/location.dart @@ -18,11 +18,11 @@ mixin LocationMixin on SourceBase { List sortedPlaces = List.unmodifiable([]); Future loadAddresses() async { - final stopwatch = Stopwatch()..start(); + // final stopwatch = Stopwatch()..start(); final saved = await metadataDb.loadAddresses(); final idMap = entryById; saved.forEach((metadata) => idMap[metadata.contentId]?.addressDetails = metadata); - debugPrint('$runtimeType loadAddresses complete in ${stopwatch.elapsed.inMilliseconds}ms for ${saved.length} entries'); + // debugPrint('$runtimeType loadAddresses complete in ${stopwatch.elapsed.inMilliseconds}ms for ${saved.length} entries'); onAddressMetadataChanged(); } diff --git a/lib/model/source/media_store_source.dart b/lib/model/source/media_store_source.dart index 0fcf68337..5dc585d77 100644 --- a/lib/model/source/media_store_source.dart +++ b/lib/model/source/media_store_source.dart @@ -49,21 +49,27 @@ class MediaStoreSource extends CollectionSource { stateNotifier.value = SourceState.loading; clearEntries(); + debugPrint('$runtimeType refresh ${stopwatch.elapsed} fetch known entries'); final oldEntries = await metadataDb.loadEntries(); + debugPrint('$runtimeType refresh ${stopwatch.elapsed} check obsolete entries'); final knownDateById = Map.fromEntries(oldEntries.map((entry) => MapEntry(entry.contentId!, entry.dateModifiedSecs!))); final obsoleteContentIds = (await mediaStoreService.checkObsoleteContentIds(knownDateById.keys.toList())).toSet(); oldEntries.removeWhere((entry) => obsoleteContentIds.contains(entry.contentId)); // show known entries + debugPrint('$runtimeType refresh ${stopwatch.elapsed} add known entries'); addEntries(oldEntries); + debugPrint('$runtimeType refresh ${stopwatch.elapsed} load catalog metadata'); await loadCatalogMetadata(); + debugPrint('$runtimeType refresh ${stopwatch.elapsed} load address metadata'); await loadAddresses(); - debugPrint('$runtimeType refresh loaded ${oldEntries.length} known entries, elapsed=${stopwatch.elapsed}'); // clean up obsolete entries + debugPrint('$runtimeType refresh ${stopwatch.elapsed} remove obsolete entries'); await metadataDb.removeIds(obsoleteContentIds, metadataOnly: false); // verify paths because some apps move files without updating their `last modified date` + debugPrint('$runtimeType refresh ${stopwatch.elapsed} check obsolete paths'); final knownPathById = Map.fromEntries(allEntries.map((entry) => MapEntry(entry.contentId!, entry.path))); final movedContentIds = (await mediaStoreService.checkObsoletePaths(knownPathById)).toSet(); movedContentIds.forEach((contentId) { @@ -72,6 +78,7 @@ class MediaStoreSource extends CollectionSource { }); // fetch new entries + debugPrint('$runtimeType refresh ${stopwatch.elapsed} fetch new entries'); // refresh after the first 10 entries, then after 100 more, then every 1000 entries var refreshCount = 10; const refreshCountMax = 1000; @@ -91,23 +98,25 @@ class MediaStoreSource extends CollectionSource { } }, onDone: () async { - addPendingEntries(); - debugPrint('$runtimeType refresh loaded ${allNewEntries.length} new entries, elapsed=${stopwatch.elapsed}'); - - await metadataDb.saveEntries(allNewEntries); - if (allNewEntries.isNotEmpty) { + addPendingEntries(); + + debugPrint('$runtimeType refresh ${stopwatch.elapsed} save new entries'); + await metadataDb.saveEntries(allNewEntries); + // new entries include existing entries with obsolete paths // so directories may be added, but also removed or simply have their content summary changed invalidateAlbumFilterSummary(); updateDirectories(); } + debugPrint('$runtimeType refresh ${stopwatch.elapsed} catalog entries'); await catalogEntries(); + debugPrint('$runtimeType refresh ${stopwatch.elapsed} locate entries'); await locateEntries(); stateNotifier.value = SourceState.ready; - debugPrint('$runtimeType refresh done, elapsed=${stopwatch.elapsed}'); + debugPrint('$runtimeType refresh ${stopwatch.elapsed} done for ${oldEntries.length} known, ${allNewEntries.length} new, ${obsoleteContentIds.length} obsolete'); }, onError: (error) => debugPrint('$runtimeType stream error=$error'), ); diff --git a/lib/model/source/tag.dart b/lib/model/source/tag.dart index a08575ef0..8de09605f 100644 --- a/lib/model/source/tag.dart +++ b/lib/model/source/tag.dart @@ -13,11 +13,11 @@ mixin TagMixin on SourceBase { List sortedTags = List.unmodifiable([]); Future loadCatalogMetadata() async { - final stopwatch = Stopwatch()..start(); + // final stopwatch = Stopwatch()..start(); final saved = await metadataDb.loadMetadataEntries(); final idMap = entryById; saved.forEach((metadata) => idMap[metadata.contentId]?.catalogMetadata = metadata); - debugPrint('$runtimeType loadCatalogMetadata complete in ${stopwatch.elapsed.inMilliseconds}ms for ${saved.length} entries'); + // debugPrint('$runtimeType loadCatalogMetadata complete in ${stopwatch.elapsed.inMilliseconds}ms for ${saved.length} entries'); onCatalogMetadataChanged(); }