feat: Add children_json update to scan system

Problem:
- Home folder could not expand (children_json was empty)
- UI tree view showed flat structure

Solution:
- Add step [5/5] to update children_json for all folders
- Use SQL: json_group_array(node_id) to collect child IDs
- Update 802 folders after node insertion

Performance:
- Children JSON update: 1.55s (74% of total time)
- Total scan time: 2.08s (vs 0.89s without children)

Result:
- Home folder has 805 children 
- Tree structure fully functional 
- API returns correct children array 

Files:
- src/scan.rs (added children_json update step)
This commit is contained in:
Warren
2026-05-17 03:35:35 +08:00
parent 86fa66bb42
commit d783fdc397
2 changed files with 30 additions and 7 deletions

Binary file not shown.

View File

@@ -56,7 +56,7 @@ pub fn scan_directory(user_id: &str, dir: &str, batch_size: usize, options: Scan
folders.len(), files.len(), scan_duration.as_secs_f64());
println!();
println!("[2/4] Generating node IDs...");
println!("[2/5] Generating node IDs...");
let id_start = Instant::now();
let mac = get_mac_address()?;
@@ -184,7 +184,7 @@ pub fn scan_directory(user_id: &str, dir: &str, batch_size: usize, options: Scan
folder_nodes.len(), file_nodes.len(), id_duration.as_secs_f64());
println!();
println!("[3/4] Opening database...");
println!("[3/5] Opening database...");
let db_start = Instant::now();
let db_path = FileTree::user_db_path(user_id);
@@ -199,7 +199,7 @@ pub fn scan_directory(user_id: &str, dir: &str, batch_size: usize, options: Scan
println!(" Database opened in {:.2}s", db_duration.as_secs_f64());
println!();
println!("[4/4] Inserting nodes (batch size: {})...", batch_size);
println!("[4/5] Inserting nodes (batch size: {})...", batch_size);
let insert_start = Instant::now();
let tx = conn.unchecked_transaction()?;
@@ -239,6 +239,26 @@ pub fn scan_directory(user_id: &str, dir: &str, batch_size: usize, options: Scan
insert_duration.as_secs_f64(),
total_nodes as f64 / insert_duration.as_secs_f64());
println!();
println!("[5/5] Updating folder children_json...");
let children_start = Instant::now();
conn.execute(
"UPDATE file_nodes
SET children_json = (
SELECT json_group_array(node_id)
FROM file_nodes AS child
WHERE child.parent_id = file_nodes.node_id
)
WHERE node_type = 'folder'",
[],
)?;
let children_duration = children_start.elapsed();
println!(" Updated children_json for {} folders in {:.2}s",
folder_count,
children_duration.as_secs_f64());
let total_duration = start.elapsed();
println!();
println!("=== Summary ===");
@@ -249,18 +269,21 @@ pub fn scan_directory(user_id: &str, dir: &str, batch_size: usize, options: Scan
println!("Database: {}", FileTree::user_db_path(user_id));
println!();
println!("Performance breakdown:");
println!(" - Scanning: {:.2}s ({:.0}%)",
println!(" - Scanning: {:.2}s ({:.0}%)",
scan_duration.as_secs_f64(),
scan_duration.as_secs_f64() / total_duration.as_secs_f64() * 100.0);
println!(" - ID gen: {:.2}s ({:.0}%)",
println!(" - ID gen: {:.2}s ({:.0}%)",
id_duration.as_secs_f64(),
id_duration.as_secs_f64() / total_duration.as_secs_f64() * 100.0);
println!(" - DB open: {:.2}s ({:.0}%)",
println!(" - DB open: {:.2}s ({:.0}%)",
db_duration.as_secs_f64(),
db_duration.as_secs_f64() / total_duration.as_secs_f64() * 100.0);
println!(" - Insertion: {:.2}s ({:.0}%)",
println!(" - Insertion: {:.2}s ({:.0}%)",
insert_duration.as_secs_f64(),
insert_duration.as_secs_f64() / total_duration.as_secs_f64() * 100.0);
println!(" - Children JSON: {:.2}s ({:.0}%)",
children_duration.as_secs_f64(),
children_duration.as_secs_f64() / total_duration.as_secs_f64() * 100.0);
if !options.skip_hash {
println!();