reifydb_engine/function/math/scalar/
max.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::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		// For max function, we need to find the maximum value across all columns for each row
26		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					// Check all columns for this row
36					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					// Check all columns for this row
59					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					// Check all columns for this row
82					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					// Check all columns for this row
105					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}