shacl_validation/constraints/core/logical/
and.rs

1use std::ops::Not;
2
3use crate::constraints::constraint_error::ConstraintError;
4use crate::constraints::NativeValidator;
5use crate::constraints::SparqlValidator;
6use crate::constraints::Validator;
7use crate::engine::native::NativeEngine;
8use crate::engine::sparql::SparqlEngine;
9use crate::engine::Engine;
10use crate::focus_nodes::FocusNodes;
11use crate::helpers::constraint::validate_with;
12use crate::shape::Validate;
13use crate::validation_report::result::ValidationResult;
14use crate::value_nodes::ValueNodeIteration;
15use crate::value_nodes::ValueNodes;
16use shacl_ast::compiled::component::And;
17use shacl_ast::compiled::component::CompiledComponent;
18use shacl_ast::compiled::shape::CompiledShape;
19use srdf::Query;
20use srdf::Rdf;
21use srdf::Sparql;
22use std::fmt::Debug;
23
24impl<S: Rdf + Debug> Validator<S> for And<S> {
25    fn validate(
26        &self,
27        component: &CompiledComponent<S>,
28        shape: &CompiledShape<S>,
29        store: &S,
30        engine: impl Engine<S>,
31        value_nodes: &ValueNodes<S>,
32        _source_shape: Option<&CompiledShape<S>>,
33    ) -> Result<Vec<ValidationResult>, ConstraintError> {
34        let and = |value_node: &S::Term| {
35            self.shapes()
36                .iter()
37                .all(|shape| {
38                    let focus_nodes = FocusNodes::new(std::iter::once(value_node.clone()));
39                    match shape.validate(store, &engine, Some(&focus_nodes), Some(shape)) {
40                        Ok(results) => results.is_empty(),
41                        Err(_) => false,
42                    }
43                })
44                .not()
45        };
46
47        validate_with(component, shape, value_nodes, ValueNodeIteration, and)
48    }
49}
50
51impl<S: Query + Debug + 'static> NativeValidator<S> for And<S> {
52    fn validate_native(
53        &self,
54        component: &CompiledComponent<S>,
55        shape: &CompiledShape<S>,
56        store: &S,
57        value_nodes: &ValueNodes<S>,
58        source_shape: Option<&CompiledShape<S>>,
59    ) -> Result<Vec<ValidationResult>, ConstraintError> {
60        self.validate(
61            component,
62            shape,
63            store,
64            NativeEngine,
65            value_nodes,
66            source_shape,
67        )
68    }
69}
70
71impl<S: Sparql + Debug + 'static> SparqlValidator<S> for And<S> {
72    fn validate_sparql(
73        &self,
74        component: &CompiledComponent<S>,
75        shape: &CompiledShape<S>,
76        store: &S,
77        value_nodes: &ValueNodes<S>,
78        source_shape: Option<&CompiledShape<S>>,
79    ) -> Result<Vec<ValidationResult>, ConstraintError> {
80        self.validate(
81            component,
82            shape,
83            store,
84            SparqlEngine,
85            value_nodes,
86            source_shape,
87        )
88    }
89}