Skip to main content

reifydb_engine/vm/volcano/
query.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use std::sync::Arc;
5
6use reifydb_core::{
7	interface::resolved::ResolvedShape,
8	value::column::{columns::Columns, headers::ColumnHeaders},
9};
10use reifydb_transaction::transaction::Transaction;
11use reifydb_type::{params::Params, value::identity::IdentityId};
12
13use crate::{
14	Result,
15	vm::{services::Services, stack::SymbolTable},
16};
17
18pub trait QueryNode: Send + Sync {
19	fn initialize<'a>(&mut self, rx: &mut Transaction<'a>, ctx: &QueryContext) -> Result<()>;
20
21	fn next<'a>(&mut self, rx: &mut Transaction<'a>, ctx: &mut QueryContext) -> Result<Option<Columns>>;
22
23	fn headers(&self) -> Option<ColumnHeaders>;
24}
25
26#[derive(Clone)]
27pub struct QueryContext {
28	pub services: Arc<Services>,
29	pub source: Option<ResolvedShape>,
30	pub batch_size: u64,
31	pub params: Params,
32	pub symbols: SymbolTable,
33	pub identity: IdentityId,
34}
35
36impl QueryNode for Box<dyn QueryNode> {
37	fn initialize<'a>(&mut self, rx: &mut Transaction<'a>, ctx: &QueryContext) -> Result<()> {
38		(**self).initialize(rx, ctx)
39	}
40
41	fn next<'a>(&mut self, rx: &mut Transaction<'a>, ctx: &mut QueryContext) -> Result<Option<Columns>> {
42		let result = (**self).next(rx, ctx)?;
43		if let Some(ref columns) = result {
44			columns.assert_invariants("QueryNode::next output");
45		}
46		Ok(result)
47	}
48
49	fn headers(&self) -> Option<ColumnHeaders> {
50		(**self).headers()
51	}
52}