Skip to main content

uqa_client/
sql_batch_execution.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7use std::collections::BTreeMap;
8use std::fmt;
9
10use serde::Deserialize;
11use uqa_core::Value;
12use uqa_sql::SQLResult;
13
14/// Results from one atomically executed HTTP SQL batch.
15pub struct SQLBatchExecution {
16    results: Vec<SQLResult>,
17    request_id: String,
18}
19
20#[derive(Deserialize)]
21pub(crate) struct SQLBatchWireResponse {
22    results: Vec<SQLStatementWireResponse>,
23    pub request_id: String,
24}
25
26#[derive(Deserialize)]
27struct SQLStatementWireResponse {
28    columns: Vec<String>,
29    rows: Vec<BTreeMap<String, Value>>,
30    affected_rows: u64,
31}
32
33impl SQLBatchExecution {
34    pub(crate) fn from_wire(response: SQLBatchWireResponse) -> Self {
35        let results = response
36            .results
37            .into_iter()
38            .map(|result| {
39                let column_types = vec![None; result.columns.len()];
40                SQLResult {
41                    columns: result.columns,
42                    column_types,
43                    rows: result.rows,
44                    positional_rows: None,
45                    affected_rows: result.affected_rows,
46                }
47            })
48            .collect();
49        Self {
50            results,
51            request_id: response.request_id,
52        }
53    }
54
55    pub fn results(&self) -> &[SQLResult] {
56        &self.results
57    }
58
59    pub fn request_id(&self) -> &str {
60        &self.request_id
61    }
62
63    pub fn into_results(self) -> Vec<SQLResult> {
64        self.results
65    }
66}
67
68impl fmt::Debug for SQLBatchExecution {
69    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
70        formatter
71            .debug_struct("SQLBatchExecution")
72            .field("request_id", &self.request_id)
73            .field("results", &"[REDACTED]")
74            .finish()
75    }
76}