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(
15		node: FlowNodeId,
16		expressions: &[Expression<'static>],
17	) -> crate::Result<BoxedOperator>;
18}
19
20pub mod extract {
21	use reifydb_rql::expression::ConstantExpression;
22
23	use super::*;
24
25	pub fn int(expr: &Expression) -> crate::Result<i64> {
26		match expr {
27			Expression::Constant(ConstantExpression::Number {
28				fragment,
29			}) => {
30				// Parse the number from the fragment text
31				let text = fragment.text();
32				text.parse::<i64>().map_err(|_| panic!("Failed to parse integer from: {}", text))
33			}
34			_ => panic!("Expected integer value"),
35		}
36	}
37
38	/// Extract float from expression
39	pub fn float(expr: &Expression) -> crate::Result<f64> {
40		match expr {
41			Expression::Constant(ConstantExpression::Number {
42				fragment,
43			}) => {
44				// Parse the number from the fragment text
45				let text = fragment.text();
46				text.parse::<f64>().map_err(|_| panic!("Failed to parse float from: {}", text))
47			}
48			_ => panic!("Expected numeric value"),
49		}
50	}
51
52	/// Extract string from expression
53	pub fn string(expr: &Expression) -> crate::Result<String> {
54		match expr {
55			Expression::Constant(ConstantExpression::Text {
56				fragment,
57			}) => Ok(fragment.text().to_string()),
58			Expression::Column(col) => {
59				// Convert Fragment to string
60				match &col.0.name {
61					reifydb_type::Fragment::Owned(owned) => Ok(owned.to_string()),
62					reifydb_type::Fragment::Borrowed(borrowed) => Ok(borrowed.text().to_string()),
63					_ => unimplemented!(),
64				}
65			}
66			_ => panic!("Expected string value"),
67		}
68	}
69}