diff options
-rw-r--r-- | src/main.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs index 66a011f..8265941 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ use clap::Parser; use client::GeClient; use futures_util::{StreamExt, stream::FuturesUnordered}; use glam::{DMat4, DVec3}; +use log::info; use mesh::{convert_mesh, decode_normal_table}; use std::{f32::consts::PI, path::PathBuf, pin::Pin, sync::Arc}; use tokio::sync::Semaphore; @@ -36,6 +37,7 @@ struct Args { #[derive(Parser)] enum Action { Cache { level: usize }, + CacheMetadata { level: usize }, Export { level: usize }, CacheFsToDb, } @@ -68,6 +70,20 @@ async fn main() -> Result<()> { ) .await?; } + Action::CacheMetadata { level } => { + let c = GeClient::new(16, cache).await?; + let entry = c.planetoid_metdata().await?; + let epoch = entry.root_node_metadata.unwrap().bulk_metadata_epoch(); + let count = cache_metadata( + Arc::new(c), + Arc::new(Semaphore::new(args.par_limit * 3 / 2)), + "".to_string(), + epoch, + level, + ) + .await?; + info!("There are {count} nodes at level {level}"); + } Action::Export { level } => { let c = GeClient::new(16, cache).await?; let entry = c.planetoid_metdata().await?; @@ -197,6 +213,44 @@ fn cache_all( }) } +fn cache_metadata( + c: Arc<GeClient>, + par: Arc<Semaphore>, + path: String, + epoch: u32, + level: usize, +) -> Pin<Box<dyn Future<Output = Result<u64>>>> { + Box::pin(async move { + let _permit = par.acquire().await?; + let bulk = c.bulk_metadata(&path, epoch).await?; + + let mut fu = FuturesUnordered::new(); + + let mut node_count = 0; + + for node_meta in &bulk.node_metadata { + let (cpath, flags) = unpack_path_and_id(node_meta.path_and_flags()); + node_count += 1; + if cpath.len() == 4 && flags.has_metadata && cpath.len() + path.len() < level { + let abspath = format!("{path}{cpath}"); + fu.push(cache_metadata( + c.clone(), + par.clone(), + abspath, + epoch, + level, + )); + } + } + drop(_permit); + + while let Some(res) = fu.next().await { + node_count += res?; + } + Ok(node_count) + }) +} + #[derive(Debug, Clone, Copy)] pub struct Flags { has_node: bool, |