use vantage_expressions::{Expressive, expr_any, traits::selectable::Selectable};
use crate::traits::table_source_spec::TableSourceSpec;
#[derive(Clone, Debug)]
pub enum SelectSource<S> {
Name(String),
Query { select: Box<S>, alias: String },
}
impl<S> SelectSource<S> {
pub fn query(select: S, alias: impl Into<String>) -> Self {
SelectSource::Query {
select: Box::new(select),
alias: alias.into(),
}
}
}
impl<S: Clone + Send + Sync + 'static> TableSourceSpec for SelectSource<S> {
fn name(&self) -> &str {
match self {
SelectSource::Name(name) => name.as_str(),
SelectSource::Query { alias, .. } => alias.as_str(),
}
}
fn from_name(name: String) -> Self {
SelectSource::Name(name)
}
}
impl<S> From<&str> for SelectSource<S> {
fn from(value: &str) -> Self {
SelectSource::Name(value.to_string())
}
}
impl<S> From<String> for SelectSource<S> {
fn from(value: String) -> Self {
SelectSource::Name(value)
}
}
pub trait SelectSeed<S, V, C> {
fn seed(&self, select: &mut S)
where
S: Selectable<V, C>,
V: From<String>;
}
impl<S, V, C> SelectSeed<S, V, C> for String {
fn seed(&self, select: &mut S)
where
S: Selectable<V, C>,
V: From<String>,
{
select.add_source(self.as_str(), None);
}
}
impl<S, V, C> SelectSeed<S, V, C> for SelectSource<S>
where
S: Expressive<V> + Clone,
V: Clone,
{
fn seed(&self, select: &mut S)
where
S: Selectable<V, C>,
V: From<String>,
{
match self {
SelectSource::Name(name) => select.add_source(name.as_str(), None),
SelectSource::Query {
select: query,
alias,
} => {
let subquery = expr_any!("({})", (query.expr()));
select.add_source(subquery, Some(alias.clone()));
}
}
}
}