소스 검색

Reduce number of DB reads during diff fetch

Vishnu Mohandas 4 년 전
부모
커밋
60555f35cf
2개의 변경된 파일38개의 추가작업 그리고 5개의 파일을 삭제
  1. 18 0
      lib/db/files_db.dart
  2. 20 5
      lib/utils/diff_fetcher.dart

+ 18 - 0
lib/db/files_db.dart

@@ -175,6 +175,24 @@ class FilesDB {
     return _convertToFiles(results)[0];
   }
 
+  Future<Set<int>> getUploadedFileIDs(int collectionID) async {
+    final db = await instance.database;
+    final results = await db.query(
+      table,
+      columns: [columnUploadedFileID],
+      where: '$columnCollectionID = ?',
+      whereArgs: [
+        collectionID,
+      ],
+    );
+    final ids = Set<int>();
+    ;
+    for (final result in results) {
+      ids.add(result[columnUploadedFileID]);
+    }
+    return ids;
+  }
+
   Future<List<File>> getDeduplicatedFiles() async {
     _logger.info("Getting files for collection");
     final db = await instance.database;

+ 20 - 5
lib/utils/diff_fetcher.dart

@@ -37,6 +37,9 @@ class DiffFetcher {
           if (response != null) {
             Bus.instance.fire(RemoteSyncEvent(true));
             final diff = response.data["diff"] as List;
+            final startTime = DateTime.now();
+            final existingFiles =
+                await FilesDB.instance.getUploadedFileIDs(collectionID);
             for (final item in diff) {
               final file = File();
               file.uploadedFileID = item["id"];
@@ -50,11 +53,13 @@ class DiffFetcher {
                 continue;
               }
               file.updationTime = item["updationTime"];
-              final existingFile = await FilesDB.instance
-                  .getUploadedFile(file.uploadedFileID, file.collectionID);
-              if (existingFile != null &&
-                  existingFile.updationTime == file.updationTime) {
-                continue;
+              if (existingFiles.contains(file.uploadedFileID)) {
+                final existingFile = await FilesDB.instance
+                    .getUploadedFile(file.uploadedFileID, file.collectionID);
+                if (existingFile != null &&
+                    existingFile.updationTime == file.updationTime) {
+                  continue;
+                }
               }
               file.ownerID = item["ownerID"];
               file.encryptedKey = item["encryptedKey"];
@@ -74,6 +79,16 @@ class DiffFetcher {
               file.applyMetadata(metadata);
               files.add(file);
             }
+
+            final endTime = DateTime.now();
+            _logger.info("time for parsing " +
+                files.length.toString() +
+                ": " +
+                Duration(
+                        microseconds: (endTime.microsecondsSinceEpoch -
+                            startTime.microsecondsSinceEpoch))
+                    .inMilliseconds
+                    .toString());
             return Diff(files, diff.length);
           } else {
             Bus.instance.fire(RemoteSyncEvent(false));