shacl_validation/constraints/core/cardinality/
min_count.rs

1use 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            // If min_count is 0, then it always passes
35            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}