use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TkgOperationLog { pub id: i64, pub file_uuid: String, pub operation: String, pub node_type: Option, pub edge_type: Option, pub nodes_created: i32, pub nodes_updated: i32, pub nodes_deleted: i32, pub edges_created: i32, pub edges_updated: i32, pub edges_deleted: i32, pub status: String, pub error_message: Option, pub started_at: String, pub completed_at: Option, pub properties: Option, } #[derive(Debug, Clone, Default)] pub struct TkgNodeStats { pub created: i32, pub updated: i32, pub deleted: i32, } #[derive(Debug, Clone, Default)] pub struct TkgEdgeStats { pub created: i32, pub updated: i32, pub deleted: i32, } #[derive(Debug, Clone, Default)] pub struct TkgBuildStats { pub face_track_nodes: i32, pub gaze_track_nodes: i32, pub lip_track_nodes: i32, pub text_region_nodes: i32, pub appearance_trace_nodes: i32, pub accessory_nodes: i32, pub object_nodes: i32, pub hand_nodes: i32, pub speaker_nodes: i32, pub co_occurrence_edges: i32, pub speaker_face_edges: i32, pub face_face_edges: i32, pub mutual_gaze_edges: i32, pub lip_sync_edges: i32, pub has_appearance_edges: i32, pub wears_edges: i32, pub hand_object_edges: i32, } impl TkgBuildStats { pub fn total_nodes(&self) -> i32 { self.face_track_nodes + self.gaze_track_nodes + self.lip_track_nodes + self.text_region_nodes + self.appearance_trace_nodes + self.accessory_nodes + self.object_nodes + self.hand_nodes + self.speaker_nodes } pub fn total_edges(&self) -> i32 { self.co_occurrence_edges + self.speaker_face_edges + self.face_face_edges + self.mutual_gaze_edges + self.lip_sync_edges + self.has_appearance_edges + self.wears_edges + self.hand_object_edges } pub fn to_json(&self) -> serde_json::Value { serde_json::json!({ "face_track_nodes": self.face_track_nodes, "gaze_track_nodes": self.gaze_track_nodes, "lip_track_nodes": self.lip_track_nodes, "text_region_nodes": self.text_region_nodes, "appearance_trace_nodes": self.appearance_trace_nodes, "accessory_nodes": self.accessory_nodes, "object_nodes": self.object_nodes, "hand_nodes": self.hand_nodes, "speaker_nodes": self.speaker_nodes, "co_occurrence_edges": self.co_occurrence_edges, "speaker_face_edges": self.speaker_face_edges, "face_face_edges": self.face_face_edges, "mutual_gaze_edges": self.mutual_gaze_edges, "lip_sync_edges": self.lip_sync_edges, "has_appearance_edges": self.has_appearance_edges, "wears_edges": self.wears_edges, "hand_object_edges": self.hand_object_edges, "total_nodes": self.total_nodes(), "total_edges": self.total_edges(), }) } }