Skip to content

Commit a190ab1

Browse files
More handlers
1 parent ab2136e commit a190ab1

4 files changed

Lines changed: 51 additions & 63 deletions

File tree

Cargo.lock

Lines changed: 12 additions & 52 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ version = "0.2.2"
1717
arrow-flight = { version = "54.1.0", features = [
1818
"flight-sql-experimental",
1919
], optional = true }
20-
axum = { version = "0.8.1", optional = true }
20+
axum = { version = "0.7.9", features = ["macros"], optional = true }
2121
clap = { version = "4.5.27", features = ["derive"] }
2222
color-eyre = "0.6.3"
2323
crossterm = { version = "0.28.1", features = ["event-stream"] }

src/server/http/mod.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,7 @@ impl HttpApp {
7777
) -> Result<Self> {
7878
info!("Listening to HTTP on {addr}");
7979
let listener = TcpListener::bind(addr).await.unwrap();
80-
81-
// prepare the shutdown channel
8280
let state = execution.execution_ctx().clone();
83-
8481
let router = create_router(state, config.http_server);
8582

8683
let metrics_addr: SocketAddr = metrics_addr.parse()?;

src/server/http/router.rs

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,19 @@ use std::{io::Cursor, time::Duration};
1919

2020
use axum::{
2121
body::Body,
22-
extract::State,
22+
extract::{Path, State},
2323
response::{IntoResponse, Response},
24-
routing::get,
24+
routing::{get, post},
2525
Router,
2626
};
2727
use datafusion::arrow::json::ArrayWriter;
2828
use datafusion_app::local::ExecutionContext;
2929
use http::{HeaderValue, StatusCode};
3030
use log::error;
31+
use serde::Deserialize;
3132
use tokio_stream::StreamExt;
3233
use tower_http::{timeout::TimeoutLayer, trace::TraceLayer};
34+
use tracing::info;
3335

3436
use crate::config::HttpServerConfig;
3537

@@ -39,9 +41,9 @@ pub fn create_router(execution: ExecutionContext, config: HttpServerConfig) -> R
3941
"/",
4042
get(|State(_): State<ExecutionContext>| async { "Hello, from DFT!" }),
4143
)
42-
.route("/sql", get(execute_sql))
43-
.route("/catalog", get(execute_sql))
44-
.route("/{catalog}/{schema}/{table}", get(execute_sql))
44+
.route("/sql", post(post_sql_handler))
45+
.route("/catalog", get(get_catalog_handler))
46+
.route("/table/:catalog/:schema/:table", get(get_table_handler))
4547
.layer((
4648
TraceLayer::new_for_http(),
4749
// Graceful shutdown will wait for outstanding requests to complete. Add a timeout so
@@ -51,8 +53,37 @@ pub fn create_router(execution: ExecutionContext, config: HttpServerConfig) -> R
5153
.with_state(execution)
5254
}
5355

54-
async fn execute_sql(State(state): State<ExecutionContext>) -> Response {
55-
let results = state.execute_sql("SELECT 1, 2").await;
56+
async fn post_sql_handler(state: State<ExecutionContext>, query: String) -> Response {
57+
execute_sql(state, query).await
58+
}
59+
60+
async fn get_catalog_handler(state: State<ExecutionContext>) -> Response {
61+
execute_sql(state, "SHOW TABLES".to_string()).await
62+
}
63+
64+
#[derive(Deserialize)]
65+
struct GetTableParams {
66+
catalog: String,
67+
schema: String,
68+
table: String,
69+
}
70+
71+
async fn get_table_handler(
72+
state: State<ExecutionContext>,
73+
Path(params): Path<GetTableParams>,
74+
) -> Response {
75+
let GetTableParams {
76+
catalog,
77+
schema,
78+
table,
79+
} = params;
80+
let sql = format!("SELECT * FROM \"{catalog}\".\"{schema}\".\"{table}\"");
81+
execute_sql(state, sql).await
82+
}
83+
84+
async fn execute_sql(State(state): State<ExecutionContext>, sql: String) -> Response {
85+
info!("Executing sql: {sql}");
86+
let results = state.execute_sql(&sql).await;
5687
match results {
5788
Ok(mut batch_stream) => {
5889
let mut buf: Cursor<Vec<u8>> = Cursor::new(Vec::new());

0 commit comments

Comments
 (0)