pub mod catalog;
pub mod information_schema;
pub mod schema;
use crate::error::DataFusionError;
use std::convert::TryFrom;
#[derive(Clone, Copy)]
pub struct ResolvedTableReference<'a> {
pub catalog: &'a str,
pub schema: &'a str,
pub table: &'a str,
}
#[derive(Clone, Copy)]
pub enum TableReference<'a> {
Bare {
table: &'a str,
},
Partial {
schema: &'a str,
table: &'a str,
},
Full {
catalog: &'a str,
schema: &'a str,
table: &'a str,
},
}
impl<'a> TableReference<'a> {
pub fn table(&self) -> &str {
match self {
Self::Full { table, .. }
| Self::Partial { table, .. }
| Self::Bare { table } => table,
}
}
pub fn resolve(
self,
default_catalog: &'a str,
default_schema: &'a str,
) -> ResolvedTableReference<'a> {
match self {
Self::Full {
catalog,
schema,
table,
} => ResolvedTableReference {
catalog,
schema,
table,
},
Self::Partial { schema, table } => ResolvedTableReference {
catalog: default_catalog,
schema,
table,
},
Self::Bare { table } => ResolvedTableReference {
catalog: default_catalog,
schema: default_schema,
table,
},
}
}
}
impl<'a> From<&'a str> for TableReference<'a> {
fn from(s: &'a str) -> Self {
Self::Bare { table: s }
}
}
impl<'a> From<ResolvedTableReference<'a>> for TableReference<'a> {
fn from(resolved: ResolvedTableReference<'a>) -> Self {
Self::Full {
catalog: resolved.catalog,
schema: resolved.schema,
table: resolved.table,
}
}
}
impl<'a> TryFrom<&'a sqlparser::ast::ObjectName> for TableReference<'a> {
type Error = DataFusionError;
fn try_from(value: &'a sqlparser::ast::ObjectName) -> Result<Self, Self::Error> {
let idents = &value.0;
match idents.len() {
1 => Ok(Self::Bare {
table: &idents[0].value,
}),
2 => Ok(Self::Partial {
schema: &idents[0].value,
table: &idents[1].value,
}),
3 => Ok(Self::Full {
catalog: &idents[0].value,
schema: &idents[1].value,
table: &idents[2].value,
}),
_ => Err(DataFusionError::Plan(format!(
"invalid table reference: {}",
value
))),
}
}
}