use crate::metric_primitive::MetricPrimitive; use crate::timestamp::Timestamp; use serde::Serialize; use std::collections::BTreeMap; /// Key type for the engine's primary index. Variant order matters: derived `Ord` compares the discriminant first, carving the map into contiguous ranges in declaration order (logs, params, metric declarations, buckets). #[allow(dead_code)] #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize)] pub enum IndexKey { /// Marker for the start of the whole range. Never inserted, only navigated to. Start, IngestedLog { sequence: u64, timestamp: Timestamp, }, /// Marker between the log range and the param range. LogParamSplit, ParamDeclaration { name: String, }, /// Marker between the param range and the metric declaration range. ParamMetricSplit, MetricDeclaration { name: String, }, /// Marker between metric declarations and their buckets. MetricBucketSplit, Bucket { metric_name: String, labels: BTreeMap, }, /// Internal bookkeeping tracking the last event timestamp per metric+label, so a `Duration` param's first occurrence (which pushes no `Bucket`) still lets the next occurrence compute elapsed time. LastMetricEvent { metric_name: String, labels: BTreeMap, }, /// Marker for the end of the whole range. Nothing sorts after this. End, }