import "dart:convert"; import 'package:photos/face/db_fields.dart'; import "package:photos/face/model/detection.dart"; import "package:photos/face/model/face.dart"; import "package:photos/face/model/person.dart"; import "package:photos/generated/protos/ente/common/vector.pb.dart"; import "package:photos/models/ml/ml_versions.dart"; int boolToSQLInt(bool? value, {bool defaultValue = false}) { final bool v = value ?? defaultValue; if (v == false) { return 0; } else { return 1; } } bool sqlIntToBool(int? value, {bool defaultValue = false}) { final int v = value ?? (defaultValue ? 1 : 0); if (v == 0) { return false; } else { return true; } } Map mapPersonToRow(Person p) { return { idColumn: p.remoteID, nameColumn: p.attr.name, personHiddenColumn: boolToSQLInt(p.attr.isHidden), coverFaceIDColumn: p.attr.avatarFaceId, clusterToFaceIdJson: jsonEncode(p.attr.faces.toList()), }; } Person mapRowToPerson(Map row) { return Person( row[idColumn] as String, PersonAttr( name: row[nameColumn] as String, isHidden: sqlIntToBool(row[personHiddenColumn] as int), avatarFaceId: row[coverFaceIDColumn] as String?, faces: (jsonDecode(row[clusterToFaceIdJson]) as List) .map((e) => e.toString()) .toList(), ), ); } Map mapRemoteToFaceDB(Face face) { return { faceIDColumn: face.faceID, fileIDColumn: face.fileID, faceDetectionColumn: json.encode(face.detection.toJson()), faceEmbeddingBlob: EVector( values: face.embedding, ).writeToBuffer(), faceScore: face.score, faceBlur: face.blur, mlVersionColumn: faceMlVersion, }; } Face mapRowToFace(Map row) { return Face( row[faceIDColumn] as String, row[fileIDColumn] as int, EVector.fromBuffer(row[faceEmbeddingBlob] as List).values, row[faceScore] as double, Detection.fromJson(json.decode(row[faceDetectionColumn] as String)), row[faceBlur] as double, ); }