reifydb_engine/function/math/scalar/
max.rs1use reifydb_core::value::column::ColumnData;
5
6use crate::function::{ScalarFunction, ScalarFunctionContext};
7
8pub struct Max;
9
10impl Max {
11 pub fn new() -> Self {
12 Self
13 }
14}
15
16impl ScalarFunction for Max {
17 fn scalar(&self, ctx: ScalarFunctionContext) -> crate::Result<ColumnData> {
18 let columns = ctx.columns;
19 let row_count = ctx.row_count;
20
21 if columns.is_empty() {
22 return Ok(ColumnData::int4(Vec::<i32>::new()));
23 }
24
25 let first_column = columns.get(0).unwrap();
27
28 match first_column.data() {
29 ColumnData::Int1(_) => {
30 let mut result = Vec::with_capacity(row_count);
31
32 for row_idx in 0..row_count {
33 let mut max_value: Option<i8> = None;
34
35 for column in columns.iter() {
37 if let ColumnData::Int1(container) = column.data() {
38 if let Some(value) = container.get(row_idx) {
39 max_value = Some(match max_value {
40 None => *value,
41 Some(current_max) => current_max.max(*value),
42 });
43 }
44 }
45 }
46
47 result.push(max_value.unwrap_or(0));
48 }
49
50 Ok(ColumnData::int1(result))
51 }
52 ColumnData::Int2(_) => {
53 let mut result = Vec::with_capacity(row_count);
54
55 for row_idx in 0..row_count {
56 let mut max_value: Option<i16> = None;
57
58 for column in columns.iter() {
60 if let ColumnData::Int2(container) = column.data() {
61 if let Some(value) = container.get(row_idx) {
62 max_value = Some(match max_value {
63 None => *value,
64 Some(current_max) => current_max.max(*value),
65 });
66 }
67 }
68 }
69
70 result.push(max_value.unwrap_or(0));
71 }
72
73 Ok(ColumnData::int2(result))
74 }
75 ColumnData::Int4(_) => {
76 let mut result = Vec::with_capacity(row_count);
77
78 for row_idx in 0..row_count {
79 let mut max_value: Option<i32> = None;
80
81 for column in columns.iter() {
83 if let ColumnData::Int4(container) = column.data() {
84 if let Some(value) = container.get(row_idx) {
85 max_value = Some(match max_value {
86 None => *value,
87 Some(current_max) => current_max.max(*value),
88 });
89 }
90 }
91 }
92
93 result.push(max_value.unwrap_or(0));
94 }
95
96 Ok(ColumnData::int4(result))
97 }
98 ColumnData::Int8(_) => {
99 let mut result = Vec::with_capacity(row_count);
100
101 for row_idx in 0..row_count {
102 let mut max_value: Option<i64> = None;
103
104 for column in columns.iter() {
106 if let ColumnData::Int8(container) = column.data() {
107 if let Some(value) = container.get(row_idx) {
108 max_value = Some(match max_value {
109 None => *value,
110 Some(current_max) => current_max.max(*value),
111 });
112 }
113 }
114 }
115
116 result.push(max_value.unwrap_or(0));
117 }
118
119 Ok(ColumnData::int8(result))
120 }
121 _ => unimplemented!("Max function currently supports integer types only"),
122 }
123 }
124}