rdf_fusion_functions/scalar/comparison/
same_term.rs

1use crate::scalar::dispatch::dispatch_binary_plain_term;
2use crate::scalar::sparql_op_impl::{
3    ScalarSparqlOpImpl, create_plain_term_sparql_op_impl,
4};
5use crate::scalar::{ScalarSparqlOp, ScalarSparqlOpSignature, SparqlOpArity};
6use rdf_fusion_encoding::plain_term::PlainTermEncoding;
7use rdf_fusion_extensions::functions::BuiltinName;
8use rdf_fusion_extensions::functions::FunctionName;
9use rdf_fusion_model::vocab::xsd;
10use rdf_fusion_model::{LiteralRef, TermRef, ThinError};
11
12/// Implementation of the SPARQL `SAME_TERM` operator.
13#[derive(Debug, Hash, PartialEq, Eq)]
14pub struct SameTermSparqlOp;
15
16impl Default for SameTermSparqlOp {
17    fn default() -> Self {
18        Self::new()
19    }
20}
21
22impl SameTermSparqlOp {
23    const NAME: FunctionName = FunctionName::Builtin(BuiltinName::SameTerm);
24
25    /// Creates a new [SameTermSparqlOp].
26    pub fn new() -> Self {
27        Self {}
28    }
29}
30
31impl ScalarSparqlOp for SameTermSparqlOp {
32    fn name(&self) -> &FunctionName {
33        &Self::NAME
34    }
35
36    fn signature(&self) -> ScalarSparqlOpSignature {
37        ScalarSparqlOpSignature::default_with_arity(SparqlOpArity::Fixed(2))
38    }
39
40    fn plain_term_encoding_op(
41        &self,
42    ) -> Option<Box<dyn ScalarSparqlOpImpl<PlainTermEncoding>>> {
43        Some(create_plain_term_sparql_op_impl(|args| {
44            dispatch_binary_plain_term(
45                &args.args[0],
46                &args.args[1],
47                |lhs_value, rhs_value| {
48                    let value = if lhs_value == rhs_value {
49                        "true"
50                    } else {
51                        "false"
52                    };
53                    Ok(TermRef::Literal(LiteralRef::new_typed_literal(
54                        value,
55                        xsd::BOOLEAN,
56                    )))
57                },
58                |_, _| ThinError::expected(),
59            )
60        }))
61    }
62}