xlog-runtime 0.10.0

Runtime executor and relation store for XLOG
Documentation
use std::sync::{Mutex, OnceLock};

use xlog_core::{CostModelKind, RuntimeConfig};

fn cost_model_env_lock() -> &'static Mutex<()> {
    static LOCK: OnceLock<Mutex<()>> = OnceLock::new();
    LOCK.get_or_init(|| Mutex::new(()))
}

struct CostModelEnvSnapshot(Option<String>);

impl CostModelEnvSnapshot {
    fn capture_and_clear() -> Self {
        let prior = std::env::var("XLOG_WCOJ_COST_MODEL").ok();
        unsafe {
            std::env::remove_var("XLOG_WCOJ_COST_MODEL");
        }
        Self(prior)
    }
}

impl Drop for CostModelEnvSnapshot {
    fn drop(&mut self) {
        unsafe {
            match self.0.take() {
                Some(value) => std::env::set_var("XLOG_WCOJ_COST_MODEL", value),
                None => std::env::remove_var("XLOG_WCOJ_COST_MODEL"),
            }
        }
    }
}

fn with_cost_model_env<R>(f: impl FnOnce() -> R) -> R {
    let _guard = cost_model_env_lock()
        .lock()
        .expect("cost-model env lock poisoned");
    let _snapshot = CostModelEnvSnapshot::capture_and_clear();
    f()
}

#[test]
fn runtime_config_cardinality_is_default_cost_model() {
    with_cost_model_env(|| {
        assert_eq!(
            RuntimeConfig::default().resolved_wcoj_cost_model(),
            CostModelKind::Cardinality,
            "bare RuntimeConfig must select Cardinality by default"
        );
    });
}

#[test]
fn runtime_config_env_skew_opt_out_preserved() {
    with_cost_model_env(|| {
        unsafe {
            std::env::set_var("XLOG_WCOJ_COST_MODEL", "skew");
        }
        assert_eq!(
            RuntimeConfig::default().resolved_wcoj_cost_model(),
            CostModelKind::SkewClassifier,
            "XLOG_WCOJ_COST_MODEL=skew must preserve the explicit legacy opt-out"
        );
    });
}

#[test]
fn runtime_config_override_beats_env_cost_model() {
    with_cost_model_env(|| {
        unsafe {
            std::env::set_var("XLOG_WCOJ_COST_MODEL", "skew");
        }
        assert_eq!(
            RuntimeConfig::default()
                .with_wcoj_cost_model(Some(CostModelKind::Cardinality))
                .resolved_wcoj_cost_model(),
            CostModelKind::Cardinality,
            "explicit config override must stay higher precedence than env"
        );
    });
}