const NUM_SUPPORTED_STATS_PER_COLUMN: i32 = 200;
const STATS_SPACE_FIELD_ID_START_FOR_DATA_FIELDS: i32 = 10_000;
const STATS_SPACE_FIELD_ID_START_FOR_METADATA_FIELDS: i32 = 9_000;
const STATS_SPACE_FIELD_ID_END: i32 = 200_000_000;
const MAX_DATA_STATS_FIELD_ID: i32 = STATS_SPACE_FIELD_ID_END - NUM_SUPPORTED_STATS_PER_COLUMN;
const MAX_DATA_FIELD_ID: i32 = (MAX_DATA_STATS_FIELD_ID
- STATS_SPACE_FIELD_ID_START_FOR_DATA_FIELDS)
/ NUM_SUPPORTED_STATS_PER_COLUMN;
const LAST_UPDATED_SEQUENCE_NUMBER_FIELD_ID: i32 = 2_147_483_539;
const ROW_ID_FIELD_ID: i32 = 2_147_483_540;
const SUPPORTED_METADATA_FIELD_IDS: [i32; 2] =
[LAST_UPDATED_SEQUENCE_NUMBER_FIELD_ID, ROW_ID_FIELD_ID];
const FIRST_SUPPORTED_METADATA_FIELD_ID: i32 = SUPPORTED_METADATA_FIELD_IDS[0];
struct StatsSpace {
start: i32,
field_base: i32,
}
impl StatsSpace {
const fn base(&self, field_id: i32) -> i32 {
self.start + NUM_SUPPORTED_STATS_PER_COLUMN * (field_id - self.field_base)
}
}
const METADATA_SPACE: StatsSpace = StatsSpace {
start: STATS_SPACE_FIELD_ID_START_FOR_METADATA_FIELDS,
field_base: FIRST_SUPPORTED_METADATA_FIELD_ID,
};
const DATA_SPACE: StatsSpace = StatsSpace {
start: STATS_SPACE_FIELD_ID_START_FOR_DATA_FIELDS,
field_base: 0,
};
#[allow(dead_code)]
pub(crate) fn field_id_to_statistics_base(field_id: i32) -> Option<i32> {
if SUPPORTED_METADATA_FIELD_IDS.contains(&field_id) {
Some(METADATA_SPACE.base(field_id))
} else if (0..=MAX_DATA_FIELD_ID).contains(&field_id) {
Some(DATA_SPACE.base(field_id))
} else {
None
}
}
#[cfg(test)]
mod tests {
use rstest::rstest;
use super::*;
#[rstest]
#[case(0, 10_000)]
#[case(1, 10_200)]
#[case(2, 10_400)]
#[case(5, 11_000)]
#[case(100, 30_000)]
#[case(MAX_DATA_FIELD_ID, MAX_DATA_STATS_FIELD_ID)]
#[case(LAST_UPDATED_SEQUENCE_NUMBER_FIELD_ID, 9_000)]
#[case(ROW_ID_FIELD_ID, 9_200)]
fn valid_mapping_roundtrips(#[case] field_id: i32, #[case] stats_base: i32) {
assert_eq!(field_id_to_statistics_base(field_id), Some(stats_base));
}
#[rstest]
#[case(-1)] #[case(MAX_DATA_FIELD_ID + 1)] #[case(2_147_483_541)] #[case(2_147_483_645)] #[case(2_147_483_646)] fn field_id_to_statistics_base_rejects_invalid(#[case] field_id: i32) {
assert_eq!(field_id_to_statistics_base(field_id), None);
}
}