shacl_validation/constraints/core/other/
has_value.rs

1use crate::constraints::constraint_error::ConstraintError;
2use crate::constraints::NativeValidator;
3use crate::constraints::SparqlValidator;
4use crate::constraints::Validator;
5use crate::engine::native::NativeEngine;
6use crate::engine::sparql::SparqlEngine;
7use crate::engine::Engine;
8use crate::focus_nodes::FocusNodes;
9use crate::helpers::constraint::validate_with;
10use crate::validation_report::result::ValidationResult;
11use crate::value_nodes::FocusNodeIteration;
12use crate::value_nodes::ValueNodes;
13use shacl_ast::compiled::component::CompiledComponent;
14use shacl_ast::compiled::component::HasValue;
15use shacl_ast::compiled::shape::CompiledShape;
16use srdf::Query;
17use srdf::Rdf;
18use srdf::Sparql;
19use std::fmt::Debug;
20
21impl<S: Rdf + Debug> Validator<S> for HasValue<S> {
22    fn validate(
23        &self,
24        component: &CompiledComponent<S>,
25        shape: &CompiledShape<S>,
26        _: &S,
27        _: impl Engine<S>,
28        value_nodes: &ValueNodes<S>,
29        _source_shape: Option<&CompiledShape<S>>,
30    ) -> Result<Vec<ValidationResult>, ConstraintError> {
31        let has_value =
32            |targets: &FocusNodes<S>| !targets.iter().any(|value| value == self.value());
33        validate_with(component, shape, value_nodes, FocusNodeIteration, has_value)
34    }
35}
36
37impl<S: Query + Debug + 'static> NativeValidator<S> for HasValue<S> {
38    fn validate_native(
39        &self,
40        component: &CompiledComponent<S>,
41        shape: &CompiledShape<S>,
42        store: &S,
43        value_nodes: &ValueNodes<S>,
44        source_shape: Option<&CompiledShape<S>>,
45    ) -> Result<Vec<ValidationResult>, ConstraintError> {
46        self.validate(
47            component,
48            shape,
49            store,
50            NativeEngine,
51            value_nodes,
52            source_shape,
53        )
54    }
55}
56
57impl<S: Sparql + Debug + 'static> SparqlValidator<S> for HasValue<S> {
58    fn validate_sparql(
59        &self,
60        component: &CompiledComponent<S>,
61        shape: &CompiledShape<S>,
62        store: &S,
63        value_nodes: &ValueNodes<S>,
64        source_shape: Option<&CompiledShape<S>>,
65    ) -> Result<Vec<ValidationResult>, ConstraintError> {
66        self.validate(
67            component,
68            shape,
69            store,
70            SparqlEngine,
71            value_nodes,
72            source_shape,
73        )
74    }
75}