drasi_functions_gql/
lib.rs1use std::sync::Arc;
16
17use drasi_core::evaluation::functions::*;
18
19use drasi_core::evaluation::functions::FunctionRegistry;
20#[cfg(test)]
21mod tests;
22
23mod gql_scalar;
24use gql_scalar::Cast;
25
26pub trait GQLFunctionSet {
27 fn with_gql_function_set(self) -> Arc<FunctionRegistry>;
28}
29
30impl GQLFunctionSet for Arc<FunctionRegistry> {
31 fn with_gql_function_set(self) -> Arc<FunctionRegistry> {
32 register_default_gql_functions(&self);
33 self
34 }
35}
36
37pub fn register_default_gql_functions(registry: &FunctionRegistry) {
38 register_text_functions(registry);
39 register_numeric_functions(registry);
40 register_trigonometric_functions(registry);
41 register_gql_scalar_functions(registry);
42 register_list_functions(registry);
43 register_metadata_functions(registry);
44 register_drasi_functions(registry);
45 register_context_mutators(registry);
46 register_aggregation_functions(registry);
47 register_temporal_instant_functions(registry);
48 register_temporal_duration_functions(registry);
49}
50
51fn register_text_functions(registry: &FunctionRegistry) {
52 registry.register_function("upper", Function::Scalar(Arc::new(ToUpper {})));
53 registry.register_function("lower", Function::Scalar(Arc::new(ToLower {})));
54 registry.register_function("trim", Function::Scalar(Arc::new(Trim {})));
55 registry.register_function("ltrim", Function::Scalar(Arc::new(LTrim {})));
56 registry.register_function("rtrim", Function::Scalar(Arc::new(RTrim {})));
57 registry.register_function("reverse", Function::Scalar(Arc::new(Reverse {})));
58 registry.register_function("left", Function::Scalar(Arc::new(Left {})));
59 registry.register_function("right", Function::Scalar(Arc::new(Right {})));
60 registry.register_function("replace", Function::Scalar(Arc::new(Replace {})));
61 registry.register_function("split", Function::Scalar(Arc::new(Split {})));
62 registry.register_function("substring", Function::Scalar(Arc::new(Substring {})));
63}
64
65fn register_numeric_functions(registry: &FunctionRegistry) {
66 registry.register_function("abs", Function::Scalar(Arc::new(Abs {})));
67 registry.register_function("ceil", Function::Scalar(Arc::new(Ceil {})));
68 registry.register_function("floor", Function::Scalar(Arc::new(Floor {})));
69 registry.register_function("round", Function::Scalar(Arc::new(Round {})));
70}
71
72fn register_trigonometric_functions(registry: &FunctionRegistry) {
73 registry.register_function("cos", Function::Scalar(Arc::new(Cos {})));
74 registry.register_function("degrees", Function::Scalar(Arc::new(Degrees {})));
75 registry.register_function("pi", Function::Scalar(Arc::new(Pi {})));
76 registry.register_function("radians", Function::Scalar(Arc::new(Radians {})));
77 registry.register_function("sin", Function::Scalar(Arc::new(Sin {})));
78 registry.register_function("tan", Function::Scalar(Arc::new(Tan {})));
79}
80
81fn register_gql_scalar_functions(registry: &FunctionRegistry) {
82 registry.register_function("char_length", Function::Scalar(Arc::new(CharLength {})));
83 registry.register_function("size", Function::Scalar(Arc::new(Size {})));
84 registry.register_function("coalesce", Function::Scalar(Arc::new(Coalesce {})));
85 registry.register_function("nullIf", Function::Scalar(Arc::new(NullIf {})));
86 registry.register_function("last", Function::Scalar(Arc::new(CypherLast {})));
87 registry.register_function("cast", Function::Scalar(Arc::new(Cast {})));
88}
89
90fn register_list_functions(registry: &FunctionRegistry) {
91 registry.register_function("reduce", Function::LazyScalar(Arc::new(Reduce::new())));
92}
93
94fn register_metadata_functions(registry: &FunctionRegistry) {
95 registry.register_function("element_id", Function::Scalar(Arc::new(ElementId {})));
96 registry.register_function(
97 "drasi.changeDateTime",
98 Function::Scalar(Arc::new(ChangeDateTime {})),
99 );
100}
101
102fn register_drasi_functions(registry: &FunctionRegistry) {
103 registry.register_function("drasi.listMax", Function::Scalar(Arc::new(DrasiMax {})));
104 registry.register_function("drasi.listMin", Function::Scalar(Arc::new(DrasiMin {})));
105 registry.register_function("drasi.stdevp", Function::Scalar(Arc::new(DrasiStdevP {})));
106}
107
108fn register_context_mutators(registry: &FunctionRegistry) {
109 registry.register_function(
110 "retainHistory",
111 Function::ContextMutator(Arc::new(RetainHistory {})),
112 );
113}
114
115fn register_aggregation_functions(registry: &FunctionRegistry) {
116 registry.register_function("sum", Function::Aggregating(Arc::new(Sum {})));
117 registry.register_function("avg", Function::Aggregating(Arc::new(Avg {})));
118 registry.register_function("count", Function::Aggregating(Arc::new(Count {})));
119 registry.register_function("min", Function::Aggregating(Arc::new(Min {})));
120 registry.register_function("max", Function::Aggregating(Arc::new(Max {})));
121 registry.register_function(
122 "drasi.linearGradient",
123 Function::Aggregating(Arc::new(LinearGradient {})),
124 );
125 registry.register_function(
126 "drasi.last",
127 Function::Aggregating(Arc::new(AggregatingLast {})),
128 );
129}
130
131fn register_temporal_instant_functions(registry: &FunctionRegistry) {
132 registry.register_function("date", Function::Scalar(Arc::new(Date {})));
133 registry.register_function("zoned_time", Function::Scalar(Arc::new(Time {})));
134 registry.register_function("local_time", Function::Scalar(Arc::new(LocalTime {})));
135 registry.register_function("zoned_datetime", Function::Scalar(Arc::new(DateTime {})));
136 registry.register_function(
137 "local_datetime",
138 Function::Scalar(Arc::new(LocalDateTime {})),
139 );
140}
141
142fn register_temporal_duration_functions(registry: &FunctionRegistry) {
143 registry.register_function("duration_between", Function::Scalar(Arc::new(Between {})));
144 registry.register_function("duration.inMonths", Function::Scalar(Arc::new(InMonths {})));
145 registry.register_function("duration.inDays", Function::Scalar(Arc::new(InDays {})));
146 registry.register_function(
147 "duration.inSeconds",
148 Function::Scalar(Arc::new(InSeconds {})),
149 );
150 registry.register_function("duration", Function::Scalar(Arc::new(DurationFunc {})));
151}