Skip to main content

drasi_functions_gql/
lib.rs

1// Copyright 2024 The Drasi Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use 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}