Skip to main content

reifydb_core/
execution.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}