shacl_validation/constraints/core/logical/
and.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::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}