refresh timing
This commit is contained in:
parent
04bf332b83
commit
9b9e295c22
4 changed files with 22 additions and 13 deletions
|
@ -202,11 +202,11 @@ class SqfliteMetadataDb implements MetadataDb {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Set<AvesEntry>> loadEntries() async {
|
Future<Set<AvesEntry>> loadEntries() async {
|
||||||
final stopwatch = Stopwatch()..start();
|
// final stopwatch = Stopwatch()..start();
|
||||||
final db = await _database;
|
final db = await _database;
|
||||||
final maps = await db.query(entryTable);
|
final maps = await db.query(entryTable);
|
||||||
final entries = maps.map((map) => AvesEntry.fromMap(map)).toSet();
|
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;
|
return entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,11 +18,11 @@ mixin LocationMixin on SourceBase {
|
||||||
List<String> sortedPlaces = List.unmodifiable([]);
|
List<String> sortedPlaces = List.unmodifiable([]);
|
||||||
|
|
||||||
Future<void> loadAddresses() async {
|
Future<void> loadAddresses() async {
|
||||||
final stopwatch = Stopwatch()..start();
|
// final stopwatch = Stopwatch()..start();
|
||||||
final saved = await metadataDb.loadAddresses();
|
final saved = await metadataDb.loadAddresses();
|
||||||
final idMap = entryById;
|
final idMap = entryById;
|
||||||
saved.forEach((metadata) => idMap[metadata.contentId]?.addressDetails = metadata);
|
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();
|
onAddressMetadataChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,21 +49,27 @@ class MediaStoreSource extends CollectionSource {
|
||||||
stateNotifier.value = SourceState.loading;
|
stateNotifier.value = SourceState.loading;
|
||||||
clearEntries();
|
clearEntries();
|
||||||
|
|
||||||
|
debugPrint('$runtimeType refresh ${stopwatch.elapsed} fetch known entries');
|
||||||
final oldEntries = await metadataDb.loadEntries();
|
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 knownDateById = Map.fromEntries(oldEntries.map((entry) => MapEntry(entry.contentId!, entry.dateModifiedSecs!)));
|
||||||
final obsoleteContentIds = (await mediaStoreService.checkObsoleteContentIds(knownDateById.keys.toList())).toSet();
|
final obsoleteContentIds = (await mediaStoreService.checkObsoleteContentIds(knownDateById.keys.toList())).toSet();
|
||||||
oldEntries.removeWhere((entry) => obsoleteContentIds.contains(entry.contentId));
|
oldEntries.removeWhere((entry) => obsoleteContentIds.contains(entry.contentId));
|
||||||
|
|
||||||
// show known entries
|
// show known entries
|
||||||
|
debugPrint('$runtimeType refresh ${stopwatch.elapsed} add known entries');
|
||||||
addEntries(oldEntries);
|
addEntries(oldEntries);
|
||||||
|
debugPrint('$runtimeType refresh ${stopwatch.elapsed} load catalog metadata');
|
||||||
await loadCatalogMetadata();
|
await loadCatalogMetadata();
|
||||||
|
debugPrint('$runtimeType refresh ${stopwatch.elapsed} load address metadata');
|
||||||
await loadAddresses();
|
await loadAddresses();
|
||||||
debugPrint('$runtimeType refresh loaded ${oldEntries.length} known entries, elapsed=${stopwatch.elapsed}');
|
|
||||||
|
|
||||||
// clean up obsolete entries
|
// clean up obsolete entries
|
||||||
|
debugPrint('$runtimeType refresh ${stopwatch.elapsed} remove obsolete entries');
|
||||||
await metadataDb.removeIds(obsoleteContentIds, metadataOnly: false);
|
await metadataDb.removeIds(obsoleteContentIds, metadataOnly: false);
|
||||||
|
|
||||||
// verify paths because some apps move files without updating their `last modified date`
|
// 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 knownPathById = Map.fromEntries(allEntries.map((entry) => MapEntry(entry.contentId!, entry.path)));
|
||||||
final movedContentIds = (await mediaStoreService.checkObsoletePaths(knownPathById)).toSet();
|
final movedContentIds = (await mediaStoreService.checkObsoletePaths(knownPathById)).toSet();
|
||||||
movedContentIds.forEach((contentId) {
|
movedContentIds.forEach((contentId) {
|
||||||
|
@ -72,6 +78,7 @@ class MediaStoreSource extends CollectionSource {
|
||||||
});
|
});
|
||||||
|
|
||||||
// fetch new entries
|
// 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
|
// refresh after the first 10 entries, then after 100 more, then every 1000 entries
|
||||||
var refreshCount = 10;
|
var refreshCount = 10;
|
||||||
const refreshCountMax = 1000;
|
const refreshCountMax = 1000;
|
||||||
|
@ -91,23 +98,25 @@ class MediaStoreSource extends CollectionSource {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onDone: () async {
|
onDone: () async {
|
||||||
addPendingEntries();
|
|
||||||
debugPrint('$runtimeType refresh loaded ${allNewEntries.length} new entries, elapsed=${stopwatch.elapsed}');
|
|
||||||
|
|
||||||
await metadataDb.saveEntries(allNewEntries);
|
|
||||||
|
|
||||||
if (allNewEntries.isNotEmpty) {
|
if (allNewEntries.isNotEmpty) {
|
||||||
|
addPendingEntries();
|
||||||
|
|
||||||
|
debugPrint('$runtimeType refresh ${stopwatch.elapsed} save new entries');
|
||||||
|
await metadataDb.saveEntries(allNewEntries);
|
||||||
|
|
||||||
// new entries include existing entries with obsolete paths
|
// new entries include existing entries with obsolete paths
|
||||||
// so directories may be added, but also removed or simply have their content summary changed
|
// so directories may be added, but also removed or simply have their content summary changed
|
||||||
invalidateAlbumFilterSummary();
|
invalidateAlbumFilterSummary();
|
||||||
updateDirectories();
|
updateDirectories();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debugPrint('$runtimeType refresh ${stopwatch.elapsed} catalog entries');
|
||||||
await catalogEntries();
|
await catalogEntries();
|
||||||
|
debugPrint('$runtimeType refresh ${stopwatch.elapsed} locate entries');
|
||||||
await locateEntries();
|
await locateEntries();
|
||||||
stateNotifier.value = SourceState.ready;
|
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'),
|
onError: (error) => debugPrint('$runtimeType stream error=$error'),
|
||||||
);
|
);
|
||||||
|
|
|
@ -13,11 +13,11 @@ mixin TagMixin on SourceBase {
|
||||||
List<String> sortedTags = List.unmodifiable([]);
|
List<String> sortedTags = List.unmodifiable([]);
|
||||||
|
|
||||||
Future<void> loadCatalogMetadata() async {
|
Future<void> loadCatalogMetadata() async {
|
||||||
final stopwatch = Stopwatch()..start();
|
// final stopwatch = Stopwatch()..start();
|
||||||
final saved = await metadataDb.loadMetadataEntries();
|
final saved = await metadataDb.loadMetadataEntries();
|
||||||
final idMap = entryById;
|
final idMap = entryById;
|
||||||
saved.forEach((metadata) => idMap[metadata.contentId]?.catalogMetadata = metadata);
|
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();
|
onCatalogMetadataChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue