rdf_fusion_functions/scalar/comparison/
same_term.rs1use 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#[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 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}