Skip to main content

knowledge_base_crud/entity/statement/
apply.rs

1use 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}