1use crate::cli::LanceFileMetaArgs;
5use lance_core::Result;
6use lance_file::reader::{CachedFileMetadata, FileReader};
7use lance_io::scheduler::{ScanScheduler, SchedulerConfig};
8use lance_io::utils::CachedFileSize;
9use std::fmt;
10use std::fmt::Formatter;
11
12pub struct LanceToolFileMetadata {
13 file_metadata: CachedFileMetadata,
14}
15
16impl fmt::Display for LanceToolFileMetadata {
17 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
18 writeln!(f, "version: {}", self.file_metadata.version())?;
19 writeln!(f, "num_rows: {}", self.file_metadata.num_rows)?;
20 writeln!(f, "num_data_bytes: {}", self.file_metadata.num_data_bytes)?;
21 writeln!(
22 f,
23 "num_column_metadata_bytes: {}",
24 self.file_metadata.num_column_metadata_bytes
25 )?;
26 writeln!(
27 f,
28 "num_footer_bytes: {}",
29 self.file_metadata.num_footer_bytes
30 )?;
31 writeln!(f, "schema:")?;
32 write!(f, "{}", self.file_metadata.file_schema)?;
33 Ok(())
34 }
35}
36
37impl LanceToolFileMetadata {
38 async fn open(source: &String) -> Result<Self> {
39 let (object_store, path) = crate::util::get_object_store_and_path(source).await?;
40 let scan_scheduler =
41 ScanScheduler::new(object_store, SchedulerConfig::new(2 * 1024 * 1024 * 1024));
42 let file_scheduler = scan_scheduler
43 .open_file(&path, &CachedFileSize::unknown())
44 .await?;
45 let file_metadata = FileReader::read_all_metadata(&file_scheduler).await?;
46 let lance_tool_file_metadata = Self { file_metadata };
47 Ok(lance_tool_file_metadata)
48 }
49}
50
51pub(crate) async fn show_file_meta(
52 mut writer: impl std::io::Write,
53 args: &LanceFileMetaArgs,
54) -> Result<()> {
55 let metadata = LanceToolFileMetadata::open(&args.source).await?;
56 write!(writer, "{}", metadata)?;
57 Ok(())
58}