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 = ScanScheduler::new(
41 object_store,
42 SchedulerConfig {
43 io_buffer_size_bytes: 2 * 1024 * 1024 * 1024,
44 },
45 );
46 let file_scheduler = scan_scheduler
47 .open_file(&path, &CachedFileSize::unknown())
48 .await?;
49 let file_metadata = FileReader::read_all_metadata(&file_scheduler).await?;
50 let lance_tool_file_metadata = Self { file_metadata };
51 Ok(lance_tool_file_metadata)
52 }
53}
54
55pub(crate) async fn show_file_meta(
56 mut writer: impl std::io::Write,
57 args: &LanceFileMetaArgs,
58) -> Result<()> {
59 let metadata = LanceToolFileMetadata::open(&args.source).await?;
60 write!(writer, "{}", metadata)?;
61 Ok(())
62}