shacl_validation/constraints/core/logical/
or.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::CompiledComponent;
17use shacl_ast::compiled::component::Or;
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 Or<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 or = |value_node: &S::Term| {
35            self.shapes()
36                .iter()
37                .any(|shape| {
38                    match shape.validate(
39                        store,
40                        &engine,
41                        Some(&FocusNodes::new(std::iter::once(value_node.clone()))),
42                        Some(shape),
43                    ) {
44                        Ok(validation_results) => validation_results.is_empty(),
45                        Err(_) => false,
46                    }
47                })
48                .not()
49        };
50
51        validate_with(component, shape, value_nodes, ValueNodeIteration, or)
52    }
53}
54
55impl<S: Query + Debug + 'static> NativeValidator<S> for Or<S> {
56    fn validate_native(
57        &self,
58        component: &CompiledComponent<S>,
59        shape: &CompiledShape<S>,
60        store: &S,
61        value_nodes: &ValueNodes<S>,
62        source_shape: Option<&CompiledShape<S>>,
63    ) -> Result<Vec<ValidationResult>, ConstraintError> {
64        self.validate(
65            component,
66            shape,
67            store,
68            NativeEngine,
69            value_nodes,
70            source_shape,
71        )
72    }
73}
74
75impl<S: Sparql + Debug + 'static> SparqlValidator<S> for Or<S> {
76    fn validate_sparql(
77        &self,
78        component: &CompiledComponent<S>,
79        shape: &CompiledShape<S>,
80        store: &S,
81        value_nodes: &ValueNodes<S>,
82        source_shape: Option<&CompiledShape<S>>,
83    ) -> Result<Vec<ValidationResult>, ConstraintError> {
84        self.validate(
85            component,
86            shape,
87            store,
88            SparqlEngine,
89            value_nodes,
90            source_shape,
91        )
92    }
93}