release: v1.3.0 - TKG node type renaming

Changes:
- Rust: face_trace → face_track (45 occurrences in 8 files)
- Rust: gaze_trace → gaze_track, lip_trace → lip_track
- Python: tkg_builder.py unified + pipeline_checklist.py fixed
- Swift: swift_hand.swift hand state detection (empty vs holding)

Node type changes:
  face_trace    → face_track
  person_trace  → body_track
  gaze_trace    → gaze_track
  lip_trace     → lip_track
  hand_trace    → hand_track
  speaker       → speaker_segment
  object        → detected_object
  text_trace    → text_region

Migration:
  PUBLIC schema: 12970 + 892 + 305 rows updated
This commit is contained in:
Accusys
2026-06-22 07:18:21 +08:00
parent bce9435823
commit 7e548f8b08
35 changed files with 2789 additions and 481 deletions
+20 -22
View File
@@ -225,7 +225,7 @@ pub async fn unbind_identity(
)
})?;
// Phase 2.3: Also update TKG node (find trace_id first)
// Phase 2.3: Also update TKG node (find face_track_id first)
let trace_id_opt: Option<i32> = sqlx::query_scalar(&format!(
"SELECT trace_id FROM {} WHERE file_uuid = $1 AND face_id = $2",
table
@@ -239,10 +239,10 @@ pub async fn unbind_identity(
if let Some(trace_id) = trace_id_opt {
let nodes_table = crate::core::db::schema::table_name("tkg_nodes");
let external_id = format!("trace_{}", trace_id);
let external_id = format!("face_track_{}", trace_id);
let _ = sqlx::query(&format!(
"UPDATE {} SET properties = properties - 'identity_id' - 'identity_name' \
WHERE file_uuid = $1 AND node_type = 'face_trace' AND external_id = $2",
WHERE file_uuid = $1 AND node_type = 'face_track' AND external_id = $2",
nodes_table
))
.bind(&req.file_uuid)
@@ -789,7 +789,7 @@ pub async fn bind_identity_trace(
// Capture old identity_id before bind trace (use first face in trace as reference)
let old_identity_id: Option<i32> = sqlx::query_scalar(&format!(
"SELECT identity_id FROM {} WHERE file_uuid = $1 AND trace_id = $2 LIMIT 1",
"SELECT identity_id FROM {} WHERE trace_id = $2 LIMIT 1",
fd_table
))
.bind(&req.file_uuid)
@@ -805,7 +805,7 @@ pub async fn bind_identity_trace(
.flatten();
let result = sqlx::query(&format!(
"UPDATE {} SET identity_id = $1 WHERE file_uuid = $2 AND trace_id = $3",
"UPDATE {} SET identity_id = $1 WHERE trace_id = $3",
fd_table
))
.bind(identity_id)
@@ -820,24 +820,22 @@ pub async fn bind_identity_trace(
)
})?;
// Phase 2.3: Also update TKG node properties
// Phase 2.3: Also update TKG node properties
let nodes_table = crate::core::db::schema::table_name("tkg_nodes");
let external_id = format!("trace_{}", req.trace_id);
let identity_name: Option<String> = sqlx::query_scalar(&format!(
"SELECT name FROM {} WHERE id = $1",
id_table
))
.bind(identity_id)
.fetch_optional(state.db.pool())
.await
.ok()
.flatten();
let external_id = format!("face_track_{}", req.trace_id);
let identity_name: Option<String> =
sqlx::query_scalar(&format!("SELECT name FROM {} WHERE id = $1", id_table))
.bind(identity_id)
.fetch_optional(state.db.pool())
.await
.ok()
.flatten();
let _ = sqlx::query(&format!(
"UPDATE {} SET properties = jsonb_set(\
jsonb_set(properties, '{{identity_id}}', $1::jsonb, false),\
'{{identity_name}}', $2::jsonb, false)\
WHERE file_uuid = $3 AND node_type = 'face_trace' AND external_id = $4",
WHERE file_uuid = $3 AND node_type = 'face_track' AND external_id = $4",
nodes_table
))
.bind(identity_id)
@@ -941,8 +939,8 @@ pub async fn get_identity_traces(
FROM {} fd
LEFT JOIN dev.videos v ON fd.file_uuid = v.file_uuid
WHERE fd.identity_id = $1
GROUP BY fd.file_uuid, fd.trace_id, v.fps
ORDER BY fd.file_uuid, fd.trace_id
GROUP BY trace_id, v.fps
ORDER BY trace_id
LIMIT $2 OFFSET $3"#,
fd_table
))
@@ -955,7 +953,7 @@ pub async fn get_identity_traces(
// Get total count for pagination
let total: (i64,) = sqlx::query_as(&format!(
"SELECT COUNT(*) FROM (SELECT 1 FROM {} fd WHERE fd.identity_id = $1 GROUP BY fd.file_uuid, fd.trace_id) sub",
"SELECT COUNT(*) FROM (SELECT 1 FROM {} fd WHERE trace_id) sub",
fd_table
))
.bind(identity_id)
@@ -1563,7 +1561,7 @@ async fn apply_bind_snapshot(
Ok(rows.rows_affected() as i64)
} else if let Some(trace_id) = snapshot.get("trace_id").and_then(|v| v.as_i64()) {
let rows = sqlx::query(&format!(
"UPDATE {} SET identity_id = $1 WHERE file_uuid = $2 AND trace_id = $3",
"UPDATE {} SET identity_id = $1 WHERE trace_id = $3",
face_table
))
.bind(id_val)
@@ -1581,7 +1579,7 @@ async fn apply_bind_snapshot(
} else {
Err((
StatusCode::INTERNAL_SERVER_ERROR,
Json(serde_json::json!({"error": "Snapshot has neither face_id nor trace_id"})),
Json(serde_json::json!({"error": "Snapshot has neither face_id nor face_track_id"})),
))
}
}