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>(&self, _txn: &mut StandardTransaction<'a>, ctx: GeneratorContext) -> crate::Result<Columns> {
21 let params = &ctx.params;
23
24 assert_eq!(params.len(), 2, "generate_series requires exactly 2 parameters: start and end");
25
26 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 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 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}