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                    kind: uqa_sql::SQLResultKind::Unknown,
42                    command_tag: None,
43                    columns: result.columns,
44                    column_types,
45                    rows: result.rows,
46                    positional_rows: None,
47                    affected_rows: result.affected_rows,
48                }
49            })
50            .collect();
51        Self {
52            results,
53            request_id: response.request_id,
54        }
55    }
56
57    pub fn results(&self) -> &[SQLResult] {
58        &self.results
59    }
60
61    pub fn request_id(&self) -> &str {
62        &self.request_id
63    }
64
65    pub fn into_results(self) -> Vec<SQLResult> {
66        self.results
67    }
68}
69
70impl fmt::Debug for SQLBatchExecution {
71    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
72        formatter
73            .debug_struct("SQLBatchExecution")
74            .field("request_id", &self.request_id)
75            .field("results", &"[REDACTED]")
76            .finish()
77    }
78}