rdf_fusion_extensions/functions/
builtin.rs

1use std::fmt;
2use thiserror::Error;
3
4/// An RDF Fusion builtin name.
5#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)]
6pub enum BuiltinName {
7    // SPARQL Builtin Scalar Functions
8    Str,
9    Lang,
10    LangMatches,
11    Datatype,
12    Iri,
13    BNode,
14    Rand,
15    Abs,
16    Ceil,
17    Floor,
18    Round,
19    Concat,
20    SubStr,
21    StrLen,
22    Replace,
23    UCase,
24    LCase,
25    EncodeForUri,
26    Contains,
27    StrStarts,
28    StrEnds,
29    StrBefore,
30    StrAfter,
31    Year,
32    Month,
33    Day,
34    Hours,
35    Minutes,
36    Seconds,
37    Timezone,
38    Tz,
39    Uuid,
40    StrUuid,
41    Md5,
42    Sha1,
43    Sha256,
44    Sha384,
45    Sha512,
46    StrLang,
47    StrDt,
48    IsIri,
49    IsBlank,
50    IsLiteral,
51    IsNumeric,
52    Regex,
53    Bound,
54    Coalesce,
55    If,
56
57    // Scalar Built-in Aggregate Functions
58    Sum,
59    Min,
60    Max,
61    Avg,
62    GroupConcat,
63
64    // Comparison functions
65    SameTerm,
66    Equal,
67    GreaterThan,
68    GreaterOrEqual,
69    LessThan,
70    LessOrEqual,
71
72    // Numeric functions
73    Add,
74    Div,
75    Mul,
76    Sub,
77    UnaryMinus,
78    UnaryPlus,
79
80    // Conversion Functions
81    CastString,
82    CastInteger,
83    AsInt,
84    CastFloat,
85    CastDouble,
86    CastDecimal,
87    CastDateTime,
88    CastBoolean,
89
90    // Encoding
91    WithSortableEncoding,
92    WithTypedValueEncoding,
93    WithPlainTermEncoding,
94
95    // Other Necessary Functions
96    EffectiveBooleanValue,
97    NativeBooleanAsTerm,
98    NativeInt64AsTerm,
99    IsCompatible,
100}
101
102impl fmt::Display for BuiltinName {
103    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
104        let name = match self {
105            Self::Str => "STR",
106            Self::Lang => "LANG",
107            Self::LangMatches => "LANGMATCHES",
108            Self::Datatype => "DATATYPE",
109            Self::Iri => "IRI",
110            Self::BNode => "BNODE",
111            Self::Rand => "RAND",
112            Self::Abs => "ABS",
113            Self::Ceil => "CEIL",
114            Self::Floor => "FLOOR",
115            Self::Round => "ROUND",
116            Self::Concat => "CONCAT",
117            Self::SubStr => "SUBSTR",
118            Self::StrLen => "STRLEN",
119            Self::Replace => "REPLACE",
120            Self::UCase => "UCASE",
121            Self::LCase => "LCASE",
122            Self::EncodeForUri => "ENCODE_FOR_URI",
123            Self::Contains => "CONTAINS",
124            Self::StrStarts => "STRSTARTS",
125            Self::StrEnds => "STRENDS",
126            Self::StrBefore => "STRBEFORE",
127            Self::StrAfter => "STRAFTER",
128            Self::Year => "YEAR",
129            Self::Month => "MONTH",
130            Self::Day => "DAY",
131            Self::Hours => "HOURS",
132            Self::Minutes => "MINUTES",
133            Self::Seconds => "SECONDS",
134            Self::Timezone => "TIMEZONE",
135            Self::Tz => "TZ",
136            Self::Uuid => "UUID",
137            Self::StrUuid => "STRUUID",
138            Self::Md5 => "MD5",
139            Self::Sha1 => "SHA1",
140            Self::Sha256 => "SHA256",
141            Self::Sha384 => "SHA384",
142            Self::Sha512 => "SHA512",
143            Self::StrLang => "STRLANG",
144            Self::StrDt => "STRDT",
145            Self::IsIri => "isIRI",
146            Self::IsBlank => "isBLANK",
147            Self::IsLiteral => "isLITERAL",
148            Self::IsNumeric => "isNUMERIC",
149            Self::Regex => "REGEX",
150            Self::If => "IF",
151            Self::SameTerm => "SAMETERM",
152            Self::Equal => "EQ",
153            Self::GreaterThan => "GT",
154            Self::GreaterOrEqual => "GEQ",
155            Self::LessThan => "LT",
156            Self::LessOrEqual => "LEQ",
157            Self::Add => "ADD",
158            Self::Div => "DIV",
159            Self::Mul => "MUL",
160            Self::Sub => "SUB",
161            Self::CastString => "xsd:string",
162            Self::CastInteger => "xsd:integer",
163            Self::AsInt => "xsd:int",
164            Self::CastFloat => "xsd:float",
165            Self::CastDouble => "xsd:double",
166            Self::CastDecimal => "xsd:decimal",
167            Self::CastDateTime => "xsd:dataTime",
168            Self::CastBoolean => "xsd:boolean",
169            Self::EffectiveBooleanValue => "EBV",
170            Self::NativeBooleanAsTerm => "BOOLEAN_AS_TERM",
171            Self::NativeInt64AsTerm => "INT64_AS_TERM",
172            Self::Bound => "BOUND",
173            Self::IsCompatible => "IS_COMPATIBLE",
174            Self::Coalesce => "COALESCE",
175            Self::UnaryMinus => "MINUS",
176            Self::UnaryPlus => "PLUS",
177            Self::Sum => "SUM",
178            Self::Min => "MIN",
179            Self::Max => "MAX",
180            Self::Avg => "AVG",
181            Self::GroupConcat => "GROUP_CONCAT",
182            Self::WithSortableEncoding => "ENC_SORT",
183            Self::WithTypedValueEncoding => "ENC_TV",
184            Self::WithPlainTermEncoding => "ENC_PT",
185        };
186        f.write_str(name)
187    }
188}
189
190#[derive(Debug, Error)]
191#[error("Function name is not a built-in function")]
192pub struct NotABuiltInError;
193
194impl TryFrom<&str> for BuiltinName {
195    type Error = NotABuiltInError;
196
197    fn try_from(value: &str) -> Result<Self, Self::Error> {
198        Ok(match value {
199            "STR" => Self::Str,
200            "LANG" => Self::Lang,
201            "LANGMATCHES" => Self::LangMatches,
202            "DATATYPE" => Self::Datatype,
203            "IRI" => Self::Iri,
204            "BNODE" => Self::BNode,
205            "RAND" => Self::Rand,
206            "ABS" => Self::Abs,
207            "CEIL" => Self::Ceil,
208            "FLOOR" => Self::Floor,
209            "ROUND" => Self::Round,
210            "CONCAT" => Self::Concat,
211            "SUBSTR" => Self::SubStr,
212            "STRLEN" => Self::StrLen,
213            "REPLACE" => Self::Replace,
214            "UCASE" => Self::UCase,
215            "LCASE" => Self::LCase,
216            "ENCODE_FOR_URI" => Self::EncodeForUri,
217            "CONTAINS" => Self::Contains,
218            "STRSTARTS" => Self::StrStarts,
219            "STRENDS" => Self::StrEnds,
220            "STRBEFORE" => Self::StrBefore,
221            "STRAFTER" => Self::StrAfter,
222            "YEAR" => Self::Year,
223            "MONTH" => Self::Month,
224            "DAY" => Self::Day,
225            "HOURS" => Self::Hours,
226            "MINUTES" => Self::Minutes,
227            "SECONDS" => Self::Seconds,
228            "TIMEZONE" => Self::Timezone,
229            "TZ" => Self::Tz,
230            "UUID" => Self::Uuid,
231            "STRUUID" => Self::StrUuid,
232            "MD5" => Self::Md5,
233            "SHA1" => Self::Sha1,
234            "SHA256" => Self::Sha256,
235            "SHA384" => Self::Sha384,
236            "SHA512" => Self::Sha512,
237            "STRLANG" => Self::StrLang,
238            "STRDT" => Self::StrDt,
239            "isIRI" => Self::IsIri,
240            "isBLANK" => Self::IsBlank,
241            "isLITERAL" => Self::IsLiteral,
242            "isNUMERIC" => Self::IsNumeric,
243            "REGEX" => Self::Regex,
244            "IF" => Self::If,
245            "SAMETERM" => Self::SameTerm,
246            "EQ" => Self::Equal,
247            "GT" => Self::GreaterThan,
248            "GEQ" => Self::GreaterOrEqual,
249            "LT" => Self::LessThan,
250            "LEQ" => Self::LessOrEqual,
251            "ADD" => Self::Add,
252            "DIV" => Self::Div,
253            "MUL" => Self::Mul,
254            "SUB" => Self::Sub,
255            "xsd:string" => Self::CastString,
256            "xsd:integer" => Self::CastInteger,
257            "xsd:int" => Self::AsInt,
258            "xsd:float" => Self::CastFloat,
259            "xsd:double" => Self::CastDouble,
260            "xsd:decimal" => Self::CastDecimal,
261            "xsd:dataTime" => Self::CastDateTime,
262            "xsd:boolean" => Self::CastBoolean,
263            "EBV" => Self::EffectiveBooleanValue,
264            "BOOLEAN_AS_TERM" => Self::NativeBooleanAsTerm,
265            "INT64_AS_TERM" => Self::NativeInt64AsTerm,
266            "BOUND" => Self::Bound,
267            "IS_COMPATIBLE" => Self::IsCompatible,
268            "COALESCE" => Self::Coalesce,
269            "MINUS" => Self::UnaryMinus,
270            "PLUS" => Self::UnaryPlus,
271            "SUM" => Self::Sum,
272            "MIN" => Self::Min,
273            "MAX" => Self::Max,
274            "AVG" => Self::Avg,
275            "GROUP_CONCAT" => Self::GroupConcat,
276            "ENC_SORT" => Self::WithSortableEncoding,
277            "ENC_TV" => Self::WithTypedValueEncoding,
278            "ENV_PT" => Self::WithPlainTermEncoding,
279            _ => return Err(NotABuiltInError {}),
280        })
281    }
282}