#[cfg(feature = "sparql")]
mod endpoint;
mod graph;
#[cfg(feature = "sparql")]
mod rdf_data;
use crate::error::ValidationError;
use crate::ir::IRSchema;
use crate::validator::ShaclValidationMode;
use crate::validator::engine::{Engine, Validate};
use crate::validator::report::ValidationReport;
#[cfg(feature = "sparql")]
pub use endpoint::EndpointValidation;
pub use graph::GraphValidation;
use rayon::prelude::*;
#[cfg(feature = "sparql")]
pub use rdf_data::DataValidation;
use rudof_rdf::rdf_core::NeighsRDF;
use std::fmt::Debug;
pub trait ShaclProcessor<S: NeighsRDF + Debug + Send + Sync> {
fn store(&self) -> &S;
fn runner(mode: &ShaclValidationMode) -> Box<dyn Engine<S>>;
fn validate(
&mut self,
shapes_graph: &IRSchema,
mode: &ShaclValidationMode,
) -> Result<ValidationReport, ValidationError> {
let store = self.store();
let mut master_runner = Self::runner(mode);
master_runner.build_indexes(store)?;
let levels = shapes_graph.shapes_with_targets_by_level();
let mut all_results = Vec::new();
for level in levels {
let mut forked_runners: Vec<Box<dyn Engine<S>>> = level.iter().map(|_| master_runner.fork()).collect();
let level_results: Vec<Result<Vec<_>, ValidationError>> = forked_runners
.par_iter_mut()
.zip(level.par_iter())
.map(|(runner, idx)| {
let shape = shapes_graph
.get_shape_from_idx(idx)
.expect("Internal error: shape index not found in schema");
shape.validate(store, runner.as_mut(), None, Some(shape), shapes_graph)
})
.collect();
for result in level_results {
all_results.extend(result?);
}
}
let mut pm = shapes_graph.prefix_map().clone();
if let Some(store_pm) = store.prefixmap() {
pm.merge(store_pm);
}
Ok(ValidationReport::new().with_results(all_results).with_prefixmap(pm))
}
}