pub struct AdmissionControl {
fanout_limit: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AdmissionDecision {
Algebraic,
MaterializedLookup,
}
impl AdmissionControl {
pub fn new(fanout_limit: usize) -> Self {
Self { fanout_limit }
}
pub fn check(&self, fan_out: usize) -> AdmissionDecision {
if fan_out <= self.fanout_limit {
AdmissionDecision::Algebraic
} else {
AdmissionDecision::MaterializedLookup
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fan_out_above_the_limit_uses_materialized_lookup() {
use AdmissionDecision::{Algebraic, MaterializedLookup};
for (limit, fan_out, expected) in [
(40, 1, Algebraic),
(40, 39, Algebraic),
(40, 40, Algebraic),
(40, 41, MaterializedLookup),
(40, 1000, MaterializedLookup),
(0, 0, Algebraic),
(0, 1, MaterializedLookup),
] {
assert_eq!(
AdmissionControl::new(limit).check(fan_out),
expected,
"limit {limit}, fan-out {fan_out}"
);
}
}
}