rdf_fusion_functions/scalar/comparison/
less_or_equal.rs1use crate::scalar::dispatch::dispatch_binary_typed_value;
2use crate::scalar::sparql_op_impl::{
3 ScalarSparqlOpImpl, create_typed_value_sparql_op_impl,
4};
5use crate::scalar::{ScalarSparqlOp, ScalarSparqlOpSignature, SparqlOpArity};
6use rdf_fusion_encoding::typed_value::TypedValueEncoding;
7use rdf_fusion_extensions::functions::BuiltinName;
8use rdf_fusion_extensions::functions::FunctionName;
9use rdf_fusion_model::{ThinError, TypedValueRef};
10use std::cmp::Ordering;
11
12#[derive(Debug, Hash, PartialEq, Eq)]
14pub struct LessOrEqualSparqlOp;
15
16impl Default for LessOrEqualSparqlOp {
17 fn default() -> Self {
18 Self::new()
19 }
20}
21
22impl LessOrEqualSparqlOp {
23 const NAME: FunctionName = FunctionName::Builtin(BuiltinName::LessOrEqual);
24
25 pub fn new() -> Self {
27 Self {}
28 }
29}
30
31impl ScalarSparqlOp for LessOrEqualSparqlOp {
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 typed_value_encoding_op(
41 &self,
42 ) -> Option<Box<dyn ScalarSparqlOpImpl<TypedValueEncoding>>> {
43 Some(create_typed_value_sparql_op_impl(|args| {
44 dispatch_binary_typed_value(
45 &args.args[0],
46 &args.args[1],
47 |lhs_value, rhs_value| {
48 lhs_value
49 .partial_cmp(&rhs_value)
50 .map(|o| [Ordering::Equal, Ordering::Less].contains(&o))
51 .map(Into::into)
52 .map(TypedValueRef::BooleanLiteral)
53 .ok_or(ThinError::ExpectedError)
54 },
55 |_, _| ThinError::expected(),
56 )
57 }))
58 }
59}