llkv_runtime/
runtime_statement_result.rs

1use 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    /// Convert a StatementResult from one pager type to another.
108    /// Only works for non-SELECT results (CreateTable, Insert, Update, Delete, NoOp, Transaction).
109    #[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}