databend_client/
response.rsuse crate::error_code::ErrorCode;
use crate::session::SessionState;
use serde::Deserialize;
#[derive(Deserialize, Debug)]
pub struct QueryStats {
#[serde(flatten)]
pub progresses: Progresses,
pub running_time_ms: f64,
}
#[derive(Deserialize, Debug)]
pub struct Progresses {
pub scan_progress: ProgressValues,
pub write_progress: ProgressValues,
pub result_progress: ProgressValues,
pub total_scan: Option<ProgressValues>,
}
impl Progresses {
pub fn has_progress(&self) -> bool {
self.scan_progress.bytes > 0
|| self.scan_progress.rows > 0
|| self.write_progress.bytes > 0
|| self.write_progress.rows > 0
|| self.result_progress.bytes > 0
|| self.result_progress.rows > 0
|| self
.total_scan
.as_ref()
.map_or(false, |v| v.bytes > 0 || v.rows > 0)
}
}
#[derive(Debug, Deserialize)]
pub struct ProgressValues {
pub rows: usize,
pub bytes: usize,
}
#[derive(Deserialize, Debug, Clone)]
pub struct SchemaField {
pub name: String,
#[serde(rename = "type")]
pub data_type: String,
}
#[derive(Deserialize, Debug)]
pub struct QueryResponse {
pub id: String,
pub node_id: Option<String>,
pub session_id: Option<String>,
pub session: Option<SessionState>,
pub schema: Vec<SchemaField>,
pub data: Vec<Vec<Option<String>>>,
pub state: String,
pub error: Option<ErrorCode>,
pub warnings: Option<Vec<String>>,
pub stats: QueryStats,
pub stats_uri: Option<String>,
pub final_uri: Option<String>,
pub next_uri: Option<String>,
pub kill_uri: Option<String>,
}
#[cfg(test)]
mod test {
use std::collections::BTreeMap;
use super::*;
#[test]
fn deserialize_session_config() {
let session_json = r#"{"database":"default","settings":{}}"#;
let session_config: SessionState = serde_json::from_str(session_json).unwrap();
assert_eq!(session_config.database, Some("default".to_string()));
assert_eq!(session_config.settings, Some(BTreeMap::default()));
assert_eq!(session_config.role, None);
assert_eq!(session_config.secondary_roles, None);
let session_json = r#"{"database":"default","settings":{},"role": "role1", "secondary_roles": [], "unknown_field": 1}"#;
let session_config: SessionState = serde_json::from_str(session_json).unwrap();
assert_eq!(session_config.database, Some("default".to_string()));
assert_eq!(session_config.settings, Some(BTreeMap::default()));
assert_eq!(session_config.role, Some("role1".to_string()));
assert_eq!(session_config.secondary_roles, Some(vec![]));
}
}