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>(&self, _txn: &mut StandardTransaction<'a>, ctx: GeneratorContext) -> crate::Result<Columns> {
21		// Extract parameters: start and end
22		let params = &ctx.params;
23
24		assert_eq!(params.len(), 2, "generate_series requires exactly 2 parameters: start and end");
25
26		// Get start value
27		let start_column = params.get(0).unwrap();
28		let start_value = match start_column.data() {
29			ColumnData::Int4(container) => container.get(0).copied().unwrap_or(1),
30			_ => panic!("start parameter must be an integer"),
31		};
32
33		// Get end value
34		let end_column = params.get(1).unwrap();
35		let end_value = match end_column.data() {
36			ColumnData::Int4(container) => container.get(0).copied().unwrap_or(10),
37			_ => panic!("end parameter must be an integer"),
38		};
39
40		// Generate the series
41		let series: Vec<i32> = (start_value..=end_value).collect();
42		let series_column = Column::int4("value", series);
43
44		Ok(Columns::new(vec![series_column]))
45	}
46}