1use std::collections::HashMap;
16
17use common_base::AffectedRows;
18use greptime_proto::v1::region::{RegionRequestHeader, RegionResponse as RegionResponseV1};
19
20pub const ACCEPT_PARTIAL_RESULT: &str = "accept_partial_result";
22
23pub fn set_accept_partial_result(header: &mut RegionRequestHeader) {
25 header
26 .query_context
27 .get_or_insert_with(Default::default)
28 .extensions
29 .insert(ACCEPT_PARTIAL_RESULT.to_string(), "true".to_string());
30}
31
32#[derive(Debug)]
34pub struct RegionResponse {
35 pub affected_rows: AffectedRows,
36 pub extensions: HashMap<String, Vec<u8>>,
37 pub metadata: Vec<u8>,
38}
39
40#[derive(Debug)]
42pub struct BatchRegionResponse<E> {
43 pub affected_rows: AffectedRows,
44 pub extensions: HashMap<String, Vec<u8>>,
45 pub failures: Vec<(usize, E)>,
46}
47
48impl<E> BatchRegionResponse<E> {
49 pub fn first_failure(&self) -> Option<&(usize, E)> {
51 self.failures.iter().min_by_key(|(index, _)| *index)
52 }
53}
54
55impl RegionResponse {
56 pub fn from_region_response(region_response: RegionResponseV1) -> Self {
57 Self {
58 affected_rows: region_response.affected_rows as _,
59 extensions: region_response.extensions,
60 metadata: region_response.metadata,
61 }
62 }
63
64 pub fn new(affected_rows: AffectedRows) -> Self {
66 Self {
67 affected_rows,
68 extensions: Default::default(),
69 metadata: Vec::new(),
70 }
71 }
72
73 pub fn from_metadata(metadata: Vec<u8>) -> Self {
75 Self {
76 affected_rows: 0,
77 extensions: Default::default(),
78 metadata,
79 }
80 }
81}