use std::collections::HashMap;
use std::sync::Arc;
use std::time::Duration;
use lance::dataset::ReadParams;
use lance_namespace::LanceNamespace;
use lance_namespace::models::{
CreateNamespaceRequest, CreateNamespaceResponse, DescribeNamespaceRequest,
DescribeNamespaceResponse, DropNamespaceRequest, DropNamespaceResponse, ListNamespacesRequest,
ListNamespacesResponse, ListTablesRequest, ListTablesResponse,
};
use crate::data::scannable::Scannable;
use crate::error::Result;
use crate::table::{BaseTable, WriteOptions};
pub mod listing;
pub mod namespace;
pub trait DatabaseOptions {
fn serialize_into_map(&self, map: &mut HashMap<String, String>);
}
#[derive(Clone, Debug, Default)]
pub struct TableNamesRequest {
pub namespace: Vec<String>,
pub start_after: Option<String>,
pub limit: Option<u32>,
}
#[derive(Clone)]
pub struct OpenTableRequest {
pub name: String,
pub namespace: Vec<String>,
pub index_cache_size: Option<u32>,
pub lance_read_params: Option<ReadParams>,
pub location: Option<String>,
pub namespace_client: Option<Arc<dyn LanceNamespace>>,
pub managed_versioning: Option<bool>,
}
impl std::fmt::Debug for OpenTableRequest {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("OpenTableRequest")
.field("name", &self.name)
.field("namespace", &self.namespace)
.field("index_cache_size", &self.index_cache_size)
.field("lance_read_params", &self.lance_read_params)
.field("location", &self.location)
.field("namespace_client", &self.namespace_client)
.field("managed_versioning", &self.managed_versioning)
.finish()
}
}
pub type TableBuilderCallback = Box<dyn FnOnce(OpenTableRequest) -> OpenTableRequest + Send>;
#[derive(Default)]
pub enum CreateTableMode {
#[default]
Create,
ExistOk(TableBuilderCallback),
Overwrite,
}
impl CreateTableMode {
pub fn exist_ok(
callback: impl FnOnce(OpenTableRequest) -> OpenTableRequest + Send + 'static,
) -> Self {
Self::ExistOk(Box::new(callback))
}
}
pub struct CreateTableRequest {
pub name: String,
pub namespace: Vec<String>,
pub data: Box<dyn Scannable>,
pub mode: CreateTableMode,
pub write_options: WriteOptions,
pub location: Option<String>,
pub namespace_client: Option<Arc<dyn LanceNamespace>>,
}
impl CreateTableRequest {
pub fn new(name: String, data: Box<dyn Scannable>) -> Self {
Self {
name,
namespace: vec![],
data,
mode: CreateTableMode::default(),
write_options: WriteOptions::default(),
location: None,
namespace_client: None,
}
}
}
#[derive(Clone, Debug)]
pub struct CloneTableRequest {
pub target_table_name: String,
pub target_namespace: Vec<String>,
pub source_uri: String,
pub source_version: Option<u64>,
pub source_tag: Option<String>,
pub is_shallow: bool,
pub namespace_client: Option<Arc<dyn LanceNamespace>>,
}
impl CloneTableRequest {
pub fn new(target_table_name: String, source_uri: String) -> Self {
Self {
target_table_name,
target_namespace: vec![],
source_uri,
source_version: None,
source_tag: None,
is_shallow: true,
namespace_client: None,
}
}
}
pub enum ReadConsistency {
Manual,
Eventual(Duration),
Strong,
}
#[async_trait::async_trait]
pub trait Database:
Send + Sync + std::any::Any + std::fmt::Debug + std::fmt::Display + 'static
{
fn uri(&self) -> &str;
async fn read_consistency(&self) -> Result<ReadConsistency>;
async fn list_namespaces(
&self,
request: ListNamespacesRequest,
) -> Result<ListNamespacesResponse>;
async fn create_namespace(
&self,
request: CreateNamespaceRequest,
) -> Result<CreateNamespaceResponse>;
async fn drop_namespace(&self, request: DropNamespaceRequest) -> Result<DropNamespaceResponse>;
async fn describe_namespace(
&self,
request: DescribeNamespaceRequest,
) -> Result<DescribeNamespaceResponse>;
#[deprecated(note = "Use list_tables instead")]
async fn table_names(&self, request: TableNamesRequest) -> Result<Vec<String>>;
async fn list_tables(&self, request: ListTablesRequest) -> Result<ListTablesResponse>;
async fn create_table(&self, request: CreateTableRequest) -> Result<Arc<dyn BaseTable>>;
async fn clone_table(&self, request: CloneTableRequest) -> Result<Arc<dyn BaseTable>>;
async fn open_table(&self, request: OpenTableRequest) -> Result<Arc<dyn BaseTable>>;
async fn rename_table(
&self,
cur_name: &str,
new_name: &str,
cur_namespace: &[String],
new_namespace: &[String],
) -> Result<()>;
async fn drop_table(&self, name: &str, namespace: &[String]) -> Result<()>;
async fn drop_all_tables(&self, namespace: &[String]) -> Result<()>;
fn as_any(&self) -> &dyn std::any::Any;
async fn namespace_client(&self) -> Result<Arc<dyn LanceNamespace>>;
}