Skip to main content

lance_tools/
meta.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright The Lance Authors
3
4use 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}