shacl_validation/constraints/core/logical/
or.rs1use 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}