Improve loading of local folders

This commit is contained in:
Vishnu Mohandas 2021-04-19 22:38:12 +05:30
parent edfde94ca6
commit 3c2cb3d551
2 changed files with 32 additions and 8 deletions

View file

@ -221,6 +221,7 @@ class FilesDB {
table,
where: '$columnIsDeleted = 0',
orderBy: '$columnCreationTime DESC',
limit: 100,
);
return _convertToFiles(results);
}
@ -642,6 +643,24 @@ class FilesDB {
return result;
}
Future<List<File>> getLatestLocalFiles() async {
final db = await instance.database;
final rows = await db.rawQuery('''
SELECT $table.*
FROM $table
INNER JOIN
(
SELECT $columnDeviceFolder, MAX($columnCreationTime) AS max_creation_time
FROM $table
GROUP BY $columnDeviceFolder
) latest_files
ON $table.$columnDeviceFolder = latest_files.$columnDeviceFolder
AND $table.$columnCreationTime = latest_files.max_creation_time
AND $table.$columnLocalID IS NOT NULL;
''');
return _convertToFiles(rows);
}
Future<File> getLatestFileInCollection(int collectionID) async {
final db = await instance.database;
final rows = await db.query(

View file

@ -44,6 +44,7 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget>
void initState() {
_localFilesSubscription =
Bus.instance.on<LocalPhotosUpdatedEvent>().listen((event) {
_logger.info("Files updated");
setState(() {});
});
_collectionUpdatesSubscription =
@ -63,6 +64,7 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget>
@override
Widget build(BuildContext context) {
super.build(context);
_logger.info("Building ");
return FutureBuilder<CollectionItems>(
future: _getCollections(),
builder: (context, snapshot) {
@ -78,15 +80,14 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget>
}
Future<CollectionItems> _getCollections() async {
var startTime = DateTime.now();
final filesDB = FilesDB.instance;
final collectionsService = CollectionsService.instance;
final userID = Configuration.instance.getUserID();
final folders = List<DeviceFolder>();
final paths = await filesDB.getLocalPaths();
for (final path in paths) {
final folderName = p.basename(path);
folders.add(DeviceFolder(
folderName, path, await filesDB.getLastCreatedFileInPath(path)));
final List<DeviceFolder> folders = [];
final latestLocalFiles = await filesDB.getLatestLocalFiles();
for (final file in latestLocalFiles) {
folders.add(DeviceFolder(file.deviceFolder, file.deviceFolder, file));
}
folders.sort((first, second) =>
second.thumbnail.creationTime.compareTo(first.thumbnail.creationTime));
@ -94,8 +95,7 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget>
final collections = collectionsService.getCollections();
for (final c in collections) {
if (c.owner.id == userID) {
final thumbnail =
await FilesDB.instance.getLatestFileInCollection(c.id);
final thumbnail = await filesDB.getLatestFileInCollection(c.id);
if (thumbnail == null) {
continue;
}
@ -108,6 +108,11 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget>
.compareTo(first.thumbnail.updationTime);
});
var endTime = DateTime.now();
var duration = Duration(
microseconds:
endTime.microsecondsSinceEpoch - startTime.microsecondsSinceEpoch);
_logger.info("Total time taken: " + duration.inMilliseconds.toString());
return CollectionItems(folders, collectionsWithThumbnail);
}