shacl_validation/constraints/core/value_range/
min_inclusive.rs

1use crate::constraints::constraint_error::ConstraintError;
2use crate::constraints::NativeValidator;
3use crate::constraints::SparqlValidator;
4use crate::helpers::constraint::validate_ask_with;
5use crate::validation_report::result::ValidationResult;
6use crate::value_nodes::ValueNodes;
7use indoc::formatdoc;
8use shacl_ast::compiled::component::CompiledComponent;
9use shacl_ast::compiled::component::MinInclusive;
10use shacl_ast::compiled::shape::CompiledShape;
11use srdf::Query;
12use srdf::Sparql;
13use std::fmt::Debug;
14
15impl<S: Query + Debug + 'static> NativeValidator<S> for MinInclusive<S> {
16    fn validate_native(
17        &self,
18        _component: &CompiledComponent<S>,
19        _shape: &CompiledShape<S>,
20        _store: &S,
21        _value_nodes: &ValueNodes<S>,
22        _source_shape: Option<&CompiledShape<S>>,
23    ) -> Result<Vec<ValidationResult>, ConstraintError> {
24        Err(ConstraintError::NotImplemented("MinInclusive".to_string()))
25    }
26}
27
28impl<S: Sparql + Debug + 'static> SparqlValidator<S> for MinInclusive<S> {
29    fn validate_sparql(
30        &self,
31        component: &CompiledComponent<S>,
32        shape: &CompiledShape<S>,
33        store: &S,
34        value_nodes: &ValueNodes<S>,
35        _source_shape: Option<&CompiledShape<S>>,
36    ) -> Result<Vec<ValidationResult>, ConstraintError> {
37        let min_inclusive_value = self.min_inclusive().clone();
38
39        let query = |value_node: &S::Term| {
40            formatdoc! {
41                " ASK {{ FILTER ({} <= {}) }} ",
42                value_node, min_inclusive_value
43            }
44        };
45
46        validate_ask_with(component, shape, store, value_nodes, query)
47    }
48}