use std::collections::HashMap;
use lance::Dataset;
use crate::error::{Error, Result};
use crate::store::{StorageOptions, open_dataset};
pub const FORMAT_METADATA_KEY: &str = "lance_nd:format";
pub const FORMAT_VERSION: &str = "1";
pub async fn open(uri: &str) -> Result<Dataset> {
open_with(uri, &StorageOptions::new()).await
}
#[tracing::instrument(skip_all, fields(uri = %uri), err)]
pub async fn open_with(uri: &str, options: &StorageOptions) -> Result<Dataset> {
let dataset = open_dataset(uri, options).await?;
check_format(&dataset)?;
Ok(dataset)
}
pub fn check_format(dataset: &Dataset) -> Result<()> {
match dataset.schema().metadata.get(FORMAT_METADATA_KEY) {
Some(version) if version == FORMAT_VERSION => Ok(()),
Some(version) => Err(Error::InvalidTable(format!(
"the table has lance-nd format {version}, this release reads format {FORMAT_VERSION}"
))),
None => Err(Error::InvalidTable(format!(
"the table has no {FORMAT_METADATA_KEY} key: it is not a lance-nd table of format {FORMAT_VERSION}"
))),
}
}
pub(crate) fn add_format(metadata: &mut HashMap<String, String>) {
metadata.insert(FORMAT_METADATA_KEY.to_string(), FORMAT_VERSION.to_string());
}