use std::sync::Arc;
use async_trait::async_trait;
use datafusion_catalog::Session;
use datafusion_expr::CreateExternalTable;
pub use datafusion_expr::{TableProviderFilterPushDown, TableType};
use crate::catalog::{TableProvider, TableProviderFactory};
use crate::datasource::listing_table_factory::ListingTableFactory;
use crate::datasource::stream::StreamTableFactory;
use crate::error::Result;
#[derive(Debug, Default)]
pub struct DefaultTableFactory {
stream: StreamTableFactory,
listing: ListingTableFactory,
}
impl DefaultTableFactory {
pub fn new() -> Self {
Self::default()
}
}
#[async_trait]
impl TableProviderFactory for DefaultTableFactory {
async fn create(
&self,
state: &dyn Session,
cmd: &CreateExternalTable,
) -> Result<Arc<dyn TableProvider>> {
let mut unbounded = cmd.unbounded;
for (k, v) in &cmd.options {
if k.eq_ignore_ascii_case("unbounded") && v.eq_ignore_ascii_case("true") {
unbounded = true
}
}
match unbounded {
true => self.stream.create(state, cmd).await,
false => self.listing.create(state, cmd).await,
}
}
}