1use std::collections::HashMap;
8
9use lance::Dataset;
10
11use crate::error::{Error, Result};
12use crate::store::{StorageOptions, open_dataset};
13
14pub const FORMAT_METADATA_KEY: &str = "lance_nd:format";
16
17pub const FORMAT_VERSION: &str = "1";
19
20pub async fn open(uri: &str) -> Result<Dataset> {
23 open_with(uri, &StorageOptions::new()).await
24}
25
26#[tracing::instrument(skip_all, fields(uri = %uri), err)]
29pub async fn open_with(uri: &str, options: &StorageOptions) -> Result<Dataset> {
30 let dataset = open_dataset(uri, options).await?;
31 check_format(&dataset)?;
32 Ok(dataset)
33}
34
35pub fn check_format(dataset: &Dataset) -> Result<()> {
37 match dataset.schema().metadata.get(FORMAT_METADATA_KEY) {
38 Some(version) if version == FORMAT_VERSION => Ok(()),
39 Some(version) => Err(Error::InvalidTable(format!(
40 "the table has lance-nd format {version}, this release reads format {FORMAT_VERSION}"
41 ))),
42 None => Err(Error::InvalidTable(format!(
43 "the table has no {FORMAT_METADATA_KEY} key: it is not a lance-nd table of format {FORMAT_VERSION}"
44 ))),
45 }
46}
47
48pub(crate) fn add_format(metadata: &mut HashMap<String, String>) {
50 metadata.insert(FORMAT_METADATA_KEY.to_string(), FORMAT_VERSION.to_string());
51}