From f09005ed954bb1cd147e91c1f15f98f935ea7348 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 5 Nov 2024 21:01:35 +0530 Subject: [PATCH] [mob][photos] Make filtering of 'Only them' filter faster by making one db query instead of two and log and handle any errors when filtering using the 'Only them' filter --- mobile/lib/db/ml/db.dart | 45 +++------ .../lib/utils/hierarchical_search_util.dart | 95 +++++++++---------- 2 files changed, 58 insertions(+), 82 deletions(-) diff --git a/mobile/lib/db/ml/db.dart b/mobile/lib/db/ml/db.dart index 8443c473af..48d26f45b9 100644 --- a/mobile/lib/db/ml/db.dart +++ b/mobile/lib/db/ml/db.dart @@ -1024,36 +1024,6 @@ class MLDataDB { return [for (final row in result) row[fileIDColumn]]; } - Future> getFileIDsOfClusterIDs(Set clusterIDs) async { - final db = await instance.asyncDB; - final inParam = clusterIDs.map((e) => "'$e'").join(','); - - final result = await db.getAll( - ''' - SELECT DISTINCT $facesTable.$fileIDColumn - FROM $faceClustersTable - JOIN $facesTable ON $faceClustersTable.$faceIDColumn = $facesTable.$faceIDColumn - WHERE $faceClustersTable.$clusterIDColumn IN ($inParam) - ''', - ); - - return {for (final row in result) row[fileIDColumn]}; - } - - Future> getAllClusterIDs({List? exceptClusters}) async { - final notInParam = exceptClusters?.map((e) => "'$e'").join(',') ?? ''; - final db = await instance.asyncDB; - final result = await db.getAll( - ''' - SELECT DISTINCT $clusterIDColumn - FROM $faceClustersTable - WHERE $clusterIDColumn NOT IN ($notInParam) - ''', - ); - - return {for (final row in result) row[clusterIDColumn]}; - } - Future> getAllFileIDsOfFaceIDsNotInAnyCluster() async { final db = await instance.asyncDB; final result = await db.getAll( @@ -1066,4 +1036,19 @@ class MLDataDB { ); return {for (final row in result) row[fileIDColumn]}; } + + Future> getAllFilesAssociatedWithAllClusters({ + List? exceptClusters, + }) async { + final notInParam = exceptClusters?.map((e) => "'$e'").join(',') ?? ''; + final db = await instance.asyncDB; + final result = await db.getAll(''' + SELECT DISTINCT $facesTable.$fileIDColumn + FROM $facesTable + JOIN $faceClustersTable on $faceClustersTable.$faceIDColumn = $facesTable.$faceIDColumn + WHERE $faceClustersTable.$clusterIDColumn NOT IN ($notInParam); + '''); + + return {for (final row in result) row[fileIDColumn]}; + } } diff --git a/mobile/lib/utils/hierarchical_search_util.dart b/mobile/lib/utils/hierarchical_search_util.dart index c8c3c11a81..fe494699e9 100644 --- a/mobile/lib/utils/hierarchical_search_util.dart +++ b/mobile/lib/utils/hierarchical_search_util.dart @@ -1,5 +1,3 @@ -import "dart:developer"; - import "package:flutter/material.dart"; import "package:logging/logging.dart"; import "package:photos/core/configuration.dart"; @@ -43,74 +41,67 @@ Future> getFilteredFiles( for (HierarchicalSearchFilter filter in filters) { if (filter is FaceFilter && filter.getMatchedUploadedIDs().isEmpty) { try { - final stopwatch = Stopwatch()..start(); - if (filter.personId != null) { - logger.info( - "Fetching files for never fetched person ${filter.personId}", - ); final fileIDs = await MLDataDB.instance.getFileIDsOfPersonID( filter.personId!, ); filter.matchedUploadedIDs.addAll(fileIDs); } else if (filter.clusterId != null) { - logger.info( - "Fetching files for never fetched cluster ${filter.clusterId}", - ); final fileIDs = await MLDataDB.instance.getFileIDsOfClusterID( filter.clusterId!, ); filter.matchedUploadedIDs.addAll(fileIDs); } - - stopwatch.stop(); } catch (e) { - log("Error in face filter: $e"); + logger.severe("Error in filtering face filter: $e"); } } else if (filter is OnlyThemFilter) { - late Set intersectionOfSelectedFaceFiltersFileIDs; - final selectedClusterIDs = []; - final selectedPersonIDs = []; - int index = 0; + try { + late Set intersectionOfSelectedFaceFiltersFileIDs; + final selectedClusterIDs = []; + final selectedPersonIDs = []; + int index = 0; - for (final faceFilter in filter.faceFilters) { - if (index == 0) { - intersectionOfSelectedFaceFiltersFileIDs = - faceFilter.getMatchedUploadedIDs(); - } else { - intersectionOfSelectedFaceFiltersFileIDs = - intersectionOfSelectedFaceFiltersFileIDs - .intersection(faceFilter.getMatchedUploadedIDs()); - } - index++; + for (final faceFilter in filter.faceFilters) { + if (index == 0) { + intersectionOfSelectedFaceFiltersFileIDs = + faceFilter.getMatchedUploadedIDs(); + } else { + intersectionOfSelectedFaceFiltersFileIDs = + intersectionOfSelectedFaceFiltersFileIDs + .intersection(faceFilter.getMatchedUploadedIDs()); + } + index++; - if (faceFilter.clusterId != null) { - selectedClusterIDs.add(faceFilter.clusterId!); - } else { - selectedPersonIDs.add(faceFilter.personId!); + if (faceFilter.clusterId != null) { + selectedClusterIDs.add(faceFilter.clusterId!); + } else { + selectedPersonIDs.add(faceFilter.personId!); + } } + + await MLDataDB.instance + .getPersonsClusterIDs(selectedPersonIDs) + .then((clusterIDs) { + selectedClusterIDs.addAll(clusterIDs); + }); + + final fileIDsToAvoid = + await MLDataDB.instance.getAllFilesAssociatedWithAllClusters( + exceptClusters: selectedClusterIDs, + ); + + final filesOfFaceIDsNotInAnyCluster = + await MLDataDB.instance.getAllFileIDsOfFaceIDsNotInAnyCluster(); + + fileIDsToAvoid.addAll(filesOfFaceIDsNotInAnyCluster); + + final result = + intersectionOfSelectedFaceFiltersFileIDs.difference(fileIDsToAvoid); + filter.matchedUploadedIDs.addAll(result); + } catch (e) { + logger.severe("Error in filtering only them filter: $e"); } - - await MLDataDB.instance - .getPersonsClusterIDs(selectedPersonIDs) - .then((clusterIDs) { - selectedClusterIDs.addAll(clusterIDs); - }); - - final clusterIDsToAvoid = await MLDataDB.instance - .getAllClusterIDs(exceptClusters: selectedClusterIDs); - - final fileIDsToAvoid = - await MLDataDB.instance.getFileIDsOfClusterIDs(clusterIDsToAvoid); - - final filesOfFaceIDsNotInAnyCluster = - await MLDataDB.instance.getAllFileIDsOfFaceIDsNotInAnyCluster(); - - fileIDsToAvoid.addAll(filesOfFaceIDsNotInAnyCluster); - - final result = - intersectionOfSelectedFaceFiltersFileIDs.difference(fileIDsToAvoid); - filter.matchedUploadedIDs.addAll(result); } else if (filter is! FaceFilter && filter.getMatchedUploadedIDs().isEmpty) { resultsNeverComputedFilters.add(filter);