shacl_validation/constraints/core/shape_based/
node.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::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}