use ontologos_bridge::{
materialize_with_session, take_reasonable_session, MaterializeOutcome, MergeLimits,
};
use ontologos_core::{Ontology, Profile, Reasoner};
use crate::report::MaterializationReport;
#[derive(Debug, Default)]
pub struct RdfsEngine {
_record_traces: bool,
merge_limits: MergeLimits,
}
impl RdfsEngine {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn with_traces(mut self, enabled: bool) -> Self {
self._record_traces = enabled;
self
}
#[must_use]
pub fn with_merge_limits(mut self, limits: MergeLimits) -> Self {
self.merge_limits = limits;
self
}
pub fn materialize(&self, ontology: &mut Ontology) -> crate::Result<MaterializationReport> {
let initial_axiom_count = ontology.axiom_count();
let (outcome, _) = materialize_with_session(
ontology,
ontologos_bridge::ReasonableSession::new_for_profile(Profile::Rdfs),
false,
self.merge_limits,
)
.map_err(|boxed| crate::Error::Bridge(boxed.0))?;
Ok(report_from_outcome(
initial_axiom_count,
ontology.axiom_count(),
outcome,
))
}
pub fn materialize_with_reasoner(
&self,
reasoner: &mut Reasoner,
) -> crate::Result<MaterializationReport> {
let initial_axiom_count = reasoner.ontology().axiom_count();
let incremental = reasoner.config().incremental;
let session = take_reasonable_session(reasoner, Profile::Rdfs);
match materialize_with_session(
reasoner.ontology_mut(),
session,
incremental,
self.merge_limits,
) {
Ok((outcome, session)) => {
reasoner.set_session(Box::new(session));
Ok(report_from_outcome(
initial_axiom_count,
reasoner.ontology().axiom_count(),
outcome,
))
}
Err(boxed) => {
let (e, session) = *boxed;
reasoner.set_session(Box::new(session));
Err(crate::Error::Bridge(e))
}
}
}
}
fn report_from_outcome(
initial_axiom_count: usize,
final_axiom_count: usize,
outcome: MaterializeOutcome,
) -> MaterializationReport {
MaterializationReport {
initial_axiom_count,
final_axiom_count,
inferred_by_rule: std::collections::BTreeMap::new(),
trace: ontologos_core::InferenceTrace::new(),
clashes: outcome.merge.clashes,
}
}