use std::collections::HashMap;
use linkrs_config::{RuntimeConfig, StorageCostProfile};
use linkrs_query::optimizer::CostModelConfig;
pub fn cost_config_for_profile(profile: StorageCostProfile) -> CostModelConfig {
match profile {
StorageCostProfile::Hdd => CostModelConfig::for_hdd(),
StorageCostProfile::Ssd | StorageCostProfile::Auto => CostModelConfig::for_ssd(),
StorageCostProfile::Memory => CostModelConfig::for_in_memory(),
}
}
pub fn resolve_space_cost_configs(
profiles: &HashMap<String, StorageCostProfile>,
runtime: &RuntimeConfig,
) -> (HashMap<String, CostModelConfig>, HashMap<String, String>) {
let mut configs = HashMap::with_capacity(profiles.len());
let mut labels = HashMap::with_capacity(profiles.len());
for (space, profile) in profiles {
let resolved = profile.resolve_for_runtime(runtime);
configs.insert(space.clone(), cost_config_for_profile(resolved));
labels.insert(space.clone(), format!("{resolved:?}"));
}
(configs, labels)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn presets_map_to_matching_cost_configs() {
assert_eq!(
cost_config_for_profile(StorageCostProfile::Hdd).random_page_cost,
CostModelConfig::for_hdd().random_page_cost
);
assert_eq!(
cost_config_for_profile(StorageCostProfile::Ssd).random_page_cost,
CostModelConfig::for_ssd().random_page_cost
);
assert_eq!(
cost_config_for_profile(StorageCostProfile::Memory).random_page_cost,
CostModelConfig::for_in_memory().random_page_cost
);
}
#[test]
fn auto_maps_to_ssd_default() {
assert_eq!(
cost_config_for_profile(StorageCostProfile::Auto).random_page_cost,
CostModelConfig::for_ssd().random_page_cost
);
}
}