reifydb_engine/vm/volcano/
run_tests.rs1use 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}