trine-kv 0.5.13

Embedded LSM MVCC key-value database.
Documentation
use super::{
    BTreeMap, CompactionTrigger, CompactionTriggerStats, NamedCompactionInput,
    NamedCompactionOutput, usize_to_u64_saturating,
};

pub(in crate::db) fn compaction_trigger_stat_deltas(
    inputs: &[NamedCompactionInput],
    outputs: &[NamedCompactionOutput],
) -> Vec<CompactionTriggerStats> {
    let mut triggers = BTreeMap::<CompactionTrigger, CompactionTriggerStats>::new();
    for input in inputs {
        let entry = triggers
            .entry(input.input.trigger)
            .or_insert_with(|| empty_compaction_trigger_stats(input.input.trigger));
        entry.runs = entry.runs.saturating_add(1);
        entry.input_tables = entry
            .input_tables
            .saturating_add(usize_to_u64_saturating(input.input.input_tables.len()));
        entry.input_bytes = entry.input_bytes.saturating_add(
            input
                .input
                .input_tables
                .iter()
                .map(|table| table.estimated_file_bytes())
                .sum::<u64>(),
        );
    }
    for output in outputs {
        let Some(trigger) = output.trigger else {
            continue;
        };
        let entry = triggers
            .entry(trigger)
            .or_insert_with(|| empty_compaction_trigger_stats(trigger));
        entry.output_tables = entry
            .output_tables
            .saturating_add(usize_to_u64_saturating(output.output.tables.len()));
        entry.output_bytes = entry.output_bytes.saturating_add(
            output
                .output
                .tables
                .iter()
                .map(|table| table.estimated_file_bytes())
                .sum::<u64>(),
        );
    }
    triggers.into_values().collect()
}

pub(in crate::db) const fn empty_compaction_trigger_stats(
    trigger: CompactionTrigger,
) -> CompactionTriggerStats {
    CompactionTriggerStats {
        trigger,
        runs: 0,
        input_tables: 0,
        output_tables: 0,
        input_bytes: 0,
        output_bytes: 0,
    }
}