linkrs_api/api_core/
cost_profile.rs1use std::collections::HashMap;
9
10use linkrs_config::{RuntimeConfig, StorageCostProfile};
11use linkrs_query::optimizer::CostModelConfig;
12
13pub fn cost_config_for_profile(profile: StorageCostProfile) -> CostModelConfig {
18 match profile {
19 StorageCostProfile::Hdd => CostModelConfig::for_hdd(),
20 StorageCostProfile::Ssd | StorageCostProfile::Auto => CostModelConfig::for_ssd(),
21 StorageCostProfile::Memory => CostModelConfig::for_in_memory(),
22 }
23}
24
25pub fn resolve_space_cost_configs(
32 profiles: &HashMap<String, StorageCostProfile>,
33 runtime: &RuntimeConfig,
34) -> (HashMap<String, CostModelConfig>, HashMap<String, String>) {
35 let mut configs = HashMap::with_capacity(profiles.len());
36 let mut labels = HashMap::with_capacity(profiles.len());
37 for (space, profile) in profiles {
38 let resolved = profile.resolve_for_runtime(runtime);
39 configs.insert(space.clone(), cost_config_for_profile(resolved));
40 labels.insert(space.clone(), format!("{resolved:?}"));
41 }
42 (configs, labels)
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48
49 #[test]
50 fn presets_map_to_matching_cost_configs() {
51 assert_eq!(
52 cost_config_for_profile(StorageCostProfile::Hdd).random_page_cost,
53 CostModelConfig::for_hdd().random_page_cost
54 );
55 assert_eq!(
56 cost_config_for_profile(StorageCostProfile::Ssd).random_page_cost,
57 CostModelConfig::for_ssd().random_page_cost
58 );
59 assert_eq!(
60 cost_config_for_profile(StorageCostProfile::Memory).random_page_cost,
61 CostModelConfig::for_in_memory().random_page_cost
62 );
63 }
64
65 #[test]
66 fn auto_maps_to_ssd_default() {
67 assert_eq!(
68 cost_config_for_profile(StorageCostProfile::Auto).random_page_cost,
69 CostModelConfig::for_ssd().random_page_cost
70 );
71 }
72}