use datafusion::error::Result;
use datafusion::execution::SessionStateBuilder;
use datafusion::prelude::*;
use dbase::{DbaseDataSource, DbaseTableFactory};
use std::sync::Arc;
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<()> {
let table_factory = Arc::new(DbaseTableFactory {});
let session_state = SessionStateBuilder::new()
.with_default_features()
.with_table_factory("DBASE".to_string(), table_factory)
.build();
let ctx = SessionContext::new_with_state(session_state);
let sql = "create external table stations stored as dbase location './tests/data/stations.dbf'";
ctx.sql(sql).await?;
let df = ctx
.sql(
"
select
name, line, `marker-col`
from
stations
where
line='blue'
and name like 'F%'
",
)
.await?;
df.show().await?;
let stations_table = DbaseDataSource::new("./tests/data/stations.dbf");
ctx.register_table("stations2", Arc::new(stations_table))
.expect("failed to register table");
let df2 = ctx
.sql(
"
select
s1.name,
s1.line as line_1,
s2.line as line_2
from
stations s1
join stations2 s2
on s1.name = s2.name
limit 10;
",
)
.await?;
df2.show().await?;
Ok(())
}