reifydb_sub_flow/operator/transform/
mod.rs1use 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 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 pub fn float(expr: &Expression) -> crate::Result<f64> {
40 match expr {
41 Expression::Constant(ConstantExpression::Number {
42 fragment,
43 }) => {
44 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 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 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}