llkv_runtime/
runtime_statement_result.rs1use std::fmt;
2use std::sync::Arc;
3
4use arrow::datatypes::Schema;
5use llkv_result::{Error, Result};
6use llkv_storage::pager::Pager;
7use simd_r_drive_entry_handle::EntryHandle;
8
9use crate::{SelectExecution, TransactionKind};
10
11#[derive(Clone)]
12pub enum RuntimeStatementResult<P>
13where
14 P: Pager<Blob = EntryHandle> + Send + Sync,
15{
16 CreateTable {
17 table_name: String,
18 },
19 CreateIndex {
20 table_name: String,
21 index_name: Option<String>,
22 },
23 NoOp,
24 Insert {
25 table_name: String,
26 rows_inserted: usize,
27 },
28 Update {
29 table_name: String,
30 rows_updated: usize,
31 },
32 Delete {
33 table_name: String,
34 rows_deleted: usize,
35 },
36 Select {
37 table_name: String,
38 schema: Arc<Schema>,
39 execution: Box<SelectExecution<P>>,
40 },
41 Transaction {
42 kind: TransactionKind,
43 },
44}
45
46impl<P> fmt::Debug for RuntimeStatementResult<P>
47where
48 P: Pager<Blob = EntryHandle> + Send + Sync,
49{
50 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
51 match self {
52 RuntimeStatementResult::CreateTable { table_name } => f
53 .debug_struct("CreateTable")
54 .field("table_name", table_name)
55 .finish(),
56 RuntimeStatementResult::CreateIndex {
57 table_name,
58 index_name,
59 } => f
60 .debug_struct("CreateIndex")
61 .field("table_name", table_name)
62 .field("index_name", index_name)
63 .finish(),
64 RuntimeStatementResult::NoOp => f.debug_struct("NoOp").finish(),
65 RuntimeStatementResult::Insert {
66 table_name,
67 rows_inserted,
68 } => f
69 .debug_struct("Insert")
70 .field("table_name", table_name)
71 .field("rows_inserted", rows_inserted)
72 .finish(),
73 RuntimeStatementResult::Update {
74 table_name,
75 rows_updated,
76 } => f
77 .debug_struct("Update")
78 .field("table_name", table_name)
79 .field("rows_updated", rows_updated)
80 .finish(),
81 RuntimeStatementResult::Delete {
82 table_name,
83 rows_deleted,
84 } => f
85 .debug_struct("Delete")
86 .field("table_name", table_name)
87 .field("rows_deleted", rows_deleted)
88 .finish(),
89 RuntimeStatementResult::Select {
90 table_name, schema, ..
91 } => f
92 .debug_struct("Select")
93 .field("table_name", table_name)
94 .field("schema", schema)
95 .finish(),
96 RuntimeStatementResult::Transaction { kind } => {
97 f.debug_struct("Transaction").field("kind", kind).finish()
98 }
99 }
100 }
101}
102
103impl<P> RuntimeStatementResult<P>
104where
105 P: Pager<Blob = EntryHandle> + Send + Sync,
106{
107 #[allow(dead_code)]
110 pub(crate) fn convert_pager_type<Q>(self) -> Result<RuntimeStatementResult<Q>>
111 where
112 Q: Pager<Blob = EntryHandle> + Send + Sync,
113 {
114 match self {
115 RuntimeStatementResult::CreateTable { table_name } => {
116 Ok(RuntimeStatementResult::CreateTable { table_name })
117 }
118 RuntimeStatementResult::CreateIndex {
119 table_name,
120 index_name,
121 } => Ok(RuntimeStatementResult::CreateIndex {
122 table_name,
123 index_name,
124 }),
125 RuntimeStatementResult::NoOp => Ok(RuntimeStatementResult::NoOp),
126 RuntimeStatementResult::Insert {
127 table_name,
128 rows_inserted,
129 } => Ok(RuntimeStatementResult::Insert {
130 table_name,
131 rows_inserted,
132 }),
133 RuntimeStatementResult::Update {
134 table_name,
135 rows_updated,
136 } => Ok(RuntimeStatementResult::Update {
137 table_name,
138 rows_updated,
139 }),
140 RuntimeStatementResult::Delete {
141 table_name,
142 rows_deleted,
143 } => Ok(RuntimeStatementResult::Delete {
144 table_name,
145 rows_deleted,
146 }),
147 RuntimeStatementResult::Transaction { kind } => {
148 Ok(RuntimeStatementResult::Transaction { kind })
149 }
150 RuntimeStatementResult::Select { .. } => Err(Error::Internal(
151 "Cannot convert SELECT result between pager types in transaction".into(),
152 )),
153 }
154 }
155}