shacl_validation/constraints/core/shape_based/
node.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::shape::Validate;
11use crate::validation_report::result::ValidationResult;
12use crate::value_nodes::ValueNodeIteration;
13use crate::value_nodes::ValueNodes;
14use shacl_ast::compiled::component::CompiledComponent;
15use shacl_ast::compiled::component::Node;
16use shacl_ast::compiled::shape::CompiledShape;
17use srdf::Query;
18use srdf::Rdf;
19use srdf::Sparql;
20use std::fmt::Debug;
21
22impl<S: Rdf + Debug> Validator<S> for Node<S> {
23 fn validate(
24 &self,
25 component: &CompiledComponent<S>,
26 shape: &CompiledShape<S>,
27 store: &S,
28 engine: impl Engine<S>,
29 value_nodes: &ValueNodes<S>,
30 _source_shape: Option<&CompiledShape<S>>,
31 ) -> Result<Vec<ValidationResult>, ConstraintError> {
32 let node = |value_node: &S::Term| {
33 let focus_nodes = FocusNodes::new(std::iter::once(value_node.clone()));
34 let inner_results =
35 self.shape()
36 .validate(store, &engine, Some(&focus_nodes), Some(self.shape()));
37 inner_results.is_err() || !inner_results.unwrap().is_empty()
38 };
39
40 validate_with(component, shape, value_nodes, ValueNodeIteration, node)
41 }
42}
43
44impl<S: Query + Debug + 'static> NativeValidator<S> for Node<S> {
45 fn validate_native(
46 &self,
47 component: &CompiledComponent<S>,
48 shape: &CompiledShape<S>,
49 store: &S,
50 value_nodes: &ValueNodes<S>,
51 source_shape: Option<&CompiledShape<S>>,
52 ) -> Result<Vec<ValidationResult>, ConstraintError> {
53 self.validate(
54 component,
55 shape,
56 store,
57 NativeEngine,
58 value_nodes,
59 source_shape,
60 )
61 }
62}
63
64impl<S: Sparql + Debug + 'static> SparqlValidator<S> for Node<S> {
65 fn validate_sparql(
66 &self,
67 component: &CompiledComponent<S>,
68 shape: &CompiledShape<S>,
69 store: &S,
70 value_nodes: &ValueNodes<S>,
71 source_shape: Option<&CompiledShape<S>>,
72 ) -> Result<Vec<ValidationResult>, ConstraintError> {
73 self.validate(
74 component,
75 shape,
76 store,
77 SparqlEngine,
78 value_nodes,
79 source_shape,
80 )
81 }
82}