rdf_fusion_functions/scalar/strings/
struuid.rs1use crate::scalar::sparql_op_impl::{
2 ScalarSparqlOpImpl, create_typed_value_sparql_op_impl,
3};
4use crate::scalar::{ScalarSparqlOp, ScalarSparqlOpSignature, SparqlOpArity};
5use datafusion::logical_expr::ColumnarValue;
6use rdf_fusion_encoding::typed_value::TypedValueEncoding;
7use rdf_fusion_encoding::typed_value::encoders::DefaultTypedValueEncoder;
8use rdf_fusion_encoding::{EncodingArray, TermEncoder};
9use rdf_fusion_extensions::functions::BuiltinName;
10use rdf_fusion_extensions::functions::FunctionName;
11use rdf_fusion_model::{SimpleLiteral, TypedValue};
12use uuid::Uuid;
13
14#[derive(Debug, Hash, PartialEq, Eq)]
15pub struct StrUuidSparqlOp;
16
17impl Default for StrUuidSparqlOp {
18 fn default() -> Self {
19 Self::new()
20 }
21}
22
23impl StrUuidSparqlOp {
24 const NAME: FunctionName = FunctionName::Builtin(BuiltinName::StrUuid);
25
26 pub fn new() -> Self {
27 Self {}
28 }
29}
30
31impl ScalarSparqlOp for StrUuidSparqlOp {
32 fn name(&self) -> &FunctionName {
33 &Self::NAME
34 }
35
36 fn signature(&self) -> ScalarSparqlOpSignature {
37 ScalarSparqlOpSignature::default_with_arity(SparqlOpArity::Nullary)
38 }
39
40 fn typed_value_encoding_op(
41 &self,
42 ) -> Option<Box<dyn ScalarSparqlOpImpl<TypedValueEncoding>>> {
43 Some(create_typed_value_sparql_op_impl(|args| {
44 let values = (0..args.number_rows)
45 .map(|_| {
46 let result = Uuid::new_v4().to_string();
47 TypedValue::SimpleLiteral(SimpleLiteral { value: result })
48 })
49 .collect::<Vec<_>>();
50 let array = DefaultTypedValueEncoder::encode_terms(
51 values.iter().map(|result| Ok(result.as_ref())),
52 )?;
53 Ok(ColumnarValue::Array(array.into_array()))
54 }))
55 }
56}