shacl_validation/constraints/core/cardinality/
max_count.rs

1use shacl_ast::compiled::component::CompiledComponent;
2use shacl_ast::compiled::component::MaxCount;
3use shacl_ast::compiled::shape::CompiledShape;
4use srdf::Query;
5use srdf::Rdf;
6use srdf::Sparql;
7use std::fmt::Debug;
8
9use crate::constraints::constraint_error::ConstraintError;
10use crate::constraints::NativeValidator;
11use crate::constraints::SparqlValidator;
12use crate::constraints::Validator;
13use crate::engine::native::NativeEngine;
14use crate::engine::sparql::SparqlEngine;
15use crate::engine::Engine;
16use crate::focus_nodes::FocusNodes;
17use crate::helpers::constraint::validate_with;
18use crate::validation_report::result::ValidationResult;
19use crate::value_nodes::FocusNodeIteration;
20use crate::value_nodes::ValueNodes;
21
22impl<S: Rdf + Debug> Validator<S> for MaxCount {
23    fn validate(
24        &self,
25        component: &CompiledComponent<S>,
26        shape: &CompiledShape<S>,
27        _: &S,
28        _: impl Engine<S>,
29        value_nodes: &ValueNodes<S>,
30        _source_shape: Option<&CompiledShape<S>>,
31    ) -> Result<Vec<ValidationResult>, ConstraintError> {
32        let max_count = |targets: &FocusNodes<S>| targets.len() > self.max_count();
33        validate_with(component, shape, value_nodes, FocusNodeIteration, max_count)
34    }
35}
36
37impl<S: Query + Debug + 'static> NativeValidator<S> for MaxCount {
38    fn validate_native(
39        &self,
40        component: &CompiledComponent<S>,
41        shape: &CompiledShape<S>,
42        store: &S,
43        value_nodes: &ValueNodes<S>,
44        source_shape: Option<&CompiledShape<S>>,
45    ) -> Result<Vec<ValidationResult>, ConstraintError> {
46        self.validate(
47            component,
48            shape,
49            store,
50            NativeEngine,
51            value_nodes,
52            source_shape,
53        )
54    }
55}
56
57impl<S: Sparql + Debug + 'static> SparqlValidator<S> for MaxCount {
58    fn validate_sparql(
59        &self,
60        component: &CompiledComponent<S>,
61        shape: &CompiledShape<S>,
62        store: &S,
63        value_nodes: &ValueNodes<S>,
64        source_shape: Option<&CompiledShape<S>>,
65    ) -> Result<Vec<ValidationResult>, ConstraintError> {
66        self.validate(
67            component,
68            shape,
69            store,
70            SparqlEngine,
71            value_nodes,
72            source_shape,
73        )
74    }
75}