Skip to main content

reifydb_engine/vm/volcano/
mod.rs

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