Skip to main content

reifydb_engine/vm/volcano/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4//! Volcano-style execution: open/next/close iterator pipeline that pulls rows through scans, joins, and other
5//! relational operators a row-at-a-time (or column-batch-at-a-time). Sits alongside the vectorised path; the
6//! planner picks one based on the shape of the query and the cost model.
7
8use reifydb_core::{
9	interface::catalog::dictionary::Dictionary,
10	value::column::{buffer::ColumnBuffer, columns::Columns},
11};
12use reifydb_transaction::transaction::Transaction;
13use reifydb_type::value::{Value, dictionary::DictionaryEntryId};
14
15use crate::{Result, transaction::operation::dictionary::DictionaryOperations};
16
17pub(crate) fn decode_dictionary_columns(
18	columns: &mut Columns,
19	dictionaries: &[Option<Dictionary>],
20	rx: &mut Transaction,
21) -> Result<()> {
22	for (col_idx, dict_opt) in dictionaries.iter().enumerate() {
23		if let Some(dictionary) = dict_opt {
24			if col_idx >= columns.len() {
25				continue;
26			}
27			let col = &columns[col_idx];
28			let row_count = col.len();
29			let mut new_data = ColumnBuffer::with_capacity(dictionary.value_type.clone(), row_count);
30			for row_idx in 0..row_count {
31				let id_value = col.get_value(row_idx);
32				if let Some(entry_id) = DictionaryEntryId::from_value(&id_value) {
33					match rx.get_from_dictionary(dictionary, entry_id)? {
34						Some(decoded) => new_data.push_value(decoded),
35						None => new_data.push_value(Value::none()),
36					}
37				} else {
38					new_data.push_value(Value::none());
39				}
40			}
41			columns.columns.make_mut()[col_idx] = new_data;
42		}
43	}
44	Ok(())
45}
46
47use query::{QueryContext, QueryNode};
48use reifydb_core::value::column::headers::ColumnHeaders;
49
50pub(crate) struct NoopNode;
51
52impl QueryNode for NoopNode {
53	fn initialize<'a>(&mut self, _: &mut Transaction<'a>, _: &QueryContext) -> Result<()> {
54		Ok(())
55	}
56	fn next<'a>(&mut self, _: &mut Transaction<'a>, _: &mut QueryContext) -> Result<Option<Columns>> {
57		Ok(None)
58	}
59	fn headers(&self) -> Option<ColumnHeaders> {
60		None
61	}
62}
63
64pub mod aggregate;
65pub mod apply_transform;
66pub mod assert;
67pub mod compile;
68pub mod distinct;
69pub mod environment;
70pub mod extend;
71pub mod filter;
72pub mod generator;
73pub mod inline;
74pub mod join;
75pub mod map;
76pub mod patch;
77pub mod query;
78pub mod row_lookup;
79pub mod run_tests;
80pub mod scalarize;
81pub mod scan;
82pub mod sort;
83pub mod take;
84pub mod top_k;
85pub(crate) mod udf;
86pub mod variable;