use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct CancelQueryRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CancelQueryResponse {
pub query_id: u64,
pub cancelled: bool,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunningQueryInfo {
pub query_id: u64,
pub sql: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub session_id: Option<u64>,
pub user_name: String,
pub database: String,
pub state: String,
pub started_at: String,
pub elapsed_ms: u64,
pub rows_processed: u64,
pub cancellable: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunningQueriesResponse {
pub queries: Vec<RunningQueryInfo>,
pub total: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueryStatusResponse {
pub query: RunningQueryInfo,
pub is_running: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct CancelSessionQueriesRequest {
pub session_id: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkCancelResponse {
pub cancelled_count: usize,
pub message: String,
}
impl From<&crate::compute::RunningQuery> for RunningQueryInfo {
fn from(query: &crate::compute::RunningQuery) -> Self {
Self {
query_id: query.query_id,
sql: query.sql.clone(),
session_id: query.session_id,
user_name: query.user_name.clone(),
database: query.database.clone(),
state: query.state.to_string(),
started_at: query.started_at.to_rfc3339(),
elapsed_ms: query.elapsed.as_millis() as u64,
rows_processed: query.rows_processed,
cancellable: query.cancellable,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cancel_query_request_serialization() {
let request = CancelQueryRequest {
reason: Some("User requested".to_string()),
};
let json = serde_json::to_string(&request).unwrap();
let deserialized: CancelQueryRequest = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized.reason, Some("User requested".to_string()));
}
#[test]
fn test_running_queries_response_serialization() {
let response = RunningQueriesResponse {
queries: vec![RunningQueryInfo {
query_id: 1,
sql: "SELECT * FROM users".to_string(),
session_id: Some(42),
user_name: "alice".to_string(),
database: "test".to_string(),
state: "executing".to_string(),
started_at: "2024-01-01T00:00:00Z".to_string(),
elapsed_ms: 1000,
rows_processed: 100,
cancellable: true,
}],
total: 1,
};
let json = serde_json::to_string(&response).unwrap();
let deserialized: RunningQueriesResponse = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized.total, 1);
assert_eq!(deserialized.queries[0].query_id, 1);
}
}