reifydb_sub_flow/operator/transform/
mod.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::interface::FlowNodeId;
5use reifydb_rql::expression::Expression;
6
7use crate::operator::{BoxedOperator, Operator};
8
9pub mod registry;
10
11pub trait TransformOperator: Operator {}
12
13pub trait TransformOperatorFactory: Send + Sync {
14	fn create_from_expressions(node: FlowNodeId, expressions: &[Expression]) -> crate::Result<BoxedOperator>;
15}
16
17pub mod extract {
18	use reifydb_rql::expression::ConstantExpression;
19
20	use super::*;
21
22	pub fn int(expr: &Expression) -> crate::Result<i64> {
23		match expr {
24			Expression::Constant(ConstantExpression::Number {
25				fragment,
26			}) => {
27				// Parse the number from the fragment text
28				let text = fragment.text();
29				text.parse::<i64>().map_err(|_| panic!("Failed to parse integer from: {}", text))
30			}
31			_ => panic!("Expected integer value"),
32		}
33	}
34
35	/// Extract float from expression
36	pub fn float(expr: &Expression) -> crate::Result<f64> {
37		match expr {
38			Expression::Constant(ConstantExpression::Number {
39				fragment,
40			}) => {
41				// Parse the number from the fragment text
42				let text = fragment.text();
43				text.parse::<f64>().map_err(|_| panic!("Failed to parse float from: {}", text))
44			}
45			_ => panic!("Expected numeric value"),
46		}
47	}
48
49	/// Extract string from expression
50	pub fn string(expr: &Expression) -> crate::Result<String> {
51		match expr {
52			Expression::Constant(ConstantExpression::Text {
53				fragment,
54			}) => Ok(fragment.text().to_string()),
55			Expression::Column(col) => {
56				// Fragment is now fully owned, just get the text
57				Ok(col.0.name.text().to_string())
58			}
59			_ => panic!("Expected string value"),
60		}
61	}
62}