reifydb_engine/function/
generator.rs1use 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 let params = &ctx.params;
27
28 assert_eq!(params.len(), 2, "generate_series requires exactly 2 parameters: start and end");
29
30 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 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 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}