Skip to main content

reifydb_engine/vm/volcano/
run_tests.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use std::sync::Arc;
5
6use reifydb_core::value::column::{columns::Columns, headers::ColumnHeaders};
7use reifydb_rql::nodes::RunTestsNode;
8use reifydb_transaction::transaction::Transaction;
9
10use crate::{
11	Result,
12	run_tests::run::run_tests,
13	vm::{
14		services::Services,
15		stack::SymbolTable,
16		vm::{EMPTY_PARAMS, Vm},
17		volcano::query::{QueryContext, QueryNode},
18	},
19};
20
21pub(crate) struct RunTestsQueryNode {
22	node: RunTestsNode,
23	services: Arc<Services>,
24	symbols: SymbolTable,
25	executed: bool,
26}
27
28impl RunTestsQueryNode {
29	pub fn new(node: RunTestsNode, context: Arc<QueryContext>) -> Self {
30		Self {
31			node,
32			services: context.services.clone(),
33			symbols: context.symbols.clone(),
34			executed: false,
35		}
36	}
37}
38
39impl QueryNode for RunTestsQueryNode {
40	fn initialize<'a>(&mut self, _rx: &mut Transaction<'a>, _ctx: &QueryContext) -> Result<()> {
41		Ok(())
42	}
43
44	fn next<'a>(&mut self, rx: &mut Transaction<'a>, ctx: &mut QueryContext) -> Result<Option<Columns>> {
45		if self.executed {
46			return Ok(None);
47		}
48		self.executed = true;
49
50		let mut vm = Vm::from_services(self.symbols.clone(), &self.services, &EMPTY_PARAMS, ctx.identity);
51		let columns = run_tests(&mut vm, &self.services, rx, self.node.clone())?;
52		Ok(Some(columns))
53	}
54
55	fn headers(&self) -> Option<ColumnHeaders> {
56		None
57	}
58}