shacl_validation/constraints/core/cardinality/
max_count.rs1use 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}