reifydb_core/
execution.rs1use std::ops::Deref;
5
6use reifydb_value::{
7 error::Error,
8 value::{
9 frame::frame::Frame,
10 system_columns::{SystemColumn, keep_system_columns},
11 },
12};
13
14use crate::{internal_err, metrics::execution::ExecutionMetrics};
15
16#[derive(Debug)]
17pub struct ExecutionResult {
18 pub frames: Vec<Frame>,
19 pub named_system_columns: Vec<Vec<SystemColumn>>,
20 pub error: Option<Error>,
21 pub metrics: ExecutionMetrics,
22}
23
24impl ExecutionResult {
25 pub fn from_error(error: Error) -> Self {
26 Self {
27 frames: vec![],
28 named_system_columns: vec![],
29 error: Some(error),
30 metrics: ExecutionMetrics::default(),
31 }
32 }
33
34 pub fn strip_unnamed_system_columns(&mut self) -> Result<(), Error> {
35 if self.frames.len() != self.named_system_columns.len() {
36 return internal_err!(
37 "{} frames but {} named system column sets; every frame needs exactly one",
38 self.frames.len(),
39 self.named_system_columns.len()
40 );
41 }
42 for (frame, named) in self.frames.iter_mut().zip(&self.named_system_columns) {
43 let mut keep = named.clone();
44 keep.push(SystemColumn::RowNumbers);
45 frame.batch = keep_system_columns(&frame.batch, &keep)?;
46 }
47 Ok(())
48 }
49
50 pub fn is_ok(&self) -> bool {
51 self.error.is_none()
52 }
53
54 pub fn is_err(&self) -> bool {
55 self.error.is_some()
56 }
57
58 pub fn check(self) -> Result<Self, Error> {
59 match self.error {
60 Some(e) => Err(e),
61 None => Ok(self),
62 }
63 }
64}
65
66impl Deref for ExecutionResult {
67 type Target = [Frame];
68
69 fn deref(&self) -> &[Frame] {
70 &self.frames
71 }
72}