[mob] Update local feedback on remote data change

This commit is contained in:
Neeraj Gupta 2024-11-09 08:41:03 +05:30
parent d769cfad55
commit 619476892a
3 changed files with 31 additions and 8 deletions

View File

@ -1,13 +1,24 @@
import "package:photos/events/event.dart";
import "package:photos/models/file/file.dart";
class PeopleRemoteFeedbackEvent extends Event {
final String source;
PeopleRemoteFeedbackEvent({
this.source = "",
});
@override
String get reason => '$runtimeType{"via": $source}';
}
class PeopleChangedEvent extends Event {
final List<EnteFile>? relevantFiles;
final PeopleEventType type;
final String source;
PeopleChangedEvent({
this.relevantFiles,
this.relevantFiles,
this.type = PeopleEventType.defaultType,
this.source = "",
});
@ -20,4 +31,4 @@ enum PeopleEventType {
defaultType,
removedFilesFromCluster,
syncDone,
}
}

View File

@ -6,8 +6,6 @@ import "package:logging/logging.dart";
import "package:photos/core/event_bus.dart";
import "package:photos/events/diff_sync_complete_event.dart";
import "package:photos/events/people_changed_event.dart";
import "package:photos/models/api/entity/type.dart";
import "package:photos/service_locator.dart";
import "package:photos/services/machine_learning/face_ml/face_detection/detection.dart";
import "package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart";
import "package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart";
@ -61,7 +59,11 @@ class FaceRecognitionService {
Bus.instance.fire(PeopleChangedEvent(type: PeopleEventType.syncDone));
_shouldReconcilePeople = false;
} else {
await entityService.syncEntity(EntityType.cgroup);
final bool didChange =
await PersonService.instance.fetchRemoteClusterFeedback();
if (didChange) {
Bus.instance.fire(PeopleChangedEvent(type: PeopleEventType.syncDone));
}
}
} finally {
_isSyncing = false;

View File

@ -74,7 +74,7 @@ class PersonService {
Future<void> reconcileClusters() async {
final EnteWatch? w = kDebugMode ? EnteWatch("reconcileClusters") : null;
w?.start();
await fetchRemoteClusterFeedback();
await fetchRemoteClusterFeedback(skipClusterUpdateIfNoChange: false);
w?.log("Stored remote feedback");
final dbPersonClusterInfo =
await faceMLDataDB.getPersonToClusterIdToFaceIds();
@ -251,8 +251,17 @@ class PersonService {
Bus.instance.fire(PeopleChangedEvent());
}
Future<void> fetchRemoteClusterFeedback() async {
await entityService.syncEntity(EntityType.cgroup);
// fetchRemoteClusterFeedback returns true if remote data has changed
Future<bool> fetchRemoteClusterFeedback({
bool skipClusterUpdateIfNoChange = true,
}) async {
final int changedEntities =
await entityService.syncEntity(EntityType.cgroup);
final bool changed = changedEntities > 0;
if (changed == false && skipClusterUpdateIfNoChange) {
return false;
}
final entities = await entityService.getEntities(EntityType.cgroup);
// todo: (neerajg) perf change, this can be expensive to do on every sync
// especially when we have a lot of people. We should only do this when the
@ -294,6 +303,7 @@ class PersonService {
logger.info("Storing feedback for ${faceIdToClusterID.length} faces");
await faceMLDataDB.updateFaceIdToClusterId(faceIdToClusterID);
await faceMLDataDB.bulkAssignClusterToPersonID(clusterToPersonID);
return changed;
}
Future<void> updateAvatar(PersonEntity p, EnteFile file) async {