reifydb_engine/function/
generator.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use reifydb_core::value::column::{Column, ColumnData, Columns};
5
6use crate::{
7	StandardTransaction,
8	function::{GeneratorContext, GeneratorFunction},
9};
10
11pub struct GenerateSeries;
12
13impl GenerateSeries {
14	pub fn new() -> Self {
15		Self {}
16	}
17}
18
19impl GeneratorFunction for GenerateSeries {
20	fn generate<'a>(
21		&self,
22		_txn: &mut StandardTransaction<'a>,
23		ctx: GeneratorContext<'a>,
24	) -> crate::Result<Columns<'a>> {
25		// Extract parameters: start and end
26		let params = &ctx.params;
27
28		assert_eq!(params.len(), 2, "generate_series requires exactly 2 parameters: start and end");
29
30		// Get start value
31		let start_column = params.get(0).unwrap();
32		let start_value = match start_column.data() {
33			ColumnData::Int4(container) => container.get(0).copied().unwrap_or(1),
34			_ => panic!("start parameter must be an integer"),
35		};
36
37		// Get end value
38		let end_column = params.get(1).unwrap();
39		let end_value = match end_column.data() {
40			ColumnData::Int4(container) => container.get(0).copied().unwrap_or(10),
41			_ => panic!("end parameter must be an integer"),
42		};
43
44		// Generate the series
45		let series: Vec<i32> = (start_value..=end_value).collect();
46		let series_column = Column::int4("value", series);
47
48		Ok(Columns::new(vec![series_column]))
49	}
50}