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