use crate::metric_primitive::MetricPrimitive; use crate::timestamp::Timestamp; use serde::Serialize; use std::collections::BTreeMap; /// Key type for the engine's primary index. /// /// Variants are ordered top to bottom as declared (derived `Ord` compares the /// discriminant first), which is what carves the map into contiguous ranges: /// logs, then params, then metric declarations, then 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, }, /// Ticket 023: internal bookkeeping (never returned by a query) tracking /// the timestamp of the most recent counter event for one metric+label /// combination, independent of whether that event actually pushed a /// `Bucket` value — a `Duration`-kind `Value` param's *first* occurrence /// of a label set has no previous event to diff against and pushes no /// `Bucket` entry, but must still be recorded here so the *next* /// occurrence can compute its elapsed time. LastMetricEvent { metric_name: String, labels: BTreeMap, }, /// Marker for the end of the whole range. Nothing sorts after this. End, }