use crate::hierarchy::deltas::{CompanyDelta, PlatoonDelta, SquadDelta};
use crate::hierarchy::storage_trait::{DocumentMetrics, SummaryStorage};
use crate::Result;
use peat_schema::hierarchy::v1::{CompanySummary, PlatoonSummary, SquadSummary};
use std::sync::Arc;
use tracing::instrument;
pub struct HierarchicalAggregator {
storage: Arc<dyn SummaryStorage>,
}
impl HierarchicalAggregator {
pub fn new(storage: Arc<dyn SummaryStorage>) -> Self {
Self { storage }
}
#[instrument(skip(self, initial_state), fields(squad_id))]
pub async fn create_squad_summary(
&self,
squad_id: &str,
initial_state: &SquadSummary,
) -> Result<String> {
self.storage
.create_squad_summary(squad_id, initial_state)
.await
}
#[instrument(skip(self, delta), fields(squad_id))]
pub async fn update_squad_summary(&self, squad_id: &str, delta: SquadDelta) -> Result<()> {
self.storage.update_squad_summary(squad_id, delta).await
}
#[instrument(skip(self), fields(squad_id))]
pub async fn get_squad_summary(&self, squad_id: &str) -> Result<Option<SquadSummary>> {
self.storage.get_squad_summary(squad_id).await
}
#[instrument(skip(self, initial_state), fields(platoon_id))]
pub async fn create_platoon_summary(
&self,
platoon_id: &str,
initial_state: &PlatoonSummary,
) -> Result<String> {
self.storage
.create_platoon_summary(platoon_id, initial_state)
.await
}
#[instrument(skip(self, delta), fields(platoon_id))]
pub async fn update_platoon_summary(
&self,
platoon_id: &str,
delta: PlatoonDelta,
) -> Result<()> {
self.storage.update_platoon_summary(platoon_id, delta).await
}
#[instrument(skip(self), fields(platoon_id))]
pub async fn get_platoon_summary(&self, platoon_id: &str) -> Result<Option<PlatoonSummary>> {
self.storage.get_platoon_summary(platoon_id).await
}
#[instrument(skip(self, initial_state), fields(company_id))]
pub async fn create_company_summary(
&self,
company_id: &str,
initial_state: &CompanySummary,
) -> Result<String> {
self.storage
.create_company_summary(company_id, initial_state)
.await
}
#[instrument(skip(self, delta), fields(company_id))]
pub async fn update_company_summary(
&self,
company_id: &str,
delta: CompanyDelta,
) -> Result<()> {
self.storage.update_company_summary(company_id, delta).await
}
#[instrument(skip(self), fields(company_id))]
pub async fn get_company_summary(&self, company_id: &str) -> Result<Option<CompanySummary>> {
self.storage.get_company_summary(company_id).await
}
#[instrument(skip(self), fields(doc_id))]
pub async fn get_document_metrics(&self, doc_id: &str) -> Result<DocumentMetrics> {
self.storage.get_document_metrics(doc_id).await
}
#[instrument(skip(self), fields(doc_id))]
pub async fn validate_document(&self, doc_id: &str) -> Result<()> {
let metrics = self.get_document_metrics(doc_id).await?;
metrics.validate()
}
#[deprecated(note = "Use create_squad_summary() once, then update_squad_summary() for updates")]
#[instrument(skip(self, summary), fields(squad_id))]
pub async fn upsert_squad_summary(
&self,
squad_id: &str,
summary: &SquadSummary,
) -> Result<String> {
match self.get_squad_summary(squad_id).await? {
Some(_existing) => {
Ok(format!("{}-summary", squad_id))
}
None => {
self.create_squad_summary(squad_id, summary).await
}
}
}
#[deprecated(
note = "Use create_platoon_summary() once, then update_platoon_summary() for updates"
)]
#[instrument(skip(self, summary), fields(platoon_id))]
pub async fn upsert_platoon_summary(
&self,
platoon_id: &str,
summary: &PlatoonSummary,
) -> Result<String> {
match self.get_platoon_summary(platoon_id).await? {
Some(_existing) => Ok(format!("{}-summary", platoon_id)),
None => self.create_platoon_summary(platoon_id, summary).await,
}
}
#[doc(hidden)]
pub fn storage(&self) -> &Arc<dyn SummaryStorage> {
&self.storage
}
}
#[cfg(test)]
mod tests {
#[test]
fn test_coordinator_creation() {
}
}