knowledge_base_crud/entity/statement/
apply.rs1use super::planner::StatementPlanner;
2use super::{ApplyMode, ApplyStatementsOutcome, StatementBatch, StatementResultStatus, validate_batch};
3use crate::Error;
4use crate::entity::Entities;
5use crate::mutation::{MutationLock, commit, validate_staged};
6
7impl Entities<'_> {
8 pub fn apply_statements(&self, batch: &StatementBatch, mode: ApplyMode) -> Result<ApplyStatementsOutcome, Error> {
9 validate_batch(batch)?;
10 let _lock = MutationLock::acquire(self.knowledge_base.root())?;
11
12 let baseline = self.knowledge_base.validate();
13 if !baseline.is_empty() {
14 return Err(Error::Validation(baseline));
15 }
16
17 let plan = StatementPlanner::new(self.knowledge_base.root(), batch).plan()?;
18 validate_staged(self.knowledge_base.root(), &plan.edits, self.knowledge_base.additional_validators())?;
19
20 if !plan.all_new() {
21 return Ok(ApplyStatementsOutcome::NotApplied(plan.results));
22 }
23 if mode == ApplyMode::Preview {
24 return Ok(ApplyStatementsOutcome::Previewed(plan.results));
25 }
26
27 commit(&plan.edits)?;
28 let mut results = plan.results;
29 for result in &mut results {
30 debug_assert_eq!(result.status, StatementResultStatus::WouldAdd);
31 result.status = StatementResultStatus::Added;
32 }
33 Ok(ApplyStatementsOutcome::Applied(results))
34 }
35}