shacl_validation/constraints/core/other/
has_value.rs1use 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}