datafusion_catalog/
default_table_source.rs1use std::sync::Arc;
21use std::{any::Any, borrow::Cow};
22
23use crate::TableProvider;
24
25use arrow::datatypes::SchemaRef;
26use datafusion_common::{internal_err, Constraints};
27use datafusion_expr::{Expr, TableProviderFilterPushDown, TableSource, TableType};
28
29pub struct DefaultTableSource {
37 pub table_provider: Arc<dyn TableProvider>,
39}
40
41impl DefaultTableSource {
42 pub fn new(table_provider: Arc<dyn TableProvider>) -> Self {
44 Self { table_provider }
45 }
46}
47
48impl TableSource for DefaultTableSource {
49 fn as_any(&self) -> &dyn Any {
52 self
53 }
54
55 fn schema(&self) -> SchemaRef {
57 self.table_provider.schema()
58 }
59
60 fn constraints(&self) -> Option<&Constraints> {
62 self.table_provider.constraints()
63 }
64
65 fn table_type(&self) -> TableType {
67 self.table_provider.table_type()
68 }
69
70 fn supports_filters_pushdown(
73 &self,
74 filter: &[&Expr],
75 ) -> datafusion_common::Result<Vec<TableProviderFilterPushDown>> {
76 self.table_provider.supports_filters_pushdown(filter)
77 }
78
79 fn get_logical_plan(&'_ self) -> Option<Cow<'_, datafusion_expr::LogicalPlan>> {
80 self.table_provider.get_logical_plan()
81 }
82
83 fn get_column_default(&self, column: &str) -> Option<&Expr> {
84 self.table_provider.get_column_default(column)
85 }
86}
87
88pub fn provider_as_source(
90 table_provider: Arc<dyn TableProvider>,
91) -> Arc<dyn TableSource> {
92 Arc::new(DefaultTableSource::new(table_provider))
93}
94
95pub fn source_as_provider(
98 source: &Arc<dyn TableSource>,
99) -> datafusion_common::Result<Arc<dyn TableProvider>> {
100 match source
101 .as_ref()
102 .as_any()
103 .downcast_ref::<DefaultTableSource>()
104 {
105 Some(source) => Ok(Arc::clone(&source.table_provider)),
106 _ => internal_err!("TableSource was not DefaultTableSource"),
107 }
108}
109
110#[test]
111fn preserves_table_type() {
112 use async_trait::async_trait;
113 use datafusion_common::DataFusionError;
114
115 #[derive(Debug)]
116 struct TestTempTable;
117
118 #[async_trait]
119 impl TableProvider for TestTempTable {
120 fn as_any(&self) -> &dyn Any {
121 self
122 }
123
124 fn table_type(&self) -> TableType {
125 TableType::Temporary
126 }
127
128 fn schema(&self) -> SchemaRef {
129 unimplemented!()
130 }
131
132 async fn scan(
133 &self,
134 _: &dyn crate::Session,
135 _: Option<&Vec<usize>>,
136 _: &[Expr],
137 _: Option<usize>,
138 ) -> Result<Arc<dyn datafusion_physical_plan::ExecutionPlan>, DataFusionError>
139 {
140 unimplemented!()
141 }
142 }
143
144 let table_source = DefaultTableSource::new(Arc::new(TestTempTable));
145 assert_eq!(table_source.table_type(), TableType::Temporary);
146}