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