shacl_validation/constraints/core/cardinality/
min_count.rs1use crate::constraints::constraint_error::ConstraintError;
2use crate::constraints::NativeValidator;
3use crate::constraints::SparqlValidator;
4use crate::constraints::Validator;
5use crate::engine::native::NativeEngine;
6use crate::engine::sparql::SparqlEngine;
7use crate::engine::Engine;
8use crate::focus_nodes::FocusNodes;
9use crate::helpers::constraint::validate_with;
10use crate::validation_report::result::ValidationResult;
11use crate::value_nodes::FocusNodeIteration;
12use crate::value_nodes::ValueNodes;
13
14use shacl_ast::compiled::component::CompiledComponent;
15use shacl_ast::compiled::component::MinCount;
16use shacl_ast::compiled::shape::CompiledShape;
17use srdf::Query;
18use srdf::Rdf;
19use srdf::Sparql;
20use std::fmt::Debug;
21
22impl<S: Rdf + Debug> Validator<S> for MinCount {
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 println!("Validating minCount with shape {}", shape.id());
33 if self.min_count() == 0 {
34 return Ok(Default::default());
36 }
37 let min_count = |targets: &FocusNodes<S>| targets.len() < self.min_count();
38 validate_with(component, shape, value_nodes, FocusNodeIteration, min_count)
39 }
40}
41
42impl<S: Query + Debug + 'static> NativeValidator<S> for MinCount {
43 fn validate_native(
44 &self,
45 component: &CompiledComponent<S>,
46 shape: &CompiledShape<S>,
47 store: &S,
48 value_nodes: &ValueNodes<S>,
49 source_shape: Option<&CompiledShape<S>>,
50 ) -> Result<Vec<ValidationResult>, ConstraintError> {
51 println!("Validate native minCount with shape: {}", shape.id());
52 self.validate(
53 component,
54 shape,
55 store,
56 NativeEngine,
57 value_nodes,
58 source_shape,
59 )
60 }
61}
62
63impl<S: Sparql + Debug + 'static> SparqlValidator<S> for MinCount {
64 fn validate_sparql(
65 &self,
66 component: &CompiledComponent<S>,
67 shape: &CompiledShape<S>,
68 store: &S,
69 value_nodes: &ValueNodes<S>,
70 source_shape: Option<&CompiledShape<S>>,
71 ) -> Result<Vec<ValidationResult>, ConstraintError> {
72 self.validate(
73 component,
74 shape,
75 store,
76 SparqlEngine,
77 value_nodes,
78 source_shape,
79 )
80 }
81}