use std::collections::HashMap;
use datafusion::prelude::SessionContext;
use datafusion::sql::TableReference;
use datafusion_table_providers::{
clickhouse::{Arg, ClickHouseTableFactory},
sql::db_connection_pool::clickhousepool::ClickHouseConnectionPool,
util::secrets::to_secret_map,
};
#[tokio::main]
async fn main() {
let param = to_secret_map(HashMap::from([
("url".to_string(), "http://localhost:8123".to_string()),
("user".to_string(), "admin".to_string()),
("password".to_string(), "secret".to_string()),
]));
let pool = ClickHouseConnectionPool::new(param).await.unwrap();
let ctx = SessionContext::new();
let table_factory = ClickHouseTableFactory::new(pool);
let base_table = table_factory
.table_provider(TableReference::bare("Reports"), None)
.await
.unwrap();
ctx.register_table("reports_v1", base_table).unwrap();
let view_table = table_factory
.table_provider(
TableReference::bare("Users"),
Some(vec![(
"workspace_uid".to_string(),
Arg::String("abc".to_string()),
)]),
)
.await
.unwrap();
ctx.register_table("users", view_table).unwrap();
let df = ctx
.sql("SELECT * FROM datafusion.public.reports_v1")
.await
.expect("select failed");
df.show().await.expect("show failed");
let df = ctx
.sql("SELECT * FROM datafusion.public.users")
.await
.expect("select failed");
df.show().await.expect("show failed");
}