rdf_fusion_functions/scalar/terms/
uuid.rs

1use 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, Volatility};
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::{NamedNode, TypedValue};
12use uuid::Uuid;
13
14#[derive(Debug, Hash, PartialEq, Eq)]
15pub struct UuidSparqlOp;
16
17impl Default for UuidSparqlOp {
18    fn default() -> Self {
19        Self::new()
20    }
21}
22
23impl UuidSparqlOp {
24    const NAME: FunctionName = FunctionName::Builtin(BuiltinName::Uuid);
25
26    pub fn new() -> Self {
27        Self {}
28    }
29}
30
31impl ScalarSparqlOp for UuidSparqlOp {
32    fn name(&self) -> &FunctionName {
33        &Self::NAME
34    }
35
36    fn signature(&self) -> ScalarSparqlOpSignature {
37        ScalarSparqlOpSignature {
38            volatility: Volatility::Volatile,
39            arity: SparqlOpArity::Nullary,
40        }
41    }
42
43    fn typed_value_encoding_op(
44        &self,
45    ) -> Option<Box<dyn ScalarSparqlOpImpl<TypedValueEncoding>>> {
46        Some(create_typed_value_sparql_op_impl(|args| {
47            let values = (0..args.number_rows)
48                .map(|_| {
49                    let formatted = format!("urn:uuid:{}", Uuid::new_v4());
50                    TypedValue::NamedNode(NamedNode::new_unchecked(formatted))
51                })
52                .collect::<Vec<_>>();
53            let array = DefaultTypedValueEncoder::encode_terms(
54                values.iter().map(|result| Ok(result.as_ref())),
55            )?;
56            Ok(ColumnarValue::Array(array.into_array()))
57        }))
58    }
59}